--- lbbs/src/menu.c 2025/05/08 08:05:58 1.31 +++ lbbs/src/menu.c 2025/05/14 04:22:45 1.39 @@ -17,7 +17,6 @@ #include "bbs.h" #include "bbs_cmd.h" #include "user_priv.h" -#include "reg_ex.h" #include "bbs_cmd.h" #include "menu.h" #include "log.h" @@ -42,6 +41,7 @@ int load_menu(MENU_SET *p_menu_set, cons int i = 0; int j = 0; char buffer[LINE_BUFFER_LEN]; + char temp[LINE_BUFFER_LEN]; char screen_filename[FILE_PATH_LEN]; char *p = NULL; char *q = NULL; @@ -50,6 +50,7 @@ int load_menu(MENU_SET *p_menu_set, cons MENU_ITEM *p_item = NULL; p_menu_set->menu_count = 0; + p_menu_set->p_menu_name_dict = trie_dict_create(); if ((fin = fopen(conf_file, "r")) == NULL) { @@ -83,7 +84,7 @@ int load_menu(MENU_SET *p_menu_set, cons { if (p_menu != NULL) { - log_error("Begin new menu without end the prior one, in menu config line %d\n", fin_line); + log_error("Incomplete menu definition in menu config line %d\n", fin_line); return -1; } p_menu = (MENU *)malloc(sizeof(MENU)); @@ -126,6 +127,10 @@ int load_menu(MENU_SET *p_menu_set, cons } strncpy(p_menu->name, p, sizeof(p_menu->name) - 1); p_menu->name[sizeof(p_menu->name) - 1] = '\0'; + if (trie_dict_set(p_menu_set->p_menu_name_dict, p_menu->name, (int64_t)p_menu) != 1) + { + log_error("Error set menu dict [%s]\n", p_menu->name); + } // Check syntax q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr); @@ -306,7 +311,7 @@ int load_menu(MENU_SET *p_menu_set, cons q = strtok_r(NULL, MENU_CONF_DELIM_WITHOUT_SPACE, &saveptr); if (q == NULL || (q = strchr(q, '\"')) == NULL) { - log_error("Error #1 menu item text in menu config line %d\n", fin_line); + log_error("Error menu item text in menu config line %d\n", fin_line); return -1; } q++; @@ -521,7 +526,8 @@ int load_menu(MENU_SET *p_menu_set, cons { fin_line++; - p = strtok_r(buffer, MENU_CONF_DELIM_WITH_SPACE, &saveptr); + strncpy(temp, buffer, sizeof(temp)); // Duplicate line for strtok_r + p = strtok_r(temp, MENU_CONF_DELIM_WITH_SPACE, &saveptr); if (p != NULL && *p == '%') // END of menu screen { break; @@ -554,14 +560,14 @@ int load_menu(MENU_SET *p_menu_set, cons MENU *get_menu(MENU_SET *p_menu_set, const char *menu_name) { - int i; + int ret; + int64_t value = 0; - for (i = 0; i < p_menu_set->menu_count; i++) + ret = trie_dict_get(p_menu_set->p_menu_name_dict, menu_name, &value); + + if (ret == 1) // found { - if (strcmp(p_menu_set->p_menu[i]->name, menu_name) == 0) - { - return p_menu_set->p_menu[i]; - } + return ((MENU *)value); } return NULL; @@ -586,6 +592,13 @@ int display_menu(MENU *p_menu) return -1; } + if (p_menu->item_cur_pos > 0 && + checkpriv(&BBS_priv, 0, p_menu->items[p_menu->item_cur_pos]->priv) != 0 && + checklevel(&BBS_priv, p_menu->items[p_menu->item_cur_pos]->level) != 0) + { + menu_selectable = 1; + } + if (p_menu->title.show) { show_top(p_menu->title.text); @@ -672,7 +685,6 @@ int menu_control(MENU_SET *p_menu_set, i switch (key) { case CR: - igetch(1); // Cleanup remaining '\n' in the buffer case KEY_RIGHT: if (p_menu->items[p_menu->item_cur_pos]->submenu) { @@ -688,13 +700,13 @@ int menu_control(MENU_SET *p_menu_set, i { return menu_control(p_menu_set, KEY_LEFT); } - break; } else { return (exec_cmd(p_menu->items[p_menu->item_cur_pos]->action, p_menu->items[p_menu->item_cur_pos]->name)); } + break; case KEY_LEFT: if (p_menu_set->menu_select_depth > 0) { @@ -703,21 +715,20 @@ int menu_control(MENU_SET *p_menu_set, i { return menu_control(p_menu_set, KEY_LEFT); } - break; } else { display_menu_cursor(p_menu, 0); p_menu->item_cur_pos = p_menu->item_count - 1; - while (!p_menu->items[p_menu->item_cur_pos]->display || - p_menu->items[p_menu->item_cur_pos]->priv != 0 || - p_menu->items[p_menu->item_cur_pos]->level != 0) + while (p_menu->item_cur_pos >= 0 && (!p_menu->items[p_menu->item_cur_pos]->display || + p_menu->items[p_menu->item_cur_pos]->priv != 0 || + p_menu->items[p_menu->item_cur_pos]->level != 0)) { p_menu->item_cur_pos--; } display_menu_cursor(p_menu, 1); - break; } + break; case KEY_UP: display_menu_cursor(p_menu, 0); do @@ -757,6 +768,7 @@ int menu_control(MENU_SET *p_menu_set, i } } } + break; } return 0; @@ -767,6 +779,12 @@ void unload_menu(MENU_SET *p_menu_set) MENU *p_menu; int i, j; + if (p_menu_set->p_menu_name_dict != NULL) + { + trie_dict_destroy(p_menu_set->p_menu_name_dict); + p_menu_set->p_menu_name_dict = NULL; + } + for (i = 0; i < p_menu_set->menu_count; i++) { p_menu = p_menu_set->p_menu[i];