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

Annotation of /lbbs/src/menu.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.32 - (hide annotations)
Thu May 8 09:06:03 2025 UTC (10 months, 1 week ago) by sysadm
Branch: MAIN
Changes since 1.31: +1 -1 lines
Content type: text/x-csrc
Update

1 sysadm 1.1 /***************************************************************************
2 sysadm 1.21 menu.c - description
3     -------------------
4 sysadm 1.30 Copyright : (C) 2004-2025 by Leaflet
5     Email : leaflet@leafok.com
6 sysadm 1.1 ***************************************************************************/
7    
8     /***************************************************************************
9     * *
10     * This program is free software; you can redistribute it and/or modify *
11     * it under the terms of the GNU General Public License as published by *
12 sysadm 1.30 * the Free Software Foundation; either version 3 of the License, or *
13 sysadm 1.1 * (at your option) any later version. *
14     * *
15     ***************************************************************************/
16    
17 sysadm 1.3 #include "bbs.h"
18 sysadm 1.17 #include "bbs_cmd.h"
19 sysadm 1.22 #include "user_priv.h"
20     #include "reg_ex.h"
21     #include "bbs_cmd.h"
22 sysadm 1.1 #include "menu.h"
23 sysadm 1.22 #include "log.h"
24 sysadm 1.1 #include "io.h"
25 sysadm 1.22 #include "screen.h"
26 sysadm 1.2 #include "common.h"
27 sysadm 1.22 #include <string.h>
28 sysadm 1.1 #include <stdio.h>
29     #include <ctype.h>
30 sysadm 1.6 #include <stdlib.h>
31 sysadm 1.1
32 sysadm 1.31 #define MENU_SCREEN_PATH_PREFIX "var/MENU_SCR_"
33     #define MENU_CONF_DELIM_WITH_SPACE " ,\t\r\n"
34     #define MENU_CONF_DELIM_WITHOUT_SPACE "\r\n"
35 sysadm 1.25
36 sysadm 1.2 MENU_SET bbs_menu;
37 sysadm 1.1
38 sysadm 1.21 int load_menu(MENU_SET *p_menu_set, const char *conf_file)
39 sysadm 1.1 {
40 sysadm 1.21 FILE *fin, *fout;
41 sysadm 1.31 int fin_line = 0;
42     int i = 0;
43     int j = 0;
44 sysadm 1.23 char buffer[LINE_BUFFER_LEN];
45 sysadm 1.25 char screen_filename[FILE_PATH_LEN];
46 sysadm 1.31 char *p = NULL;
47     char *q = NULL;
48     char *saveptr = NULL;
49     MENU *p_menu = NULL;
50     MENU_ITEM *p_item = NULL;
51    
52     p_menu_set->menu_count = 0;
53 sysadm 1.21
54     if ((fin = fopen(conf_file, "r")) == NULL)
55     {
56     log_error("Open %s failed", conf_file);
57 sysadm 1.31 return -2;
58 sysadm 1.21 }
59    
60 sysadm 1.27 strncpy(p_menu_set->conf_file, conf_file, sizeof(p_menu_set->conf_file) - 1);
61     p_menu_set->conf_file[sizeof(p_menu_set->conf_file) - 1] = '\0';
62 sysadm 1.21
63 sysadm 1.23 while (fgets(buffer, sizeof(buffer), fin))
64 sysadm 1.3 {
65 sysadm 1.31 fin_line++;
66    
67     p = strtok_r(buffer, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
68     if (p == NULL) // Blank line
69 sysadm 1.21 {
70 sysadm 1.31 continue;
71     }
72    
73     if (*p == '#' || *p == '\r' || *p == '\n') // Comment or blank line
74     {
75     continue;
76     }
77    
78     if (*p == '%')
79     {
80     p++;
81    
82     if (strcmp(p, "menu") == 0) // BEGIN of sub-menu
83 sysadm 1.21 {
84 sysadm 1.31 if (p_menu != NULL)
85     {
86     log_error("Begin new menu without end the prior one, in menu config line %d\n", fin_line);
87     return -1;
88     }
89     p_menu = (MENU *)malloc(sizeof(MENU));
90     if (p_menu == NULL)
91     {
92     log_error("Unable to allocate memory for menu\n");
93     return -3;
94     }
95     p_menu_set->p_menu[i] = p_menu;
96     i++;
97     p_menu_set->menu_count = i;
98 sysadm 1.21
99 sysadm 1.31 j = 0; // Menu item counter
100     p_menu->item_count = 0;
101     p_menu->item_cur_pos = 0;
102     p_menu->title.show = 0;
103     p_menu->screen.show = 0;
104    
105     q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
106     if (q == NULL)
107     {
108     log_error("Error menu name in menu config line %d\n", fin_line);
109     return -1;
110     }
111     p = q;
112     while (isalnum(*q) || *q == '_')
113     {
114     q++;
115     }
116     if (*q != '\0')
117 sysadm 1.21 {
118 sysadm 1.31 log_error("Error menu name in menu config line %d\n", fin_line);
119     return -1;
120 sysadm 1.21 }
121    
122 sysadm 1.31 if (q - p > sizeof(p_menu->name) - 1)
123 sysadm 1.21 {
124 sysadm 1.31 log_error("Too longer menu name in menu config line %d\n", fin_line);
125     return -1;
126 sysadm 1.21 }
127 sysadm 1.31 strncpy(p_menu->name, p, sizeof(p_menu->name) - 1);
128     p_menu->name[sizeof(p_menu->name) - 1] = '\0';
129 sysadm 1.21
130 sysadm 1.31 // Check syntax
131     q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
132     if (q != NULL)
133     {
134     log_error("Unknown extra content in menu config line %d\n", fin_line);
135     return -1;
136     }
137 sysadm 1.21
138 sysadm 1.31 while (fgets(buffer, sizeof(buffer), fin))
139     {
140     fin_line++;
141 sysadm 1.21
142 sysadm 1.31 p = strtok_r(buffer, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
143     if (p == NULL) // Blank line
144     {
145     continue;
146     }
147 sysadm 1.21
148 sysadm 1.31 if (*p == '#' || *p == '\r' || *p == '\n') // Comment or blank line
149 sysadm 1.21 {
150     continue;
151     }
152 sysadm 1.31
153     if (*p == '%') // END of sub-menu
154 sysadm 1.21 {
155 sysadm 1.31 p_menu = NULL;
156 sysadm 1.21 break;
157     }
158 sysadm 1.31 else if (*p == '!' || *p == '@')
159 sysadm 1.21 {
160 sysadm 1.31 // BEGIN of menu item
161     p_item = (MENU_ITEM *)malloc(sizeof(MENU_ITEM));
162     if (p_item == NULL)
163     {
164     log_error("Unable to allocate memory for menu item\n");
165     return -3;
166     }
167     p_menu->items[j] = p_item;
168 sysadm 1.21 j++;
169 sysadm 1.31 p_menu->item_count = j;
170    
171     p_item->submenu = (*p == '!' ? 1 : 0);
172    
173     // Menu item action
174     p++;
175     if (strcmp(p, "..") == 0) // Return to parent menu
176     {
177     q = p + 2; // strlen("..")
178     }
179     else
180     {
181     q = p;
182     while (isalnum(*q) || *q == '_')
183     {
184     q++;
185     }
186     if (*q != '\0')
187     {
188     log_error("Error menu item action in menu config line %d\n", fin_line);
189     return -1;
190     }
191     }
192    
193     if (q - p > sizeof(p_item->action) - 1)
194     {
195     log_error("Too longer menu action in menu config line %d\n", fin_line);
196     return -1;
197     }
198     strncpy(p_item->action, p, sizeof(p_item->action) - 1);
199     p_item->action[sizeof(p_item->action) - 1] = '\0';
200    
201     // Menu item row
202     q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
203     if (q == NULL)
204     {
205     log_error("Error menu item row in menu config line %d\n", fin_line);
206     return -1;
207     }
208     p = q;
209     while (isdigit(*q))
210     {
211     q++;
212     }
213     if (*q != '\0')
214     {
215     log_error("Error menu item row in menu config line %d\n", fin_line);
216     return -1;
217     }
218     p_item->row = atoi(p);
219    
220     // Menu item col
221     q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
222     if (q == NULL)
223     {
224     log_error("Error menu item col in menu config line %d\n", fin_line);
225     return -1;
226     }
227     p = q;
228     while (isdigit(*q))
229     {
230     q++;
231     }
232     if (*q != '\0')
233     {
234     log_error("Error menu item col in menu config line %d\n", fin_line);
235     return -1;
236     }
237     p_item->col = atoi(p);
238    
239     // Menu item priv
240     q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
241     if (q == NULL)
242     {
243     log_error("Error menu item priv in menu config line %d\n", fin_line);
244     return -1;
245     }
246     p = q;
247     while (isdigit(*q))
248     {
249     q++;
250     }
251     if (*q != '\0')
252     {
253     log_error("Error menu item priv in menu config line %d\n", fin_line);
254     return -1;
255     }
256     p_item->priv = atoi(p);
257    
258     // Menu item level
259     q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
260     if (q == NULL)
261     {
262     log_error("Error menu item level in menu config line %d\n", fin_line);
263     return -1;
264     }
265     p = q;
266     while (isdigit(*q))
267     {
268     q++;
269     }
270     if (*q != '\0')
271     {
272     log_error("Error menu item level in menu config line %d\n", fin_line);
273     return -1;
274     }
275     p_item->level = atoi(p);
276    
277     // Menu item name
278     q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
279     if (q == NULL || *q != '\"')
280     {
281     log_error("Error menu item name in menu config line %d\n", fin_line);
282     return -1;
283     }
284     q++;
285     p = q;
286     while (*q != '\0' && *q != '\"')
287     {
288     q++;
289     }
290     if (*q != '\"' || *(q + 1) != '\0')
291     {
292     log_error("Error menu item name in menu config line %d\n", fin_line);
293     return -1;
294     }
295     *q = '\0';
296    
297     if (q - p > sizeof(p_item->name) - 1)
298     {
299     log_error("Too longer menu name in menu config line %d\n", fin_line);
300     return -1;
301     }
302     strncpy(p_item->name, p, sizeof(p_item->name) - 1);
303     p_item->name[sizeof(p_item->name) - 1] = '\0';
304    
305     // Menu item text
306     q = strtok_r(NULL, MENU_CONF_DELIM_WITHOUT_SPACE, &saveptr);
307     if (q == NULL || (q = strchr(q, '\"')) == NULL)
308     {
309 sysadm 1.32 log_error("Error menu item text in menu config line %d\n", fin_line);
310 sysadm 1.31 return -1;
311     }
312     q++;
313     p = q;
314     while (*q != '\0' && *q != '\"')
315     {
316     q++;
317     }
318     if (*q != '\"')
319     {
320     log_error("Error menu item text in menu config line %d\n", fin_line);
321     return -1;
322     }
323     *q = '\0';
324    
325     if (q - p > sizeof(p_item->text) - 1)
326     {
327     log_error("Too longer menu item text in menu config line %d\n", fin_line);
328     return -1;
329     }
330     strncpy(p_item->text, p, sizeof(p_item->text) - 1);
331     p_item->text[sizeof(p_item->text) - 1] = '\0';
332    
333     // Check syntax
334     q = strtok_r(q + 1, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
335     if (q != NULL)
336     {
337     log_error("Unknown extra content in menu config line %d\n", fin_line);
338     return -1;
339     }
340     }
341     else if (strcmp(p, "title") == 0)
342     {
343     p_menu->title.show = 1;
344    
345     // Menu title row
346     q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
347     if (q == NULL)
348     {
349     log_error("Error menu title row in menu config line %d\n", fin_line);
350     return -1;
351     }
352     p = q;
353     while (isdigit(*q))
354     {
355     q++;
356     }
357     if (*q != '\0')
358     {
359     log_error("Error menu title row in menu config line %d\n", fin_line);
360     return -1;
361     }
362     p_menu->title.row = atoi(p);
363    
364     // Menu title col
365     q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
366     if (q == NULL)
367     {
368     log_error("Error menu title col in menu config line %d\n", fin_line);
369     return -1;
370     }
371     p = q;
372     while (isdigit(*q))
373     {
374     q++;
375     }
376     if (*q != '\0')
377     {
378     log_error("Error menu title col in menu config line %d\n", fin_line);
379     return -1;
380     }
381     p_menu->title.col = atoi(p);
382    
383     // Menu title text
384     q = strtok_r(NULL, MENU_CONF_DELIM_WITHOUT_SPACE, &saveptr);
385     if (q == NULL || (q = strchr(q, '\"')) == NULL)
386     {
387     log_error("Error menu title text in menu config line %d\n", fin_line);
388     return -1;
389     }
390     q++;
391     p = q;
392     while (*q != '\0' && *q != '\"')
393     {
394     q++;
395     }
396     if (*q != '\"')
397     {
398     log_error("Error menu title text in menu config line %d\n", fin_line);
399     return -1;
400     }
401     *q = '\0';
402    
403     if (q - p > sizeof(p_item->text) - 1)
404     {
405     log_error("Too longer menu title text in menu config line %d\n", fin_line);
406     return -1;
407     }
408     strncpy(p_menu->title.text, p, sizeof(p_menu->title.text) - 1);
409     p_menu->title.text[sizeof(p_menu->title.text) - 1] = '\0';
410    
411     // Check syntax
412     q = strtok_r(q + 1, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
413     if (q != NULL)
414     {
415     log_error("Unknown extra content in menu config line %d\n", fin_line);
416     return -1;
417     }
418 sysadm 1.21 }
419 sysadm 1.31 else if (strcmp(p, "screen") == 0)
420 sysadm 1.21 {
421 sysadm 1.31 p_menu->screen.show = 1;
422    
423     // Menu screen row
424     q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
425     if (q == NULL)
426     {
427     log_error("Error menu screen row in menu config line %d\n", fin_line);
428     return -1;
429     }
430     p = q;
431     while (isdigit(*q))
432     {
433     q++;
434     }
435     if (*q != '\0')
436     {
437     log_error("Error menu screen row in menu config line %d\n", fin_line);
438     return -1;
439     }
440     p_menu->screen.row = atoi(p);
441    
442     // Menu screen col
443     q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
444     if (q == NULL)
445     {
446     log_error("Error menu screen col in menu config line %d\n", fin_line);
447     return -1;
448     }
449     p = q;
450     while (isdigit(*q))
451     {
452     q++;
453     }
454     if (*q != '\0')
455     {
456     log_error("Error menu screen col in menu config line %d\n", fin_line);
457     return -1;
458     }
459     p_menu->screen.col = atoi(p);
460    
461     // Menu screen name
462     q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
463     if (q == NULL)
464     {
465     log_error("Error menu screen name in menu config line %d\n", fin_line);
466     return -1;
467     }
468     p = q;
469     while (isalnum(*q) || *q == '_')
470     {
471     q++;
472     }
473     if (*q != '\0')
474     {
475     log_error("Error menu screen name in menu config line %d\n", fin_line);
476     return -1;
477     }
478    
479     snprintf(p_menu->screen.filename, sizeof(p_menu->screen.filename), "%s%s", MENU_SCREEN_PATH_PREFIX, p);
480    
481     // Check syntax
482     q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
483     if (q != NULL)
484     {
485     log_error("Unknown extra content in menu config line %d\n", fin_line);
486     return -1;
487     }
488 sysadm 1.21 }
489 sysadm 1.31 }
490     }
491     else // BEGIN of menu screen
492     {
493     q = p;
494     while (isalnum(*q) || *q == '_')
495     {
496     q++;
497     }
498     if (*q != '\0')
499     {
500     log_error("Error menu screen name in menu config line %d\n", fin_line);
501     return -1;
502     }
503    
504     snprintf(screen_filename, sizeof(screen_filename), "%s%s", MENU_SCREEN_PATH_PREFIX, p);
505    
506     // Check syntax
507     q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
508     if (q != NULL)
509     {
510     log_error("Unknown extra content in menu config line %d\n", fin_line);
511     return -1;
512     }
513    
514     if ((fout = fopen(screen_filename, "w")) == NULL)
515     {
516     log_error("Open %s failed", screen_filename);
517     return -2;
518     }
519    
520     while (fgets(buffer, sizeof(buffer), fin))
521     {
522     fin_line++;
523    
524     p = strtok_r(buffer, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
525     if (p != NULL && *p == '%') // END of menu screen
526 sysadm 1.21 {
527 sysadm 1.31 break;
528 sysadm 1.21 }
529 sysadm 1.31
530     if (fputs(buffer, fout) < 0)
531 sysadm 1.21 {
532 sysadm 1.31 log_error("Write %s failed", screen_filename);
533     return -2;
534 sysadm 1.21 }
535     }
536 sysadm 1.31
537     fclose(fout);
538 sysadm 1.21 }
539 sysadm 1.31 }
540     else // Invalid prefix
541     {
542     log_error("Error in menu config line %d\n", fin_line);
543     return -1;
544 sysadm 1.10 }
545 sysadm 1.3 }
546 sysadm 1.21 fclose(fin);
547 sysadm 1.3
548 sysadm 1.21 p_menu_set->menu_count = i;
549     p_menu_set->menu_select_depth = 0;
550     p_menu_set->p_menu_select[p_menu_set->menu_select_depth] = (i == 0 ? NULL : p_menu_set->p_menu[0]);
551 sysadm 1.2
552 sysadm 1.21 return 0;
553 sysadm 1.1 }
554    
555 sysadm 1.31 MENU *get_menu(MENU_SET *p_menu_set, const char *menu_name)
556 sysadm 1.3 {
557 sysadm 1.21 int i;
558 sysadm 1.5
559 sysadm 1.21 for (i = 0; i < p_menu_set->menu_count; i++)
560 sysadm 1.10 {
561 sysadm 1.21 if (strcmp(p_menu_set->p_menu[i]->name, menu_name) == 0)
562     {
563     return p_menu_set->p_menu[i];
564     }
565 sysadm 1.10 }
566 sysadm 1.5
567 sysadm 1.21 return NULL;
568 sysadm 1.3 }
569    
570 sysadm 1.22 static void display_menu_cursor(MENU *p_menu, int show)
571 sysadm 1.1 {
572 sysadm 1.21 moveto((p_menu->items[p_menu->item_cur_pos])->r_row,
573     (p_menu->items[p_menu->item_cur_pos])->r_col - 2);
574 sysadm 1.26 outc(show ? '>' : ' ');
575 sysadm 1.21 iflush();
576 sysadm 1.1 }
577    
578 sysadm 1.21 int display_menu(MENU *p_menu)
579 sysadm 1.1 {
580 sysadm 1.26 int row = 0;
581     int col = 0;
582     int menu_selectable = 0;
583 sysadm 1.3
584 sysadm 1.21 if (p_menu == NULL)
585 sysadm 1.26 {
586 sysadm 1.21 return -1;
587 sysadm 1.26 }
588 sysadm 1.5
589 sysadm 1.21 if (p_menu->title.show)
590 sysadm 1.26 {
591 sysadm 1.21 show_top(p_menu->title.text);
592 sysadm 1.26 }
593 sysadm 1.3
594 sysadm 1.21 if (p_menu->screen.show)
595 sysadm 1.10 {
596 sysadm 1.21 moveto(p_menu->screen.row, p_menu->screen.col);
597     if (display_file(p_menu->screen.filename) != 0)
598 sysadm 1.26 {
599 sysadm 1.21 log_error("Display menu screen <%s> failed!\n",
600     p_menu->screen.filename);
601 sysadm 1.26 }
602 sysadm 1.10 }
603 sysadm 1.21
604 sysadm 1.26 for (int i = 0; i < p_menu->item_count; i++)
605     {
606     if (p_menu->items[i]->row != 0)
607     {
608     row = p_menu->items[i]->row;
609     }
610     if (p_menu->items[i]->col != 0)
611     {
612     col = p_menu->items[i]->col;
613     }
614 sysadm 1.21
615     if (checkpriv(&BBS_priv, 0, p_menu->items[i]->priv) == 0 || checklevel(&BBS_priv, p_menu->items[i]->level) == 0)
616     {
617     p_menu->items[i]->display = 0;
618 sysadm 1.26 p_menu->items[i]->r_row = 0;
619     p_menu->items[i]->r_col = 0;
620 sysadm 1.21 }
621     else
622     {
623     p_menu->items[i]->display = 1;
624 sysadm 1.10
625 sysadm 1.26 if (!menu_selectable)
626     {
627     p_menu->item_cur_pos = i;
628     menu_selectable = 1;
629     }
630 sysadm 1.3
631 sysadm 1.21 p_menu->items[i]->r_row = row;
632     p_menu->items[i]->r_col = col;
633 sysadm 1.26
634 sysadm 1.21 moveto(row, col);
635 sysadm 1.26 prints("%s", p_menu->items[i]->text);
636    
637     row++;
638 sysadm 1.21 }
639 sysadm 1.10 }
640    
641 sysadm 1.21 if (!menu_selectable)
642 sysadm 1.26 {
643 sysadm 1.21 return -1;
644 sysadm 1.26 }
645 sysadm 1.3
646 sysadm 1.21 display_menu_cursor(p_menu, 1);
647 sysadm 1.1
648 sysadm 1.21 return 0;
649 sysadm 1.1 }
650    
651 sysadm 1.21 int display_current_menu(MENU_SET *p_menu_set)
652 sysadm 1.12 {
653 sysadm 1.21 MENU *p_menu;
654 sysadm 1.12
655 sysadm 1.21 p_menu = p_menu_set->p_menu_select[p_menu_set->menu_select_depth];
656 sysadm 1.12
657 sysadm 1.21 return display_menu(p_menu);
658 sysadm 1.12 }
659    
660 sysadm 1.21 int menu_control(MENU_SET *p_menu_set, int key)
661 sysadm 1.1 {
662 sysadm 1.21 int i;
663     MENU *p_menu;
664 sysadm 1.3
665 sysadm 1.21 if (p_menu_set->menu_count == 0)
666 sysadm 1.26 {
667 sysadm 1.21 return 0;
668 sysadm 1.26 }
669 sysadm 1.3
670 sysadm 1.21 p_menu = p_menu_set->p_menu_select[p_menu_set->menu_select_depth];
671 sysadm 1.3
672 sysadm 1.21 switch (key)
673 sysadm 1.10 {
674 sysadm 1.21 case CR:
675 sysadm 1.24 igetch(1); // Cleanup remaining '\n' in the buffer
676 sysadm 1.21 case KEY_RIGHT:
677     if (p_menu->items[p_menu->item_cur_pos]->submenu)
678     {
679     if (strcmp(p_menu->items[p_menu->item_cur_pos]->action, "..") == 0)
680 sysadm 1.26 {
681 sysadm 1.21 return menu_control(p_menu_set, KEY_LEFT);
682 sysadm 1.26 }
683 sysadm 1.21 p_menu_set->menu_select_depth++;
684 sysadm 1.26 p_menu = get_menu(p_menu_set, p_menu->items[p_menu->item_cur_pos]->action);
685     p_menu_set->p_menu_select[p_menu_set->menu_select_depth] = p_menu;
686    
687 sysadm 1.21 if (display_menu(p_menu) != 0)
688 sysadm 1.26 {
689 sysadm 1.21 return menu_control(p_menu_set, KEY_LEFT);
690 sysadm 1.26 }
691 sysadm 1.21 break;
692     }
693     else
694     {
695     return (exec_cmd(p_menu->items[p_menu->item_cur_pos]->action,
696     p_menu->items[p_menu->item_cur_pos]->name));
697     }
698     case KEY_LEFT:
699     if (p_menu_set->menu_select_depth > 0)
700     {
701     p_menu_set->menu_select_depth--;
702     if (display_current_menu(p_menu_set) != 0)
703 sysadm 1.26 {
704 sysadm 1.21 return menu_control(p_menu_set, KEY_LEFT);
705 sysadm 1.26 }
706 sysadm 1.21 break;
707     }
708     else
709     {
710     display_menu_cursor(p_menu, 0);
711     p_menu->item_cur_pos = p_menu->item_count - 1;
712 sysadm 1.26 while (!p_menu->items[p_menu->item_cur_pos]->display ||
713     p_menu->items[p_menu->item_cur_pos]->priv != 0 ||
714     p_menu->items[p_menu->item_cur_pos]->level != 0)
715     {
716 sysadm 1.21 p_menu->item_cur_pos--;
717 sysadm 1.26 }
718 sysadm 1.21 display_menu_cursor(p_menu, 1);
719     break;
720     }
721     case KEY_UP:
722     display_menu_cursor(p_menu, 0);
723     do
724     {
725     p_menu->item_cur_pos--;
726     if (p_menu->item_cur_pos < 0)
727 sysadm 1.26 {
728 sysadm 1.21 p_menu->item_cur_pos = p_menu->item_count - 1;
729 sysadm 1.26 }
730 sysadm 1.21 } while (!p_menu->items[p_menu->item_cur_pos]->display);
731     display_menu_cursor(p_menu, 1);
732     break;
733     case KEY_DOWN:
734     display_menu_cursor(p_menu, 0);
735     do
736     {
737     p_menu->item_cur_pos++;
738     if (p_menu->item_cur_pos >= p_menu->item_count)
739 sysadm 1.26 {
740 sysadm 1.21 p_menu->item_cur_pos = 0;
741 sysadm 1.26 }
742 sysadm 1.21 } while (!p_menu->items[p_menu->item_cur_pos]->display);
743     display_menu_cursor(p_menu, 1);
744     break;
745     default:
746 sysadm 1.31 if (isalnum(key))
747 sysadm 1.21 {
748     for (i = 0; i < p_menu->item_count; i++)
749     {
750     if (toupper(key) == toupper(p_menu->items[i]->name[0]) &&
751     p_menu->items[i]->display)
752     {
753     display_menu_cursor(p_menu, 0);
754     p_menu->item_cur_pos = i;
755     display_menu_cursor(p_menu, 1);
756     return 0;
757     }
758     }
759 sysadm 1.16 }
760 sysadm 1.3 }
761 sysadm 1.1
762 sysadm 1.21 return 0;
763 sysadm 1.1 }
764 sysadm 1.15
765 sysadm 1.21 void unload_menu(MENU_SET *p_menu_set)
766 sysadm 1.15 {
767 sysadm 1.21 MENU *p_menu;
768     int i, j;
769    
770     for (i = 0; i < p_menu_set->menu_count; i++)
771 sysadm 1.16 {
772 sysadm 1.21 p_menu = p_menu_set->p_menu[i];
773     for (j = 0; j < p_menu->item_count; j++)
774     {
775     free(p_menu->items[j]);
776     }
777     free(p_menu);
778 sysadm 1.16 }
779    
780 sysadm 1.21 p_menu_set->menu_count = 0;
781     p_menu_set->menu_select_depth = 0;
782 sysadm 1.15 }
783 sysadm 1.18
784 sysadm 1.21 int reload_menu(MENU_SET *p_menu_set)
785 sysadm 1.18 {
786 sysadm 1.21 int result;
787 sysadm 1.23 char conf_file[FILE_PATH_LEN];
788 sysadm 1.21
789 sysadm 1.27 strncpy(conf_file, p_menu_set->conf_file, sizeof(conf_file) - 1);
790     conf_file[sizeof(conf_file) - 1] = '\0';
791    
792 sysadm 1.21 unload_menu(p_menu_set);
793     result = load_menu(p_menu_set, conf_file);
794 sysadm 1.18
795 sysadm 1.21 return result;
796 sysadm 1.18 }

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