/[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.41 by sysadm, Thu May 15 06:24:11 2025 UTC Revision 1.48 by sysadm, Mon May 19 01:44:49 2025 UTC
# Line 48  int load_menu(MENU_SET *p_menu_set, cons Line 48  int load_menu(MENU_SET *p_menu_set, cons
48          char temp[LINE_BUFFER_LEN];          char temp[LINE_BUFFER_LEN];
49          char *p = NULL;          char *p = NULL;
50          char *q = NULL;          char *q = NULL;
51            char *r = NULL;
52          char *saveptr = NULL;          char *saveptr = NULL;
53          MENU *p_menu = NULL;          MENU *p_menu = NULL;
54          MENU_ITEM *p_menu_item = NULL;          MENU_ITEM *p_menu_item = NULL;
# Line 167  int load_menu(MENU_SET *p_menu_set, cons Line 168  int load_menu(MENU_SET *p_menu_set, cons
168                                          return -1;                                          return -1;
169                                  }                                  }
170                                  p = q;                                  p = q;
171                                  while (isalnum(*q) || *q == '_')                                  while (isalnum(*q) || *q == '_' || *q == '-')
172                                  {                                  {
173                                          q++;                                          q++;
174                                  }                                  }
# Line 250  int load_menu(MENU_SET *p_menu_set, cons Line 251  int load_menu(MENU_SET *p_menu_set, cons
251                                                  else                                                  else
252                                                  {                                                  {
253                                                          q = p;                                                          q = p;
254                                                          while (isalnum(*q) || *q == '_')                                                          while (isalnum(*q) || *q == '_' || *q == '-')
255                                                          {                                                          {
256                                                                  q++;                                                                  q++;
257                                                          }                                                          }
# Line 356  int load_menu(MENU_SET *p_menu_set, cons Line 357  int load_menu(MENU_SET *p_menu_set, cons
357                                                  p = q;                                                  p = q;
358                                                  while (*q != '\0' && *q != '\"')                                                  while (*q != '\0' && *q != '\"')
359                                                  {                                                  {
360                                                            if (*q == '\\')
361                                                            {
362                                                                    r = q;
363                                                                    while (*r != '\0')
364                                                                    {
365                                                                            *r = *(r + 1);
366                                                                            r++;
367                                                                    }
368                                                            }
369                                                          q++;                                                          q++;
370                                                  }                                                  }
371                                                  if (*q != '\"' || *(q + 1) != '\0')                                                  if (*q != '\"' || *(q + 1) != '\0')
# Line 384  int load_menu(MENU_SET *p_menu_set, cons Line 394  int load_menu(MENU_SET *p_menu_set, cons
394                                                  p = q;                                                  p = q;
395                                                  while (*q != '\0' && *q != '\"')                                                  while (*q != '\0' && *q != '\"')
396                                                  {                                                  {
397                                                            if (*q == '\\')
398                                                            {
399                                                                    r = q;
400                                                                    while (*r != '\0')
401                                                                    {
402                                                                            *r = *(r + 1);
403                                                                            r++;
404                                                                    }
405                                                            }
406                                                          q++;                                                          q++;
407                                                  }                                                  }
408                                                  if (*q != '\"')                                                  if (*q != '\"')
# Line 462  int load_menu(MENU_SET *p_menu_set, cons Line 481  int load_menu(MENU_SET *p_menu_set, cons
481                                                  p = q;                                                  p = q;
482                                                  while (*q != '\0' && *q != '\"')                                                  while (*q != '\0' && *q != '\"')
483                                                  {                                                  {
484                                                            if (*q == '\\')
485                                                            {
486                                                                    r = q;
487                                                                    while (*r != '\0')
488                                                                    {
489                                                                            *r = *(r + 1);
490                                                                            r++;
491                                                                    }
492                                                            }
493                                                          q++;                                                          q++;
494                                                  }                                                  }
495                                                  if (*q != '\"')                                                  if (*q != '\"')
# Line 471  int load_menu(MENU_SET *p_menu_set, cons Line 499  int load_menu(MENU_SET *p_menu_set, cons
499                                                  }                                                  }
500                                                  *q = '\0';                                                  *q = '\0';
501    
502                                                  if (q - p > sizeof(p_menu_item->text) - 1)                                                  if (q - p > sizeof(p_menu->title.text) - 1)
503                                                  {                                                  {
504                                                          log_error("Too longer menu title text in menu config line %d\n", fin_line);                                                          log_error("Too longer menu title text in menu config line %d\n", fin_line);
505                                                          return -1;                                                          return -1;
# Line 537  int load_menu(MENU_SET *p_menu_set, cons Line 565  int load_menu(MENU_SET *p_menu_set, cons
565                                                          return -1;                                                          return -1;
566                                                  }                                                  }
567                                                  p = q;                                                  p = q;
568                                                  while (isalnum(*q) || *q == '_')                                                  while (isalnum(*q) || *q == '_' || *q == '-')
569                                                  {                                                  {
570                                                          q++;                                                          q++;
571                                                  }                                                  }
# Line 546  int load_menu(MENU_SET *p_menu_set, cons Line 574  int load_menu(MENU_SET *p_menu_set, cons
574                                                          log_error("Error menu screen name in menu config line %d\n", fin_line);                                                          log_error("Error menu screen name in menu config line %d\n", fin_line);
575                                                          return -1;                                                          return -1;
576                                                  }                                                  }
577                                                  if (trie_dict_get(p_menu_set->p_menu_screen_dict, p, (int64_t *)&screen_id) != 1)                                                  strncpy(p_menu->screen_name, p, sizeof(p_menu->screen_name) - 1);
578                                                  {                                                  p_menu->screen_name[sizeof(p_menu->screen_name) - 1] = '\0';
                                                         log_error("Undefined menu screen [%s]\n", p);  
                                                         return -1;  
                                                 }  
                                                 p_menu->screen_id = screen_id;  
579    
580                                                  // Check syntax                                                  // Check syntax
581                                                  q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);                                                  q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
# Line 576  int load_menu(MENU_SET *p_menu_set, cons Line 600  int load_menu(MENU_SET *p_menu_set, cons
600                                  p_screen = get_menu_screen_by_id(p_menu_set, screen_id);                                  p_screen = get_menu_screen_by_id(p_menu_set, screen_id);
601    
602                                  q = p;                                  q = p;
603                                  while (isalnum(*q) || *q == '_')                                  while (isalnum(*q) || *q == '_' || *q == '-')
604                                  {                                  {
605                                          q++;                                          q++;
606                                  }                                  }
# Line 628  int load_menu(MENU_SET *p_menu_set, cons Line 652  int load_menu(MENU_SET *p_menu_set, cons
652                                                  break;                                                  break;
653                                          }                                          }
654    
655                                            // Clear line
656                                            if (p_menu_set->p_menu_screen_buf_free + strlen(CTRL_SEQ_CLR_LINE) > q)
657                                            {
658                                                    log_error("Menu screen buffer depleted (%p + %d > %p)\n", p_menu_set->p_menu_screen_buf_free, q, strlen(CTRL_SEQ_CLR_LINE));
659                                                    return -3;
660                                            }
661                                            p_menu_set->p_menu_screen_buf_free = stpcpy(p_menu_set->p_menu_screen_buf_free, CTRL_SEQ_CLR_LINE);
662    
663                                          p = buffer;                                          p = buffer;
664                                          while (*p != '\0')                                          while (*p != '\0')
665                                          {                                          {
# Line 663  int load_menu(MENU_SET *p_menu_set, cons Line 695  int load_menu(MENU_SET *p_menu_set, cons
695          }          }
696          fclose(fin);          fclose(fin);
697    
698          // Set menu_item->action_menu_id of each menu item pointing to a submenu to the menu_id of the corresponding submenu          for (menu_id = 0; menu_id < p_menu_set->menu_count; menu_id++)
699            {
700                    p_menu = get_menu_by_id(p_menu_set, menu_id);
701    
702                    if (trie_dict_get(p_menu_set->p_menu_screen_dict, p_menu->screen_name, (int64_t *)(&(p_menu->screen_id))) != 1)
703                    {
704                            log_error("Undefined menu screen [%s]\n", p);
705                            return -1;
706                    }
707            }
708    
709          for (menu_item_id = 0; menu_item_id < p_menu_set->menu_item_count; menu_item_id++)          for (menu_item_id = 0; menu_item_id < p_menu_set->menu_item_count; menu_item_id++)
710          {          {
711                  p_menu_item = get_menu_item_by_id(p_menu_set, menu_item_id);                  p_menu_item = get_menu_item_by_id(p_menu_set, menu_item_id);
712                  if (p_menu_item->submenu == 1 && strcmp(p_menu_item->action, "..") != 0)  
713                    // Set menu_item->action_cmd_handler of each menu item pointing to bbs_cmd
714                    if (p_menu_item->submenu == 0)
715                    {
716                            if ((p_menu_item->action_cmd_handler = get_cmd_handler(p_menu_item->action)) == NULL)
717                            {
718                                    log_error("Undefined menu action cmd handler [%s]\n", p_menu_item->action);
719                                    return -1;
720                            }
721                    }
722                    // Set menu_item->action_menu_id of each menu item pointing to a submenu to the menu_id of the corresponding submenu
723                    else if (strcmp(p_menu_item->action, "..") != 0)
724                  {                  {
725                          if (trie_dict_get(p_menu_set->p_menu_name_dict, p_menu_item->action, (int64_t *)&menu_id) != 1)                          if (trie_dict_get(p_menu_set->p_menu_name_dict, p_menu_item->action, (int64_t *)&menu_id) != 1)
726                          {                          {
727                                  log_error("Undefined menu action [%s]\n", p_menu_item->action);                                  log_error("Undefined sub menu id [%s]\n", p_menu_item->action);
728                                  return -1;                                  return -1;
729                          }                          }
730                          p_menu_item->action_menu_id = menu_id;                          p_menu_item->action_menu_id = menu_id;
# Line 713  static int display_menu_cursor(MENU_SET Line 766  static int display_menu_cursor(MENU_SET
766    
767          moveto(p_menu_set->menu_item_r_row[menu_item_pos], p_menu_set->menu_item_r_col[menu_item_pos] - 2);          moveto(p_menu_set->menu_item_r_row[menu_item_pos], p_menu_set->menu_item_r_col[menu_item_pos] - 2);
768          outc(show ? '>' : ' ');          outc(show ? '>' : ' ');
         iflush();  
769    
770          return 0;          return 0;
771  }  }
# Line 756  int display_menu(MENU_SET *p_menu_set) Line 808  int display_menu(MENU_SET *p_menu_set)
808    
809          if (p_menu->title.show)          if (p_menu->title.show)
810          {          {
811                  show_top(p_menu->title.text);                  if (p_menu->title.row == 0 && p_menu->title.col == 0)
812                    {
813                            show_top(p_menu->title.text);
814                    }
815                    else
816                    {
817                            moveto(p_menu->title.row, p_menu->title.col);
818                            prints("%s", p_menu->title.text);
819                    }
820          }          }
821    
822          if (p_menu->screen_show)          if (p_menu->screen_show)
# Line 768  int display_menu(MENU_SET *p_menu_set) Line 828  int display_menu(MENU_SET *p_menu_set)
828                          return -1;                          return -1;
829                  }                  }
830    
831                  moveto(p_menu->screen_row, p_menu->screen_col);                  row = p_menu->screen_row;
832                    col = p_menu->screen_col;
833    
834                    moveto(row, col);
835                  prints("%s", p_menu_set->p_menu_screen_buf + p_menu_screen->buf_offset);                  prints("%s", p_menu_set->p_menu_screen_buf + p_menu_screen->buf_offset);
                 iflush();  
836          }          }
837    
838          for (menu_item_pos = 0; menu_item_pos < p_menu->item_count; menu_item_pos++)          for (menu_item_pos = 0; menu_item_pos < p_menu->item_count; menu_item_pos++)
# Line 880  int menu_control(MENU_SET *p_menu_set, i Line 942  int menu_control(MENU_SET *p_menu_set, i
942                  }                  }
943                  else                  else
944                  {                  {
945                          return (exec_cmd(p_menu_item->action, p_menu_item->name));                          return ((*(p_menu_item->action_cmd_handler))((void *)(p_menu_item->name)));
946                  }                  }
947                  break;                  break;
948          case KEY_LEFT:          case KEY_LEFT:
# Line 891  int menu_control(MENU_SET *p_menu_set, i Line 953  int menu_control(MENU_SET *p_menu_set, i
953                          {                          {
954                                  return menu_control(p_menu_set, KEY_LEFT);                                  return menu_control(p_menu_set, KEY_LEFT);
955                          }                          }
956                            if (p_menu_set->choose_step == 0)
957                            {
958                                    return REDRAW;
959                            }
960                  }                  }
961                  else                  else
962                  {                  {
# Line 959  int menu_control(MENU_SET *p_menu_set, i Line 1025  int menu_control(MENU_SET *p_menu_set, i
1025                  p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos;                  p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos;
1026                  display_menu_cursor(p_menu_set, 1);                  display_menu_cursor(p_menu_set, 1);
1027                  break;                  break;
1028            case KEY_HOME:
1029            case KEY_PGUP:
1030                    display_menu_cursor(p_menu_set, 0);
1031                    menu_item_pos = 0;
1032                    while (menu_item_pos < p_menu->item_count - 1)
1033                    {
1034                            menu_item_id = p_menu->items[menu_item_pos];
1035                            p_menu_item = get_menu_item_by_id(p_menu_set, menu_item_id);
1036                            if (p_menu_item == NULL)
1037                            {
1038                                    log_error("get_menu_item_by_id(%d) return NULL pointer\n", menu_item_id);
1039                                    return -1;
1040                            }
1041    
1042                            if (p_menu_set->menu_item_display[menu_item_pos])
1043                            {
1044                                    break;
1045                            }
1046    
1047                            menu_item_pos++;
1048                    }
1049                    p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos;
1050                    display_menu_cursor(p_menu_set, 1);
1051                    break;
1052            case KEY_END:
1053            case KEY_PGDN:
1054                    display_menu_cursor(p_menu_set, 0);
1055                    menu_item_pos = p_menu->item_count - 1;
1056                    while (menu_item_pos > 0)
1057                    {
1058                            menu_item_id = p_menu->items[menu_item_pos];
1059                            p_menu_item = get_menu_item_by_id(p_menu_set, menu_item_id);
1060                            if (p_menu_item == NULL)
1061                            {
1062                                    log_error("get_menu_item_by_id(%d) return NULL pointer\n", menu_item_id);
1063                                    return -1;
1064                            }
1065    
1066                            if (p_menu_set->menu_item_display[menu_item_pos])
1067                            {
1068                                    break;
1069                            }
1070    
1071                            menu_item_pos--;
1072                    }
1073                    p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos;
1074                    display_menu_cursor(p_menu_set, 1);
1075                    break;
1076          default:          default:
1077                  if (isalnum(key))                  if (isalnum(key))
1078                  {                  {
# Line 984  int menu_control(MENU_SET *p_menu_set, i Line 1098  int menu_control(MENU_SET *p_menu_set, i
1098                  break;                  break;
1099          }          }
1100    
1101          return 0;          return NOREDRAW;
1102  }  }
1103    
1104  int unload_menu(MENU_SET *p_menu_set)  int unload_menu(MENU_SET *p_menu_set)
# Line 1015  int unload_menu(MENU_SET *p_menu_set) Line 1129  int unload_menu(MENU_SET *p_menu_set)
1129  int load_menu_shm(MENU_SET *p_menu_set)  int load_menu_shm(MENU_SET *p_menu_set)
1130  {  {
1131          // Mount shared memory          // Mount shared memory
1132          if (p_menu_set->p_reserved != NULL)          if (p_menu_set->p_reserved == NULL)
1133          {          {
1134                  log_error("Menu is already loaded\n");                  p_menu_set->p_reserved = shmat(p_menu_set->shmid, NULL, SHM_RDONLY);
1135                  return -1;                  if (p_menu_set->p_reserved == (void *)-1)
1136                    {
1137                            log_error("shmat() error (%d)\n", errno);
1138                            return -1;
1139                    }
1140          }          }
1141    
         p_menu_set->p_reserved = shmat(p_menu_set->shmid, NULL, SHM_RDONLY);  
         if (p_menu_set->p_reserved == (void *)-1)  
         {  
                 log_error("shmat() error (%d)\n", errno);  
                 return -2;  
         }  
1142          p_menu_set->p_menu_pool = p_menu_set->p_reserved + MENU_SET_RESERVED_LENGTH;          p_menu_set->p_menu_pool = p_menu_set->p_reserved + MENU_SET_RESERVED_LENGTH;
1143          p_menu_set->p_menu_item_pool = p_menu_set->p_menu_pool + sizeof(MENU) * MAX_MENUS;          p_menu_set->p_menu_item_pool = p_menu_set->p_menu_pool + sizeof(MENU) * MAX_MENUS;
1144          p_menu_set->p_menu_screen_pool = p_menu_set->p_menu_item_pool + sizeof(MENU_ITEM) * MAX_MENUITEMS;          p_menu_set->p_menu_screen_pool = p_menu_set->p_menu_item_pool + sizeof(MENU_ITEM) * MAX_MENUITEMS;


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

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