/[LeafOK_CVS]/lbbs/src/menu.c
ViewVC logotype

Diff of /lbbs/src/menu.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.32 by sysadm, Thu May 8 09:06:03 2025 UTC Revision 1.39 by sysadm, Wed May 14 04:22:45 2025 UTC
# Line 17  Line 17 
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"
# Line 42  int load_menu(MENU_SET *p_menu_set, cons Line 41  int load_menu(MENU_SET *p_menu_set, cons
41          int i = 0;          int i = 0;
42          int j = 0;          int j = 0;
43          char buffer[LINE_BUFFER_LEN];          char buffer[LINE_BUFFER_LEN];
44            char temp[LINE_BUFFER_LEN];
45          char screen_filename[FILE_PATH_LEN];          char screen_filename[FILE_PATH_LEN];
46          char *p = NULL;          char *p = NULL;
47          char *q = NULL;          char *q = NULL;
# Line 50  int load_menu(MENU_SET *p_menu_set, cons Line 50  int load_menu(MENU_SET *p_menu_set, cons
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          {          {
# Line 83  int load_menu(MENU_SET *p_menu_set, cons Line 84  int load_menu(MENU_SET *p_menu_set, cons
84                          {                          {
85                                  if (p_menu != NULL)                                  if (p_menu != NULL)
86                                  {                                  {
87                                          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);
88                                          return -1;                                          return -1;
89                                  }                                  }
90                                  p_menu = (MENU *)malloc(sizeof(MENU));                                  p_menu = (MENU *)malloc(sizeof(MENU));
# Line 126  int load_menu(MENU_SET *p_menu_set, cons Line 127  int load_menu(MENU_SET *p_menu_set, cons
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);
# Line 521  int load_menu(MENU_SET *p_menu_set, cons Line 526  int load_menu(MENU_SET *p_menu_set, cons
526                                  {                                  {
527                                          fin_line++;                                          fin_line++;
528    
529                                          p = strtok_r(buffer, MENU_CONF_DELIM_WITH_SPACE, &saveptr);                                          strncpy(temp, buffer, sizeof(temp)); // Duplicate line for strtok_r
530                                            p = strtok_r(temp, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
531                                          if (p != NULL && *p == '%') // END of menu screen                                          if (p != NULL && *p == '%') // END of menu screen
532                                          {                                          {
533                                                  break;                                                  break;
# Line 554  int load_menu(MENU_SET *p_menu_set, cons Line 560  int load_menu(MENU_SET *p_menu_set, cons
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;
# Line 586  int display_menu(MENU *p_menu) Line 592  int display_menu(MENU *p_menu)
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);
# Line 672  int menu_control(MENU_SET *p_menu_set, i Line 685  int menu_control(MENU_SET *p_menu_set, i
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                  {                  {
# Line 688  int menu_control(MENU_SET *p_menu_set, i Line 700  int menu_control(MENU_SET *p_menu_set, i
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                  {                  {
# Line 703  int menu_control(MENU_SET *p_menu_set, i Line 715  int menu_control(MENU_SET *p_menu_set, i
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
# Line 757  int menu_control(MENU_SET *p_menu_set, i Line 768  int menu_control(MENU_SET *p_menu_set, i
768                                  }                                  }
769                          }                          }
770                  }                  }
771                    break;
772          }          }
773    
774          return 0;          return 0;
# Line 767  void unload_menu(MENU_SET *p_menu_set) Line 779  void unload_menu(MENU_SET *p_menu_set)
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];


Legend:
Removed lines/characters  
Changed lines/characters
  Added lines/characters

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1