--- lbbs/src/menu.c 2005/03/20 17:37:14 1.10 +++ lbbs/src/menu.c 2005/03/22 13:36:13 1.16 @@ -75,6 +75,8 @@ load_menu (MENU_SET * p_menu_set, const if (ireg ("^%menu ([A-Za-z0-9_]+)", buffer, 2, pmatch) == 0) { p_menu_set->p_menu[i] = malloc (sizeof (MENU)); + p_menu_set->p_menu[i]->title.show = 0; + p_menu_set->p_menu[i]->screen.show = 0; strncpy (p_menu_set->p_menu[i]->name, buffer + pmatch[1].rm_so, @@ -88,7 +90,7 @@ load_menu (MENU_SET * p_menu_set, const { if (buffer[0] == '#') { - break; + continue; } if (buffer[0] == '%') { @@ -99,8 +101,9 @@ load_menu (MENU_SET * p_menu_set, const } if (ireg ("^!([A-Za-z0-9_.]+)[[:space:]]*([0-9]+)," "[[:space:]]*([0-9]+),[[:space:]]*([0-9]+)," - "[[:space:]]*\"([A-Za-z0-9_]+)\",[[:space:]]*\"([^\"]+)\"", - buffer, 7, pmatch) == 0) + "[[:space:]]*([0-9]+),[[:space:]]*\"([A-Za-z0-9_]+)\"," + "[[:space:]]*\"([^\"]+)\"", + buffer, 8, pmatch) == 0) { p_menu_set->p_menu[i]->items[j] = malloc (sizeof (MENU_ITEM)); @@ -126,25 +129,31 @@ load_menu (MENU_SET * p_menu_set, const pmatch[4].rm_eo - pmatch[4].rm_so); temp[pmatch[4].rm_eo - pmatch[4].rm_so] = '\0'; p_menu_set->p_menu[i]->items[j]->priv = atoi (temp); - strncpy (p_menu_set->p_menu[i]->items[j]->name, + strncpy (temp, buffer + pmatch[5].rm_so, pmatch[5].rm_eo - pmatch[5].rm_so); - p_menu_set->p_menu[i]->items[j]->name[pmatch[5].rm_eo - - pmatch[5].rm_so] = - '\0'; - strncpy (p_menu_set->p_menu[i]->items[j]->text, + temp[pmatch[5].rm_eo - pmatch[5].rm_so] = '\0'; + p_menu_set->p_menu[i]->items[j]->level = atoi (temp); + strncpy (p_menu_set->p_menu[i]->items[j]->name, buffer + pmatch[6].rm_so, pmatch[6].rm_eo - pmatch[6].rm_so); - p_menu_set->p_menu[i]->items[j]->text[pmatch[6].rm_eo - + p_menu_set->p_menu[i]->items[j]->name[pmatch[6].rm_eo - pmatch[6].rm_so] = '\0'; + strncpy (p_menu_set->p_menu[i]->items[j]->text, + buffer + pmatch[7].rm_so, + pmatch[7].rm_eo - pmatch[7].rm_so); + p_menu_set->p_menu[i]->items[j]->text[pmatch[7].rm_eo - + pmatch[7].rm_so] = + '\0'; j++; continue; } if (ireg ("^@([A-Za-z0-9_]+)[[:space:]]*([0-9]+)," "[[:space:]]*([0-9]+),[[:space:]]*([0-9]+)," - "[[:space:]]*\"([A-Za-z0-9_]+)\",[[:space:]]*\"([^\"]+)\"", - buffer, 7, pmatch) == 0) + "[[:space:]]*([0-9]+),[[:space:]]*\"([A-Za-z0-9_]+)\"," + "[[:space:]]*\"([^\"]+)\"", + buffer, 8, pmatch) == 0) { p_menu_set->p_menu[i]->items[j] = malloc (sizeof (MENU_ITEM)); @@ -152,9 +161,9 @@ load_menu (MENU_SET * p_menu_set, const strncpy (p_menu_set->p_menu[i]->items[j]->action, buffer + pmatch[1].rm_so, pmatch[1].rm_eo - pmatch[1].rm_so); - p_menu_set->p_menu[i]->items[j]->action[pmatch[0]. + p_menu_set->p_menu[i]->items[j]->action[pmatch[1]. rm_eo - - pmatch[0]. + pmatch[1]. rm_so] = '\0'; strncpy (temp, buffer + pmatch[2].rm_so, pmatch[2].rm_eo - pmatch[2].rm_so); @@ -170,18 +179,23 @@ load_menu (MENU_SET * p_menu_set, const pmatch[4].rm_eo - pmatch[4].rm_so); temp[pmatch[4].rm_eo - pmatch[4].rm_so] = '\0'; p_menu_set->p_menu[i]->items[j]->priv = atoi (temp); - strncpy (p_menu_set->p_menu[i]->items[j]->name, + strncpy (temp, buffer + pmatch[5].rm_so, pmatch[5].rm_eo - pmatch[5].rm_so); - p_menu_set->p_menu[i]->items[j]->name[pmatch[5].rm_eo - - pmatch[5].rm_so] = - '\0'; - strncpy (p_menu_set->p_menu[i]->items[j]->text, + temp[pmatch[5].rm_eo - pmatch[5].rm_so] = '\0'; + p_menu_set->p_menu[i]->items[j]->level = atoi (temp); + strncpy (p_menu_set->p_menu[i]->items[j]->name, buffer + pmatch[6].rm_so, pmatch[6].rm_eo - pmatch[6].rm_so); - p_menu_set->p_menu[i]->items[j]->text[pmatch[6].rm_eo - + p_menu_set->p_menu[i]->items[j]->name[pmatch[6].rm_eo - pmatch[6].rm_so] = '\0'; + strncpy (p_menu_set->p_menu[i]->items[j]->text, + buffer + pmatch[7].rm_so, + pmatch[7].rm_eo - pmatch[7].rm_so); + p_menu_set->p_menu[i]->items[j]->text[pmatch[7].rm_eo - + pmatch[7].rm_so] = + '\0'; j++; continue; } @@ -189,6 +203,7 @@ load_menu (MENU_SET * p_menu_set, const "[[:space:]]*([0-9]+),[[:space:]]*\"([^\"]+)\"", buffer, 4, pmatch) == 0) { + p_menu_set->p_menu[i]->title.show = 1; strncpy (temp, buffer + pmatch[1].rm_so, pmatch[1].rm_eo - pmatch[1].rm_so); @@ -211,6 +226,7 @@ load_menu (MENU_SET * p_menu_set, const "[[:space:]]*([0-9]+),[[:space:]]*S_([A-Za-z0-9_]+)", buffer, 4, pmatch) == 0) { + p_menu_set->p_menu[i]->screen.show = 1; strncpy (temp, buffer + pmatch[1].rm_so, pmatch[1].rm_eo - pmatch[1].rm_so); @@ -277,18 +293,24 @@ display_menu (MENU * p_menu) if (p_menu == NULL) return -1; - show_top (p_menu->title.text); + if (p_menu->title.show) + show_top (p_menu->title.text); - moveto (p_menu->screen.row, p_menu->screen.col); - if (display_file (p_menu->screen.filename) != 0) - log_error ("Display menu screen <%s> failed!\n", p_menu->screen.filename); + if (p_menu->screen.show) + { + moveto (p_menu->screen.row, p_menu->screen.col); + if (display_file (p_menu->screen.filename) != 0) + log_error ("Display menu screen <%s> failed!\n", + p_menu->screen.filename); + } row = p_menu->items[0]->row; col = p_menu->items[0]->col; for (i = 0; i < p_menu->item_count; i++) { - if (checkpriv (&BBS_priv, 0, p_menu->items[i]->priv) == 0) + if (checkpriv (&BBS_priv, 0, p_menu->items[i]->priv) == 0 + || checklevel (&BBS_priv, p_menu->items[i]->level) == 0) { p_menu->items[i]->display = 0; } @@ -320,6 +342,16 @@ display_menu (MENU * p_menu) return 0; } +int +display_current_menu (MENU_SET * p_menu_set) +{ + MENU *p_menu; + + p_menu = p_menu_set->p_menu_select[p_menu_set->menu_select_depth]; + + return display_menu (p_menu); +} + const char * menu_control (MENU_SET * p_menu_set, int key) { @@ -356,8 +388,7 @@ menu_control (MENU_SET * p_menu_set, int if (p_menu_set->menu_select_depth > 0) { p_menu_set->menu_select_depth--; - p_menu = p_menu_set->p_menu_select[p_menu_set->menu_select_depth]; - if (display_menu (p_menu) != 0) + if (display_current_menu (p_menu_set) != 0) return menu_control (p_menu_set, KEY_LEFT); break; } @@ -365,7 +396,9 @@ menu_control (MENU_SET * p_menu_set, int { 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) + 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) p_menu->item_cur_pos--; display_menu_cursor (p_menu, 1); break; @@ -395,15 +428,49 @@ menu_control (MENU_SET * p_menu_set, int default: for (i = 0; i < p_menu->item_count; i++) { - if (toupper (key) == toupper (p_menu->items[i]->name[0])) + if (key == p_menu->items[i]->name[0]) { display_menu_cursor (p_menu, 0); p_menu->item_cur_pos = i; display_menu_cursor (p_menu, 1); - break; + return ""; + } + } + if (isalpha (key)) + { + for (i = 0; i < p_menu->item_count; i++) + { + if (toupper (key) == toupper (p_menu->items[i]->name[0])) + { + display_menu_cursor (p_menu, 0); + p_menu->item_cur_pos = i; + display_menu_cursor (p_menu, 1); + return ""; + } } } } return ""; } + +void +unload_menu (MENU_SET * p_menu_set) +{ + MENU *p_menu; + MENU_ITEM *p_menuitem; + int i, j; + + for (i = 0; i < p_menu_set->menu_count; i++) + { + p_menu = p_menu_set->p_menu[i]; + for (j = 0; j < p_menu->item_count; j++) + { + free (p_menu->items[j]); + } + free (p_menu); + } + + p_menu_set->menu_count = 0; + p_menu_set->menu_select_depth = 0; +}