| 17 |
#include "bbs.h" |
#include "bbs.h" |
| 18 |
#include "bbs_cmd.h" |
#include "bbs_cmd.h" |
| 19 |
#include "user_priv.h" |
#include "user_priv.h" |
|
#include "reg_ex.h" |
|
| 20 |
#include "bbs_cmd.h" |
#include "bbs_cmd.h" |
| 21 |
#include "menu.h" |
#include "menu.h" |
| 22 |
#include "log.h" |
#include "log.h" |
| 50 |
MENU_ITEM *p_item = NULL; |
MENU_ITEM *p_item = NULL; |
| 51 |
|
|
| 52 |
p_menu_set->menu_count = 0; |
p_menu_set->menu_count = 0; |
| 53 |
|
p_menu_set->p_menu_name_dict = trie_dict_create(); |
| 54 |
|
|
| 55 |
if ((fin = fopen(conf_file, "r")) == NULL) |
if ((fin = fopen(conf_file, "r")) == NULL) |
| 56 |
{ |
{ |
| 127 |
} |
} |
| 128 |
strncpy(p_menu->name, p, sizeof(p_menu->name) - 1); |
strncpy(p_menu->name, p, sizeof(p_menu->name) - 1); |
| 129 |
p_menu->name[sizeof(p_menu->name) - 1] = '\0'; |
p_menu->name[sizeof(p_menu->name) - 1] = '\0'; |
| 130 |
|
if (trie_dict_set(p_menu_set->p_menu_name_dict, p_menu->name, (int64_t)p_menu) != 1) |
| 131 |
|
{ |
| 132 |
|
log_error("Error set menu dict [%s]\n", p_menu->name); |
| 133 |
|
} |
| 134 |
|
|
| 135 |
// Check syntax |
// Check syntax |
| 136 |
q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr); |
q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr); |
| 560 |
|
|
| 561 |
MENU *get_menu(MENU_SET *p_menu_set, const char *menu_name) |
MENU *get_menu(MENU_SET *p_menu_set, const char *menu_name) |
| 562 |
{ |
{ |
| 563 |
int i; |
int ret; |
| 564 |
|
int64_t value = 0; |
| 565 |
|
|
| 566 |
for (i = 0; i < p_menu_set->menu_count; i++) |
ret = trie_dict_get(p_menu_set->p_menu_name_dict, menu_name, &value); |
| 567 |
|
|
| 568 |
|
if (ret == 1) // found |
| 569 |
{ |
{ |
| 570 |
if (strcmp(p_menu_set->p_menu[i]->name, menu_name) == 0) |
return ((MENU *)value); |
|
{ |
|
|
return p_menu_set->p_menu[i]; |
|
|
} |
|
| 571 |
} |
} |
| 572 |
|
|
| 573 |
return NULL; |
return NULL; |
| 592 |
return -1; |
return -1; |
| 593 |
} |
} |
| 594 |
|
|
| 595 |
|
if (p_menu->item_cur_pos > 0 && |
| 596 |
|
checkpriv(&BBS_priv, 0, p_menu->items[p_menu->item_cur_pos]->priv) != 0 && |
| 597 |
|
checklevel(&BBS_priv, p_menu->items[p_menu->item_cur_pos]->level) != 0) |
| 598 |
|
{ |
| 599 |
|
menu_selectable = 1; |
| 600 |
|
} |
| 601 |
|
|
| 602 |
if (p_menu->title.show) |
if (p_menu->title.show) |
| 603 |
{ |
{ |
| 604 |
show_top(p_menu->title.text); |
show_top(p_menu->title.text); |
| 685 |
switch (key) |
switch (key) |
| 686 |
{ |
{ |
| 687 |
case CR: |
case CR: |
|
igetch(1); // Cleanup remaining '\n' in the buffer |
|
| 688 |
case KEY_RIGHT: |
case KEY_RIGHT: |
| 689 |
if (p_menu->items[p_menu->item_cur_pos]->submenu) |
if (p_menu->items[p_menu->item_cur_pos]->submenu) |
| 690 |
{ |
{ |
| 700 |
{ |
{ |
| 701 |
return menu_control(p_menu_set, KEY_LEFT); |
return menu_control(p_menu_set, KEY_LEFT); |
| 702 |
} |
} |
|
break; |
|
| 703 |
} |
} |
| 704 |
else |
else |
| 705 |
{ |
{ |
| 706 |
return (exec_cmd(p_menu->items[p_menu->item_cur_pos]->action, |
return (exec_cmd(p_menu->items[p_menu->item_cur_pos]->action, |
| 707 |
p_menu->items[p_menu->item_cur_pos]->name)); |
p_menu->items[p_menu->item_cur_pos]->name)); |
| 708 |
} |
} |
| 709 |
|
break; |
| 710 |
case KEY_LEFT: |
case KEY_LEFT: |
| 711 |
if (p_menu_set->menu_select_depth > 0) |
if (p_menu_set->menu_select_depth > 0) |
| 712 |
{ |
{ |
| 715 |
{ |
{ |
| 716 |
return menu_control(p_menu_set, KEY_LEFT); |
return menu_control(p_menu_set, KEY_LEFT); |
| 717 |
} |
} |
|
break; |
|
| 718 |
} |
} |
| 719 |
else |
else |
| 720 |
{ |
{ |
| 721 |
display_menu_cursor(p_menu, 0); |
display_menu_cursor(p_menu, 0); |
| 722 |
p_menu->item_cur_pos = p_menu->item_count - 1; |
p_menu->item_cur_pos = p_menu->item_count - 1; |
| 723 |
while (!p_menu->items[p_menu->item_cur_pos]->display || |
while (p_menu->item_cur_pos >= 0 && (!p_menu->items[p_menu->item_cur_pos]->display || |
| 724 |
p_menu->items[p_menu->item_cur_pos]->priv != 0 || |
p_menu->items[p_menu->item_cur_pos]->priv != 0 || |
| 725 |
p_menu->items[p_menu->item_cur_pos]->level != 0) |
p_menu->items[p_menu->item_cur_pos]->level != 0)) |
| 726 |
{ |
{ |
| 727 |
p_menu->item_cur_pos--; |
p_menu->item_cur_pos--; |
| 728 |
} |
} |
| 729 |
display_menu_cursor(p_menu, 1); |
display_menu_cursor(p_menu, 1); |
|
break; |
|
| 730 |
} |
} |
| 731 |
|
break; |
| 732 |
case KEY_UP: |
case KEY_UP: |
| 733 |
display_menu_cursor(p_menu, 0); |
display_menu_cursor(p_menu, 0); |
| 734 |
do |
do |
| 768 |
} |
} |
| 769 |
} |
} |
| 770 |
} |
} |
| 771 |
|
break; |
| 772 |
} |
} |
| 773 |
|
|
| 774 |
return 0; |
return 0; |
| 779 |
MENU *p_menu; |
MENU *p_menu; |
| 780 |
int i, j; |
int i, j; |
| 781 |
|
|
| 782 |
|
if (p_menu_set->p_menu_name_dict != NULL) |
| 783 |
|
{ |
| 784 |
|
trie_dict_destroy(p_menu_set->p_menu_name_dict); |
| 785 |
|
p_menu_set->p_menu_name_dict = NULL; |
| 786 |
|
} |
| 787 |
|
|
| 788 |
for (i = 0; i < p_menu_set->menu_count; i++) |
for (i = 0; i < p_menu_set->menu_count; i++) |
| 789 |
{ |
{ |
| 790 |
p_menu = p_menu_set->p_menu[i]; |
p_menu = p_menu_set->p_menu[i]; |