diff --git a/src/menus.c b/src/menus.c index bb13656..da5803e 100644 --- a/src/menus.c +++ b/src/menus.c @@ -64,22 +64,116 @@ extern struct bbs_config conf; extern struct user_record *gUser; extern int mynode; +struct menu_command { + int command; + char *data; +}; + struct menu_item { char hotkey; - int *command; - char **data; - int command_count; + struct ptr_vector commands; int seclevel; }; +struct key_value_map { + const char *key; + int value; +}; + +static const struct key_value_map commands[] = { + { "SUBMENU", MENU_SUBMENU }, + { "LOGOFF", MENU_LOGOFF }, + { "PREVMENU", MENU_PREVMENU }, + { "AUTOMESSAGE", MENU_AUTOMESSAGE }, + { "TEXTFILES", MENU_TEXTFILES }, + { "CHATSYSTEM", MENU_CHATSYSTEM }, + { "BBSLIST", MENU_BBSLIST }, + { "LISTUSERS", MENU_LISTUSERS }, + { "BULLETINS", MENU_BULLETINS }, + { "LAST10CALLERS", MENU_LAST10 }, + { "SETTINGS", MENU_SETTINGS }, + { "RUNDOOR", MENU_DOOR }, + { "MAILSCAN", MENU_MAILSCAN }, + { "READMAIL", MENU_READMAIL }, + { "POSTMESSAGE", MENU_POSTMESSAGE }, + { "CHOOSEMAILCONF", MENU_CHOOSEMAILCONF }, + { "CHOOSEMAILAREA", MENU_CHOOSEMAILAREA }, + { "SENDEMAIL", MENU_SENDEMAIL }, + { "LISTEMAIL", MENU_LISTEMAIL }, + { "NEXTMAILCONF", MENU_NEXTMAILCONF }, + { "PREVMAILCONF", MENU_PREVMAILCONF }, + { "NEXTMAILAREA", MENU_NEXTMAILAREA }, + { "PREVMAILAREA", MENU_PREVMAILAREA }, + { "BLUEWAVEDOWNLOAD", MENU_BLUEWAVEDOWN }, + { "BLUEWAVEUPLOAD", MENU_BLUEWAVEUP }, + { "CHOOSEFILEDIR", MENU_CHOOSEFILEDIR }, + { "CHOOSEFILESUB", MENU_CHOOSEFILESUB }, + { "LISTFILES", MENU_LISTFILES }, + { "UPLOAD", MENU_UPLOAD }, + { "DOWNLOAD", MENU_DOWNLOAD }, + { "CLEARTAGGED", MENU_CLEARTAGGEDFILES }, + { "NEXTFILEDIR", MENU_NEXTFILEDIR }, + { "PREVFILEDIR", MENU_PREVFILEDIR }, + { "NEXTFILESUB", MENU_NEXTFILESUB }, + { "PREVFILESUB", MENU_PREVFILESUB }, + { "LISTMESSAGES", MENU_LISTMESSAGES }, + { "DOSCRIPT", MENU_DOSCRIPT }, + { "SENDNODEMSG", MENU_SENDNODEMSG }, + { "SUBUNSUBCONF", MENU_SUBUNSUBCONF }, + { "RESETMSGPTRS", MENU_RESETPOINTERS }, + { "RESETALLMSGPTRS", MENU_RESETALLPOINTERS }, + { "FILESCAN", MENU_FILESCAN }, + { "FULLMAILSCAN", MENU_FULLMAILSCAN }, + { "FILESEARCH", MENU_FILESEARCH }, + { "DISPLAYTXTFILE", MENU_DISPTXTFILE }, + { "DISPLAYTXTPAUSE", MENU_DISPTXTFILEPAUSE }, + { "GENWWWURLS", MENU_GENWWWURLS }, + { "NLBROWSER", MENU_NLBROWSER }, + { "SENDFEEDBACK", MENU_SENDFEEDBACK }, + { "BLOGDISPLAY", MENU_BLOGDISPLAY }, + { "BLOGWRITE", MENU_BLOGWRITE } +}; + +#define ARRAY_SIZE(A) (sizeof(A)/sizeof((A)[0])) + +int cmd2cmd(const char *cmd) { + for (size_t i = 0; i < ARRAY_SIZE(commands); ++i) + if (strncmp(cmd, commands[i].key, strlen(commands[i].key)) == 0) + return commands[i].value; + return -1; +} + +static int badmenu(const char *menufile) { + s_printf("Bad menu file! %s\r\n", menufile); + return 0; +} + +static void free_menu(struct ptr_vector *menu) { + assert(menu != NULL); + for (size_t i = 0; i < ptr_vector_len(menu); ++i) { + struct menu_item *item = ptr_vector_get(menu, i); + assert(item != NULL); + for (size_t j = 0; j < ptr_vector_len(&item->commands); ++j) { + struct menu_command *cmd = ptr_vector_get(&item->commands, j); + assert(cmd != NULL); + free(cmd->data); + } + ptr_vector_apply(&item->commands, free); + destroy_ptr_vector(&item->commands); + } + ptr_vector_apply(menu, free); + destroy_ptr_vector(menu); +} + int menu_system(char *menufile) { FILE *fptr; char buffer[PATH_MAX]; - int menu_items = 0; - struct menu_item **menu; - char *lua_script; - int do_lua_menu; - char *ansi_file; + struct ptr_vector menu = EMPTY_PTR_VECTOR; + struct menu_item *this_menu = NULL; + struct menu_command *this_command = NULL; + char *lua_script = NULL; + int do_lua_menu = 0; + char *ansi_file = NULL; int i; int j; int k; @@ -103,169 +197,47 @@ int menu_system(char *menufile) { snprintf(buffer, PATH_MAX, "%s/%s.mnu", conf.menu_path, menufile); } fptr = fopen(buffer, "r"); + if (!fptr) + return badmenu(menufile); - if (!fptr) { - s_printf("Error opening menu file! %s\r\n", menufile); - return 0; - } - - lua_script = NULL; - ansi_file = NULL; - - fgets(buffer, 256, fptr); - while (!feof(fptr)) { - + init_ptr_vector(&menu); + while (fgets(buffer, sizeof buffer, fptr) != NULL && !feof(fptr)) { chomp(buffer); if (strncasecmp(buffer, "HOTKEY", 6) == 0) { - menu_items++; - if (menu_items == 1) { - menu = (struct menu_item **)malloz(sizeof(struct menu_item *)); - } else { - menu = (struct menu_item **)realloc(menu, sizeof(struct menu_item *) * (menu_items)); - } - menu[menu_items - 1] = (struct menu_item *)malloz(sizeof(struct menu_item)); - menu[menu_items - 1]->hotkey = buffer[7]; - menu[menu_items - 1]->command = NULL; - menu[menu_items - 1]->data = NULL; - menu[menu_items - 1]->command_count = 0; - menu[menu_items - 1]->seclevel = 0; - } else if (strncasecmp(buffer, "COMMAND", 7) == 0 && menu_items > 0) { - if (menu[menu_items - 1]->command_count == 0) { - menu[menu_items - 1]->command = (int *)malloz(sizeof(int)); - menu[menu_items - 1]->data = (char **)malloz(sizeof(char *)); - } else { - menu[menu_items - 1]->command = (int *)realloc(menu[menu_items - 1]->command, sizeof(int) * (menu[menu_items - 1]->command_count + 1)); - menu[menu_items - 1]->data = (char **)realloc(menu[menu_items - 1]->data, sizeof(char *) * (menu[menu_items - 1]->command_count + 1)); - } - menu[menu_items - 1]->command_count++; - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = 0; - menu[menu_items - 1]->data[menu[menu_items - 1]->command_count - 1] = NULL; - if (strncasecmp(&buffer[8], "SUBMENU", 7) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_SUBMENU; - } else if (strncasecmp(&buffer[8], "LOGOFF", 6) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_LOGOFF; - } else if (strncasecmp(&buffer[8], "PREVMENU", 8) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_PREVMENU; - } else if (strncasecmp(&buffer[8], "AUTOMESSAGE", 11) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_AUTOMESSAGE; - } else if (strncasecmp(&buffer[8], "TEXTFILES", 9) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_TEXTFILES; - } else if (strncasecmp(&buffer[8], "CHATSYSTEM", 10) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_CHATSYSTEM; - } else if (strncasecmp(&buffer[8], "BBSLIST", 7) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_BBSLIST; - } else if (strncasecmp(&buffer[8], "LISTUSERS", 9) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_LISTUSERS; - } else if (strncasecmp(&buffer[8], "BULLETINS", 9) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_BULLETINS; - } else if (strncasecmp(&buffer[8], "LAST10CALLERS", 13) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_LAST10; - } else if (strncasecmp(&buffer[8], "SETTINGS", 8) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_SETTINGS; - } else if (strncasecmp(&buffer[8], "RUNDOOR", 7) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_DOOR; - } else if (strncasecmp(&buffer[8], "MAILSCAN", 8) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_MAILSCAN; - } else if (strncasecmp(&buffer[8], "READMAIL", 8) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_READMAIL; - } else if (strncasecmp(&buffer[8], "POSTMESSAGE", 11) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_POSTMESSAGE; - } else if (strncasecmp(&buffer[8], "CHOOSEMAILCONF", 14) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_CHOOSEMAILCONF; - } else if (strncasecmp(&buffer[8], "CHOOSEMAILAREA", 14) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_CHOOSEMAILAREA; - } else if (strncasecmp(&buffer[8], "SENDEMAIL", 9) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_SENDEMAIL; - } else if (strncasecmp(&buffer[8], "LISTEMAIL", 9) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_LISTEMAIL; - } else if (strncasecmp(&buffer[8], "NEXTMAILCONF", 12) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_NEXTMAILCONF; - } else if (strncasecmp(&buffer[8], "PREVMAILCONF", 12) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_PREVMAILCONF; - } else if (strncasecmp(&buffer[8], "NEXTMAILAREA", 12) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_NEXTMAILAREA; - } else if (strncasecmp(&buffer[8], "PREVMAILAREA", 12) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_PREVMAILAREA; - } else if (strncasecmp(&buffer[8], "BLUEWAVEDOWNLOAD", 16) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_BLUEWAVEDOWN; - } else if (strncasecmp(&buffer[8], "BLUEWAVEUPLOAD", 14) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_BLUEWAVEUP; - } else if (strncasecmp(&buffer[8], "CHOOSEFILEDIR", 13) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_CHOOSEFILEDIR; - } else if (strncasecmp(&buffer[8], "CHOOSEFILESUB", 13) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_CHOOSEFILESUB; - } else if (strncasecmp(&buffer[8], "LISTFILES", 9) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_LISTFILES; - } else if (strncasecmp(&buffer[8], "UPLOAD", 6) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_UPLOAD; - } else if (strncasecmp(&buffer[8], "DOWNLOAD", 8) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_DOWNLOAD; - } else if (strncasecmp(&buffer[8], "CLEARTAGGED", 11) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_CLEARTAGGEDFILES; - } else if (strncasecmp(&buffer[8], "NEXTFILEDIR", 11) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_NEXTFILEDIR; - } else if (strncasecmp(&buffer[8], "PREVFILEDIR", 11) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_PREVFILEDIR; - } else if (strncasecmp(&buffer[8], "NEXTFILESUB", 11) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_NEXTFILESUB; - } else if (strncasecmp(&buffer[8], "PREVFILESUB", 11) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_PREVFILESUB; - } else if (strncasecmp(&buffer[8], "LISTMESSAGES", 12) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_LISTMESSAGES; - } else if (strncasecmp(&buffer[8], "DOSCRIPT", 8) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_DOSCRIPT; - } else if (strncasecmp(&buffer[8], "SENDNODEMSG", 11) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_SENDNODEMSG; - } else if (strncasecmp(&buffer[8], "SUBUNSUBCONF", 12) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_SUBUNSUBCONF; - } else if (strncasecmp(&buffer[8], "RESETMSGPTRS", 12) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_RESETPOINTERS; - } else if (strncasecmp(&buffer[8], "RESETALLMSGPTRS", 15) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_RESETALLPOINTERS; - } else if (strncasecmp(&buffer[8], "FILESCAN", 8) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_FILESCAN; - } else if (strncasecmp(&buffer[8], "FULLMAILSCAN", 12) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_FULLMAILSCAN; - } else if (strncasecmp(&buffer[8], "FILESEARCH", 10) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_FILESEARCH; - } else if (strncasecmp(&buffer[8], "DISPLAYTXTFILE", 14) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_DISPTXTFILE; - } else if (strncasecmp(&buffer[8], "DISPLAYTXTPAUSE", 15) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_DISPTXTFILEPAUSE; - } else if (strncasecmp(&buffer[8], "GENWWWURLS", 10) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_GENWWWURLS; - } else if (strncasecmp(&buffer[8], "NLBROWSER", 9) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_NLBROWSER; - } else if (strncasecmp(&buffer[8], "SENDFEEDBACK", 12) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_SENDFEEDBACK; - } else if (strncasecmp(&buffer[8], "BLOGDISPLAY", 11) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_BLOGDISPLAY; - } else if (strncasecmp(&buffer[8], "BLOGWRITE", 9) == 0) { - menu[menu_items - 1]->command[menu[menu_items - 1]->command_count - 1] = MENU_BLOGWRITE; - } + this_menu = malloz(sizeof(struct menu_item)); + this_menu->hotkey = buffer[7]; + init_ptr_vector(&this_menu->commands); + this_menu->seclevel = 0; + ptr_vector_append(&menu, this_menu); + } else if (strncasecmp(buffer, "COMMAND", 7) == 0) { + if (this_menu == NULL) + return badmenu(menufile); + int cmd = cmd2cmd(buffer + 8); + if (cmd < 0) + continue; + this_command = malloz(sizeof(struct menu_command)); + this_command->command = cmd; + this_command->data = NULL; + ptr_vector_append(&this_menu->commands, this_command); } else if (strncasecmp(buffer, "SECLEVEL", 8) == 0) { - menu[menu_items - 1]->seclevel = atoi(&buffer[9]); + if (this_menu == NULL) + return badmenu(menufile); + this_menu->seclevel = atoi(buffer + 9); } else if (strncasecmp(buffer, "DATA", 4) == 0) { - if (menu[menu_items - 1]->data[menu[menu_items - 1]->command_count - 1] != NULL) { - free(menu[menu_items - 1]->data[menu[menu_items - 1]->command_count - 1]); - } - menu[menu_items - 1]->data[menu[menu_items - 1]->command_count - 1] = strdup(&buffer[5]); + if (this_command == NULL) + return badmenu(menufile); + free(this_command->data); + this_command->data = strdup(buffer + 5); } else if (strncasecmp(buffer, "LUASCRIPT", 9) == 0) { - if (lua_script != NULL) { - free(lua_script); - } - lua_script = strdup(&buffer[10]); + free(lua_script); + lua_script = strdup(buffer + 10); } else if (strncasecmp(buffer, "ANSIFILE", 8) == 0) { - if (ansi_file != NULL) { - free(ansi_file); - } - ansi_file = strdup(&buffer[9]); + free(ansi_file); + ansi_file = strdup(buffer + 9); } else if (strncasecmp(buffer, "CLEARSCREEN", 11) == 0) { clearscreen = 1; } - - fgets(buffer, 256, fptr); } fclose(fptr); @@ -345,81 +317,38 @@ int menu_system(char *menufile) { lua_pop(L, 1); } - for (i = 0; i < menu_items; i++) { - if (tolower(menu[i]->hotkey) == tolower(c)) { - if (menu[i]->seclevel <= gUser->sec_level) { - for (j = 0; j < menu[i]->command_count; j++) { - switch (menu[i]->command[j]) { + for (size_t i = 0; i < ptr_vector_len(&menu); i++) { + struct menu_item *item = ptr_vector_get(&menu, i); + if (tolower(item->hotkey) == tolower(c)) { + if (item->seclevel <= gUser->sec_level) { + for (size_t j = 0; j < ptr_vector_len(&item->commands); ++j) { + struct menu_command *cmd = ptr_vector_get(&item->commands, j); + switch (cmd->command) { case MENU_SUBMENU: - doquit = menu_system(menu[i]->data[j]); + doquit = menu_system(cmd->data); if (doquit == 1) { // free menus - if (do_lua_menu) { + free_menu(&menu); + free(ansi_file); + if (do_lua_menu) lua_close(L); - } - if (lua_script != NULL) { - free(lua_script); - } - if (ansi_file != NULL) { - free(ansi_file); - } - for (i = 0; i < menu_items; i++) { - for (j = 0; j < menu[i]->command_count; j++) { - if (menu[i]->data[j] != NULL) { - free(menu[i]->data[j]); - } - } - free(menu[i]->data); - free(menu[i]->command); - free(menu[i]); - } - free(menu); + free(lua_script); return doquit; } break; case MENU_LOGOFF: - if (do_lua_menu) { + free(ansi_file); + if (do_lua_menu) lua_close(L); - } - if (lua_script != NULL) { - free(lua_script); - } - if (ansi_file != NULL) { - free(ansi_file); - } - for (i = 0; i < menu_items; i++) { - for (j = 0; j < menu[i]->command_count; j++) { - if (menu[i]->data[j] != NULL) { - free(menu[i]->data[j]); - } - } - free(menu[i]->data); - free(menu[i]->command); - free(menu[i]); - } - free(menu); + free(lua_script); + free_menu(&menu); return 1; case MENU_PREVMENU: - if (do_lua_menu) { + if (do_lua_menu) lua_close(L); - } - if (lua_script != NULL) { - free(lua_script); - } - if (ansi_file != NULL) { - free(ansi_file); - } - for (i = 0; i < menu_items; i++) { - for (j = 0; j < menu[i]->command_count; j++) { - if (menu[i]->data[j] != NULL) { - free(menu[i]->data[j]); - } - } - free(menu[i]->data); - free(menu[i]->command); - free(menu[i]); - } - free(menu); + free(lua_script); + free(ansi_file); + free_menu(&menu); return 0; case MENU_AUTOMESSAGE: broadcast("USER: %s; NODE:%d; STATUS: Viewing/Changing Automessage.", gUser->loginname, mynode); @@ -454,7 +383,7 @@ int menu_system(char *menufile) { break; case MENU_DOOR: { for (m = 0; m < conf.door_count; m++) { - if (strcasecmp(menu[i]->data[j], conf.doors[m]->name) == 0) { + if (strcasecmp(cmd->data, conf.doors[m]->name) == 0) { dolog("%s launched door %s, on node %d", gUser->loginname, conf.doors[m]->name, mynode); broadcast("USER: %s; NODE:%d; STATUS: Executing Door %s.", gUser->loginname, mynode, conf.doors[m]->name); rundoor(gUser, conf.doors[m]->command, conf.doors[m]->stdio, conf.doors[m]->codepage); @@ -554,8 +483,8 @@ int menu_system(char *menufile) { list_messages(gUser); break; case MENU_DOSCRIPT: - broadcast("USER: %s; NODE:%d; STATUS: Executing a script %s.", gUser->loginname, mynode, menu[i]->data[j]); - do_lua_script(menu[i]->data[j]); + broadcast("USER: %s; NODE:%d; STATUS: Executing a script %s.", gUser->loginname, mynode, cmd->data); + do_lua_script(cmd->data); break; case MENU_SENDNODEMSG: broadcast("USER: %s; NODE:%d; STATUS: Sending a node Message.", gUser->loginname, mynode); @@ -602,8 +531,8 @@ int menu_system(char *menufile) { file_scan(); break; case MENU_FULLMAILSCAN: - if (menu[i]->data[j] != NULL) { - if (strcasecmp(menu[i]->data[j], "PERSONAL") == 0) { + if (cmd->data != NULL) { + if (strcasecmp(cmd->data, "PERSONAL") == 0) { broadcast("USER: %s; NODE:%d; STATUS: Scanning for personal mail.", gUser->loginname, mynode); full_mail_scan_personal(gUser); } else { @@ -619,15 +548,15 @@ int menu_system(char *menufile) { file_search(); break; case MENU_DISPTXTFILE: - if (menu[i]->data[j] != NULL) { - broadcast("USER: %s; NODE:%d; STATUS: Displaying Text File: %s.", gUser->loginname, mynode, menu[i]->data[j]); - s_displayansi_pause(menu[i]->data[j], 0); + if (cmd->data != NULL) { + broadcast("USER: %s; NODE:%d; STATUS: Displaying Text File: %s.", gUser->loginname, mynode, cmd->data); + s_displayansi_pause(cmd->data, 0); } break; case MENU_DISPTXTFILEPAUSE: - if (menu[i]->data[j] != NULL) { - broadcast("USER: %s; NODE:%d; STATUS: Displaying Text File: %s.", gUser->loginname, mynode, menu[i]->data[j]); - s_displayansi_pause(menu[i]->data[j], 1); + if (cmd->data != NULL) { + broadcast("USER: %s; NODE:%d; STATUS: Displaying Text File: %s.", gUser->loginname, mynode, cmd->data); + s_displayansi_pause(cmd->data, 1); } s_printf(get_string(6)); s_getc(); @@ -668,6 +597,11 @@ int menu_system(char *menufile) { } } - // free menus; + free(ansi_file); + if (do_lua_menu) + lua_close(L); + free(lua_script); + free_menu(&menu); + return doquit; }