#include "merc.h" #include "db.h" #include "olc.h" #include "interp.h" #include "tables.h" #include "lookup.h" #include "recycle.h" extern bool fBootDb; int MAX_CMD; struct cmd_type *cmd_table; DO_FUN *cmd_func_lookup(char *arg); char *cmd_func_name(DO_FUN *command); #if defined(COMMAND) #undef COMMAND #endif #define COMMAND(cmd) { #cmd, cmd }, const struct cmd_list_type cmd_list []= { #include "command.h" { NULL, NULL } }; #undef COMMAND #define COMMAND(cmd) DECLARE_DO_FUN(cmd); ACMD(do_nothing) { return; } void save_command(const struct cmd_type *cmd, FILE *fp) { fprintf(fp, "%s~\n", cmd->name); fprintf(fp, "%s~\n", cmd->sort_as); fprintf(fp, "%s~\n", cmd_func_name(cmd->do_fun)); fprintf(fp, "%s~\n", position_table[cmd->position].short_name); fprintf(fp, "%s\n", print_flags(cmd->staffcmd)); fprintf(fp, "%d %d %d %d\n\n", cmd->level, cmd->show, cmd->log, cmd->subcmd); } void load_command(FILE *fp, struct cmd_type *cmd) { cmd->name = fread_string(fp); cmd->sort_as = fread_string(fp); cmd->do_fun = cmd_func_lookup(fread_string(fp)); cmd->position = position_lookup(fread_string(fp)); cmd->staffcmd = fread_flag(fp); cmd->level = fread_number(fp); cmd->show = fread_number(fp); cmd->log = fread_number(fp); cmd->subcmd = fread_number(fp); } void save_cmd_table(void) { FILE *fp; int i, cnt = 0; if (!(fp = fopen(CMD_FILE, "w"))) { mudlogf(BRF, LVL_STAFF, TRUE, "SYSERR: save_cmd_table: Cannot open %s for saving.", CMD_FILE); return; } /* for (const struct cmd_type *temp = cmd_table; !IS_NULLSTR(temp->name); temp = temp++) cnt++; MAX_CMD = cnt; */ fprintf(fp, "%d\n", MAX_CMD); for (i = 0; i < MAX_CMD; i++) save_command(&cmd_table[i], fp); fclose(fp); } void load_cmd_table(void) { int i; FILE *fp; if (!(fp = fopen(CMD_FILE, "r"))) { mudlogf(BRF, LVL_CODER, TRUE, "SYSERR: Could not open %s for reading.", CMD_FILE); exit(1); } fscanf(fp, "%d\n", &MAX_CMD); cmd_table = (struct cmd_type *)malloc(sizeof(struct cmd_type) * (MAX_CMD+1)); for (i = 0; i < MAX_CMD; i++) load_command(fp, &cmd_table[i]); cmd_table[MAX_CMD].name = str_dup(""); fclose(fp); } char *cmd_func_name(DO_FUN *command) { int cmd; for (cmd = 0; cmd_list[cmd].name; cmd++) { if (cmd_list[cmd].function == command) return cmd_list[cmd].name; } return ""; } DO_FUN *cmd_func_lookup(char *arg) { int cmd; for (cmd = 0; cmd_list[cmd].name; cmd++) { if (!str_cmp(cmd_list[cmd].name, arg)) return cmd_list[cmd].function; } if (fBootDb) { mudlogf(BRF, LVL_STAFF, TRUE, "SYSERR: cmd_func_lookup: invalid function: %s does not exist.", arg); return do_nothing; } return NULL; } int cmd_lookup(char *arg) { int cmd; for (cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++) { if (LOWER(arg[0]) == LOWER(cmd_table[cmd].name[0]) && (!str_prefix(arg, cmd_table[cmd].name))) return cmd; } return -1; } CMD_DATA *get_command_data(char *name) { int i; for (i = 0; i < MAX_CMD; i++) if (!str_cmp(name, cmd_table[i].name)) return &cmd_table[i]; return NULL; } void list_functions(BUFFER *pbuf) { int i; char buf[MAX_STRING_LENGTH]; sprintf(buf, "Num %-13.13s Num %-13.13s Num %-13.13s Num %-13.13s\n\r", "Number", "Number", "Number", "Number"); add_buf(pbuf, buf); for (i = 0; cmd_list[i].name; i++) { sprintf(buf, "%3d %-13.13s", i, cmd_list[i].name); if (i % 4 == 3) strcat(buf, "\n\r"); else strcat(buf, " "); add_buf(pbuf, buf); } if (i % 4 != 0) add_buf(pbuf, "\n\r"); } void list_commands(BUFFER *pbuf, int minlev, int maxlev) { int i, cnt = 0; char buf[MAX_STRING_LENGTH]; sprintf(buf, "Lvl %-12.12s %-13.13s Lvl %-12.12s %-13.13s\n\r", "Number", "Function", "Number", "Function"); add_buf(pbuf, buf); for (i = 0; i < MAX_CMD; i++) { if (cmd_table[i].level < minlev || cmd_table[i].level > maxlev) continue; sprintf(buf, "%3d %-12.12s %-13.13s", cmd_table[i].level, cmd_table[i].name, cmd_func_name(cmd_table[i].do_fun)); if (cnt % 2 == 1) strcat(buf, "\n\r"); else strcat(buf, " "); add_buf(pbuf, buf); cnt++; } if (cnt % 2 != 0) add_buf(pbuf, "\n\r"); }