static GEN hex_read_more(GEN y, const char **ps) { pari_sp av = avma; int i = 0, nb; while (isxdigit((int)**ps)) { ulong m = hexnumber(&nb, ps); if (avma != av && ++i > 4) { avma = av; i = 0; } /* HACK gerepile */ y = addumului(m, 1UL << (nb*4), y); } return y; }
static GEN int_read(const char **s) { int nb; GEN y; if (isbin(s)) { y = utoi(binnumber(&nb, s)); if (nb == MAX_BDIGITS) y = bin_read_more(y, s); } else if (ishex(s)) { y = utoi(hexnumber(&nb, s)); if (nb == MAX_XDIGITS) y = hex_read_more(y, s); } else { y = int_read_dec(s); } return y; }
/* extensively modified 8/2/99 [email protected] - * see cmdtable.cpp for more details */ void cCommands::Command(UOXSOCKET s, string speech) // Client entred a '/' command like /ADD { int i=9; unsigned char *comm; unsigned char nonuni[512]; int y,loopexit=0; P_CHAR pc_currchar = MAKE_CHARREF_LR(currchar[s]); if (pc_currchar->unicode) cCommands::cmd_offset = 1; else cCommands::cmd_offset = 1; cCommands::command_line = speech; cCommands::params = cCommands::command_line.split(" "); strcpy((char*)nonuni, speech.c_str()); strcpy((char*)tbuffer, (char*)nonuni); strupr((char*)nonuni); cline = (char*) &nonuni[0]; splitline(); if (tnum<1) return; // Let's ignore the command prefix; comm = &nonuni[1]; i=0; y=-1;loopexit=0; while((command_table[i].cmd_name)&&(y==-1) && (++loopexit < MAXLOOPS)) { if(!(strcmp((char*)command_table[i].cmd_name, (char*)comm))) y=i; i++; } if(y==-1) { sysmessage(s, "Unrecognized command."); return; } else { if((pc_currchar->isTrueGM() && !pc_currchar->isGM()) || // a restricted GM outside his region(s) (pc_currchar->account!=0)&&(command_table[y].cmd_priv_m!=255)&& (!(pc_currchar->priv3[command_table[y].cmd_priv_m]& (0-0xFFFFFFFF<<command_table[y].cmd_priv_b)))) { sysmessage(s, "Access denied."); return; } switch(command_table[y].cmd_type) { case CMD_FUNC: (*((CMD_EXEC)command_table[y].cmd_extra)) (s); break; case CMD_ITEMMENU: itemmenu(s, (int)command_table[y].cmd_extra); break; case CMD_TARGET: _do_target(s, (TARGET_S *)command_table[y].cmd_extra); break; case CMD_TARGETX: if(tnum==2) { addx[s]=makenumber(1); _do_target(s, (TARGET_S *)command_table[y].cmd_extra); } else { sysmessage(s, "This command takes one number as an argument."); } break; case CMD_TARGETXY: if(tnum==3) { addx[s]=makenumber(1); addy[s]=makenumber(2); _do_target(s, (TARGET_S *)command_table[y].cmd_extra); } else { sysmessage(s, "This command takes two numbers as arguments."); } break; case CMD_TARGETXYZ: if(tnum==4) { addx[s]=makenumber(1); addy[s]=makenumber(2); addz[s]=makenumber(3); _do_target(s, (TARGET_S *)command_table[y].cmd_extra); } else { sysmessage(s, "This command takes three numbers as arguments."); } break; case CMD_TARGETHX: if(tnum==2) { addx[s]=hexnumber(1); _do_target(s, (TARGET_S *)command_table[y].cmd_extra); } else { sysmessage(s, "This command takes one hex number as an argument."); } break; case CMD_TARGETHXY: if(tnum==3) { addx[s]=hexnumber(1); addy[s]=hexnumber(2); _do_target(s, (TARGET_S *)command_table[y].cmd_extra); } else { sysmessage(s, "This command takes two hex numbers as arguments."); } break; case CMD_TARGETHXYZ: if(tnum==4) { addx[s]=hexnumber(1); addy[s]=hexnumber(2); addz[s]=hexnumber(3); _do_target(s, (TARGET_S *)command_table[y].cmd_extra); } else { sysmessage(s, "This command takes three hex numbers as arguments."); } break; case CMD_TARGETID1: if(tnum==2) { addid1[s]=makenumber(1); _do_target(s, (TARGET_S *)command_table[y].cmd_extra); } else { sysmessage(s, "This command takes one number as an argument."); } break; case CMD_TARGETID2: if(tnum==3) { addid1[s] = static_cast<unsigned char>(makenumber(1)); addid2[s] = static_cast<unsigned char>(makenumber(2)); _do_target(s, (TARGET_S *)command_table[y].cmd_extra); } else { sysmessage(s, "This command takes two numbers as arguments."); } break; case CMD_TARGETID3: if(tnum==4) { addid1[s] = static_cast<unsigned char>(makenumber(1)); addid2[s] = static_cast<unsigned char>(makenumber(2)); addid3[s] = static_cast<unsigned char>(makenumber(3)); _do_target(s, (TARGET_S *)command_table[y].cmd_extra); } else { sysmessage(s, "This command takes three numbers as arguments."); } break; case CMD_TARGETID4: if(tnum==5) { addid1[s] = static_cast<unsigned char>(makenumber(1)); addid2[s] = static_cast<unsigned char>(makenumber(2)); addid3[s] = static_cast<unsigned char>(makenumber(3)); addid4[s] = static_cast<unsigned char>(makenumber(4)); //clConsole.send("1: %i 2: %i 3: %i 4: %i\n",addid1[s],addid2[s],addid2[s],addid3[s],addid4[s]); _do_target(s, (TARGET_S *)command_table[y].cmd_extra); } else { sysmessage(s, "This command takes four numbers as arguments."); } break; case CMD_TARGETHID1: if(tnum==2) { addid1[s] = static_cast<unsigned char>(hexnumber(1)); _do_target(s, (TARGET_S *)command_table[y].cmd_extra); } else { sysmessage(s, "This command takes one hex number as an argument."); } break; case CMD_TARGETHID2: if(tnum==3) { addid1[s] = static_cast<unsigned char>(hexnumber(1)); addid2[s] = static_cast<unsigned char>(hexnumber(2)); _do_target(s, (TARGET_S *)command_table[y].cmd_extra); } else { sysmessage(s, "This command takes two hex numbers as arguments."); } break; case CMD_TARGETHID3: if(tnum==4) { addid1[s] = static_cast<unsigned char>(hexnumber(1)); addid2[s] = static_cast<unsigned char>(hexnumber(2)); addid3[s] = static_cast<unsigned char>(hexnumber(3)); _do_target(s, (TARGET_S *)command_table[y].cmd_extra); } else { sysmessage(s, "This command takes three hex numbers as arguments."); } break; case CMD_TARGETHID4: if(tnum==5) { addid1[s] = static_cast<unsigned char>(hexnumber(1)); addid2[s] = static_cast<unsigned char>(hexnumber(2)); addid3[s] = static_cast<unsigned char>(hexnumber(3)); addid4[s] = static_cast<unsigned char>(hexnumber(4)); _do_target(s, (TARGET_S *)command_table[y].cmd_extra); } else { sysmessage(s, "This command takes four hex numbers as arguments."); } break; case CMD_TARGETTMP: if(tnum==2) { tempint[s]=makenumber(1); _do_target(s, (TARGET_S *)command_table[y].cmd_extra); } else { sysmessage(s, "This command takes a number as an argument."); } break; case CMD_TARGETHTMP: if(tnum==2) { tempint[s]=hexnumber(1); _do_target(s, (TARGET_S *)command_table[y].cmd_extra); } else { sysmessage(s, "This command takes a hex number as an argument."); } break; default: sysmessage(s, "BUG: Command has a bad command type set!"); break; } return; } sysmessage(s, "BUG: Should never reach end of command() function!"); }