/[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.21 by sysadm, Mon Apr 28 03:31:00 2025 UTC Revision 1.28 by sysadm, Mon May 5 11:46:04 2025 UTC
# Line 17  Line 17 
17    
18  #include "bbs.h"  #include "bbs.h"
19  #include "bbs_cmd.h"  #include "bbs_cmd.h"
20    #include "user_priv.h"
21    #include "reg_ex.h"
22    #include "bbs_cmd.h"
23  #include "menu.h"  #include "menu.h"
24    #include "log.h"
25  #include "io.h"  #include "io.h"
26    #include "screen.h"
27  #include "common.h"  #include "common.h"
28    #include <string.h>
29  #include <stdio.h>  #include <stdio.h>
30  #include <ctype.h>  #include <ctype.h>
31  #include <regex.h>  #include <regex.h>
32  #include <stdlib.h>  #include <stdlib.h>
33    
34    #define MENU_TEMP_DIR "var"
35    
36  MENU_SET bbs_menu;  MENU_SET bbs_menu;
37    
38  int load_menu(MENU_SET *p_menu_set, const char *conf_file)  int load_menu(MENU_SET *p_menu_set, const char *conf_file)
39  {  {
40          FILE *fin, *fout;          FILE *fin, *fout;
41          int i = 0, j;          int i = 0, j;
42          char buffer[256], screen_filename[256], temp[256];          char buffer[LINE_BUFFER_LEN];
43            char screen_filename[FILE_PATH_LEN];
44            char temp[LINE_BUFFER_LEN];
45          regmatch_t pmatch[10];          regmatch_t pmatch[10];
46    
47          if ((fin = fopen(conf_file, "r")) == NULL)          if ((fin = fopen(conf_file, "r")) == NULL)
# Line 40  int load_menu(MENU_SET *p_menu_set, cons Line 50  int load_menu(MENU_SET *p_menu_set, cons
50                  return -1;                  return -1;
51          }          }
52    
53          strcpy(p_menu_set->conf_file, conf_file);          strncpy(p_menu_set->conf_file, conf_file, sizeof(p_menu_set->conf_file) - 1);
54            p_menu_set->conf_file[sizeof(p_menu_set->conf_file) - 1] = '\0';
55    
56          while (fgets(buffer, 255, fin))          while (fgets(buffer, sizeof(buffer), fin))
57          {          {
58                  switch (buffer[0])                  switch (buffer[0])
59                  {                  {
# Line 54  int load_menu(MENU_SET *p_menu_set, cons Line 65  int load_menu(MENU_SET *p_menu_set, cons
65                                  strncpy(temp, buffer + pmatch[1].rm_so,                                  strncpy(temp, buffer + pmatch[1].rm_so,
66                                                  pmatch[1].rm_eo - pmatch[1].rm_so);                                                  pmatch[1].rm_eo - pmatch[1].rm_so);
67                                  temp[pmatch[1].rm_eo - pmatch[1].rm_so] = '\0';                                  temp[pmatch[1].rm_eo - pmatch[1].rm_so] = '\0';
68                                  sprintf(screen_filename, "%sMENU_SCR_%s", app_temp_dir, temp);                                  snprintf(screen_filename, sizeof(screen_filename), "%s/MENU_SCR_%s", MENU_TEMP_DIR, temp);
69    
70                                  if ((fout = fopen(screen_filename, "w")) == NULL)                                  if ((fout = fopen(screen_filename, "w")) == NULL)
71                                  {                                  {
# Line 62  int load_menu(MENU_SET *p_menu_set, cons Line 73  int load_menu(MENU_SET *p_menu_set, cons
73                                          return -2;                                          return -2;
74                                  }                                  }
75    
76                                  while (fgets(buffer, 255, fin))                                  while (fgets(buffer, sizeof(buffer), fin))
77                                  {                                  {
78                                          if (buffer[0] != '%')                                          if (buffer[0] != '%')
79                                                  fputs(buffer, fout);                                                  fputs(buffer, fout);
# Line 88  int load_menu(MENU_SET *p_menu_set, cons Line 99  int load_menu(MENU_SET *p_menu_set, cons
99    
100                                  j = 0;                                  j = 0;
101    
102                                  while (fgets(buffer, 255, fin))                                  while (fgets(buffer, sizeof(buffer), fin))
103                                  {                                  {
104                                          if (buffer[0] == '#')                                          if (buffer[0] == '#')
105                                          {                                          {
# Line 239  int load_menu(MENU_SET *p_menu_set, cons Line 250  int load_menu(MENU_SET *p_menu_set, cons
250                                                                  buffer + pmatch[3].rm_so,                                                                  buffer + pmatch[3].rm_so,
251                                                                  pmatch[3].rm_eo - pmatch[3].rm_so);                                                                  pmatch[3].rm_eo - pmatch[3].rm_so);
252                                                  temp[pmatch[3].rm_eo - pmatch[3].rm_so] = '\0';                                                  temp[pmatch[3].rm_eo - pmatch[3].rm_so] = '\0';
253                                                  sprintf(p_menu_set->p_menu[i]->screen.filename,                                                  snprintf(p_menu_set->p_menu[i]->screen.filename,
254                                                                  "%sMENU_SCR_%s", app_temp_dir, temp);                                                                   sizeof(p_menu_set->p_menu[i]->screen.filename),
255                                                                     "%s/MENU_SCR_%s", MENU_TEMP_DIR, temp);
256                                                  continue;                                                  continue;
257                                          }                                          }
258                                  }                                  }
# Line 273  get_menu(MENU_SET *p_menu_set, const cha Line 285  get_menu(MENU_SET *p_menu_set, const cha
285          return NULL;          return NULL;
286  }  }
287    
288  static void  static void display_menu_cursor(MENU *p_menu, int show)
 display_menu_cursor(MENU *p_menu, int show)  
289  {  {
290          moveto((p_menu->items[p_menu->item_cur_pos])->r_row,          moveto((p_menu->items[p_menu->item_cur_pos])->r_row,
291                     (p_menu->items[p_menu->item_cur_pos])->r_col - 2);                     (p_menu->items[p_menu->item_cur_pos])->r_col - 2);
292          prints(show ? ">" : " ");          outc(show ? '>' : ' ');
293          iflush();          iflush();
294  }  }
295    
296  int display_menu(MENU *p_menu)  int display_menu(MENU *p_menu)
297  {  {
298          int i, row, col, menu_selectable = 0;          int row = 0;
299            int col = 0;
300            int menu_selectable = 0;
301    
302          if (p_menu == NULL)          if (p_menu == NULL)
303            {
304                  return -1;                  return -1;
305            }
306    
307          if (p_menu->title.show)          if (p_menu->title.show)
308            {
309                  show_top(p_menu->title.text);                  show_top(p_menu->title.text);
310            }
311    
312          if (p_menu->screen.show)          if (p_menu->screen.show)
313          {          {
314                  moveto(p_menu->screen.row, p_menu->screen.col);                  moveto(p_menu->screen.row, p_menu->screen.col);
315                  if (display_file(p_menu->screen.filename) != 0)                  if (display_file(p_menu->screen.filename) != 0)
316                    {
317                          log_error("Display menu screen <%s> failed!\n",                          log_error("Display menu screen <%s> failed!\n",
318                                            p_menu->screen.filename);                                            p_menu->screen.filename);
319                    }
320          }          }
321    
322          row = p_menu->items[0]->row;          for (int i = 0; i < p_menu->item_count; i++)
         col = p_menu->items[0]->col;  
   
         for (i = 0; i < p_menu->item_count; i++)  
323          {          {
324                    if (p_menu->items[i]->row != 0)
325                    {
326                            row = p_menu->items[i]->row;
327                    }
328                    if (p_menu->items[i]->col != 0)
329                    {
330                            col = p_menu->items[i]->col;
331                    }
332    
333                  if (checkpriv(&BBS_priv, 0, p_menu->items[i]->priv) == 0 || checklevel(&BBS_priv, p_menu->items[i]->level) == 0)                  if (checkpriv(&BBS_priv, 0, p_menu->items[i]->priv) == 0 || checklevel(&BBS_priv, p_menu->items[i]->level) == 0)
334                  {                  {
335                          p_menu->items[i]->display = 0;                          p_menu->items[i]->display = 0;
336                            p_menu->items[i]->r_row = 0;
337                            p_menu->items[i]->r_col = 0;
338                  }                  }
339                  else                  else
340                  {                  {
341                          p_menu->items[i]->display = 1;                          p_menu->items[i]->display = 1;
342    
343                          menu_selectable = 1;                          if (!menu_selectable)
344                            {
345                                    p_menu->item_cur_pos = i;
346                                    menu_selectable = 1;
347                            }
348    
                         if (p_menu->items[i]->row != 0)  
                                 row = p_menu->items[i]->row;  
                         else  
                                 row++;  
349                          p_menu->items[i]->r_row = row;                          p_menu->items[i]->r_row = row;
                         if (p_menu->items[i]->col != 0)  
                                 col = p_menu->items[i]->col;  
350                          p_menu->items[i]->r_col = col;                          p_menu->items[i]->r_col = col;
351    
352                          moveto(row, col);                          moveto(row, col);
353                          prints(p_menu->items[i]->text);                          prints("%s", p_menu->items[i]->text);
354                          iflush();  
355                            row++;
356                  }                  }
357          }          }
358    
359          if (!menu_selectable)          if (!menu_selectable)
360            {
361                  return -1;                  return -1;
362            }
363    
364          display_menu_cursor(p_menu, 1);          display_menu_cursor(p_menu, 1);
365    
# Line 352  int menu_control(MENU_SET *p_menu_set, i Line 381  int menu_control(MENU_SET *p_menu_set, i
381          MENU *p_menu;          MENU *p_menu;
382    
383          if (p_menu_set->menu_count == 0)          if (p_menu_set->menu_count == 0)
384            {
385                  return 0;                  return 0;
386            }
387    
388          p_menu = p_menu_set->p_menu_select[p_menu_set->menu_select_depth];          p_menu = p_menu_set->p_menu_select[p_menu_set->menu_select_depth];
389    
390          switch (key)          switch (key)
391          {          {
392          case CR:          case CR:
393                    igetch(1); // Cleanup remaining '\n' in the buffer
394          case KEY_RIGHT:          case KEY_RIGHT:
395                  if (p_menu->items[p_menu->item_cur_pos]->submenu)                  if (p_menu->items[p_menu->item_cur_pos]->submenu)
396                  {                  {
397                          if (strcmp(p_menu->items[p_menu->item_cur_pos]->action, "..") == 0)                          if (strcmp(p_menu->items[p_menu->item_cur_pos]->action, "..") == 0)
398                            {
399                                  return menu_control(p_menu_set, KEY_LEFT);                                  return menu_control(p_menu_set, KEY_LEFT);
400                            }
401                          p_menu_set->menu_select_depth++;                          p_menu_set->menu_select_depth++;
402                          p_menu =                          p_menu = get_menu(p_menu_set, p_menu->items[p_menu->item_cur_pos]->action);
403                                  p_menu_set->p_menu_select[p_menu_set->menu_select_depth] =                          p_menu_set->p_menu_select[p_menu_set->menu_select_depth] = p_menu;
404                                          get_menu(p_menu_set,  
                                                          p_menu->items[p_menu->item_cur_pos]->action);  
405                          if (display_menu(p_menu) != 0)                          if (display_menu(p_menu) != 0)
406                            {
407                                  return menu_control(p_menu_set, KEY_LEFT);                                  return menu_control(p_menu_set, KEY_LEFT);
408                            }
409                          break;                          break;
410                  }                  }
411                  else                  else
# Line 383  int menu_control(MENU_SET *p_menu_set, i Line 418  int menu_control(MENU_SET *p_menu_set, i
418                  {                  {
419                          p_menu_set->menu_select_depth--;                          p_menu_set->menu_select_depth--;
420                          if (display_current_menu(p_menu_set) != 0)                          if (display_current_menu(p_menu_set) != 0)
421                            {
422                                  return menu_control(p_menu_set, KEY_LEFT);                                  return menu_control(p_menu_set, KEY_LEFT);
423                            }
424                          break;                          break;
425                  }                  }
426                  else                  else
427                  {                  {
428                          display_menu_cursor(p_menu, 0);                          display_menu_cursor(p_menu, 0);
429                          p_menu->item_cur_pos = p_menu->item_count - 1;                          p_menu->item_cur_pos = p_menu->item_count - 1;
430                          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->items[p_menu->item_cur_pos]->display ||
431                                       p_menu->items[p_menu->item_cur_pos]->priv != 0 ||
432                                       p_menu->items[p_menu->item_cur_pos]->level != 0)
433                            {
434                                  p_menu->item_cur_pos--;                                  p_menu->item_cur_pos--;
435                            }
436                          display_menu_cursor(p_menu, 1);                          display_menu_cursor(p_menu, 1);
437                          break;                          break;
438                  }                  }
# Line 401  int menu_control(MENU_SET *p_menu_set, i Line 442  int menu_control(MENU_SET *p_menu_set, i
442                  {                  {
443                          p_menu->item_cur_pos--;                          p_menu->item_cur_pos--;
444                          if (p_menu->item_cur_pos < 0)                          if (p_menu->item_cur_pos < 0)
445                            {
446                                  p_menu->item_cur_pos = p_menu->item_count - 1;                                  p_menu->item_cur_pos = p_menu->item_count - 1;
447                            }
448                  } while (!p_menu->items[p_menu->item_cur_pos]->display);                  } while (!p_menu->items[p_menu->item_cur_pos]->display);
449                  display_menu_cursor(p_menu, 1);                  display_menu_cursor(p_menu, 1);
450                  break;                  break;
# Line 411  int menu_control(MENU_SET *p_menu_set, i Line 454  int menu_control(MENU_SET *p_menu_set, i
454                  {                  {
455                          p_menu->item_cur_pos++;                          p_menu->item_cur_pos++;
456                          if (p_menu->item_cur_pos >= p_menu->item_count)                          if (p_menu->item_cur_pos >= p_menu->item_count)
457                            {
458                                  p_menu->item_cur_pos = 0;                                  p_menu->item_cur_pos = 0;
459                            }
460                  } while (!p_menu->items[p_menu->item_cur_pos]->display);                  } while (!p_menu->items[p_menu->item_cur_pos]->display);
461                  display_menu_cursor(p_menu, 1);                  display_menu_cursor(p_menu, 1);
462                  break;                  break;
# Line 449  int menu_control(MENU_SET *p_menu_set, i Line 494  int menu_control(MENU_SET *p_menu_set, i
494  void unload_menu(MENU_SET *p_menu_set)  void unload_menu(MENU_SET *p_menu_set)
495  {  {
496          MENU *p_menu;          MENU *p_menu;
         MENU_ITEM *p_menuitem;  
497          int i, j;          int i, j;
498    
499          for (i = 0; i < p_menu_set->menu_count; i++)          for (i = 0; i < p_menu_set->menu_count; i++)
# Line 470  void unload_menu(MENU_SET *p_menu_set) Line 514  void unload_menu(MENU_SET *p_menu_set)
514  int reload_menu(MENU_SET *p_menu_set)  int reload_menu(MENU_SET *p_menu_set)
515  {  {
516          int result;          int result;
517          char conf_file[256];          char conf_file[FILE_PATH_LEN];
518    
519            strncpy(conf_file, p_menu_set->conf_file, sizeof(conf_file) - 1);
520            conf_file[sizeof(conf_file) - 1] = '\0';
521    
         strcpy(conf_file, p_menu_set->conf_file);  
522          unload_menu(p_menu_set);          unload_menu(p_menu_set);
523          result = load_menu(p_menu_set, conf_file);          result = load_menu(p_menu_set, conf_file);
524    


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

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