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

Annotation of /lbbs/src/menu.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.37 - (hide annotations)
Sun May 11 13:50:15 2025 UTC (10 months ago) by sysadm
Branch: MAIN
Changes since 1.36: +0 -1 lines
Content type: text/x-csrc
Remove legacy code

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 "bbs_cmd.h"
21 sysadm 1.1 #include "menu.h"
22 sysadm 1.22 #include "log.h"
23 sysadm 1.1 #include "io.h"
24 sysadm 1.22 #include "screen.h"
25 sysadm 1.2 #include "common.h"
26 sysadm 1.22 #include <string.h>
27 sysadm 1.1 #include <stdio.h>
28     #include <ctype.h>
29 sysadm 1.6 #include <stdlib.h>
30 sysadm 1.1
31 sysadm 1.31 #define MENU_SCREEN_PATH_PREFIX "var/MENU_SCR_"
32     #define MENU_CONF_DELIM_WITH_SPACE " ,\t\r\n"
33     #define MENU_CONF_DELIM_WITHOUT_SPACE "\r\n"
34 sysadm 1.25
35 sysadm 1.2 MENU_SET bbs_menu;
36 sysadm 1.1
37 sysadm 1.21 int load_menu(MENU_SET *p_menu_set, const char *conf_file)
38 sysadm 1.1 {
39 sysadm 1.21 FILE *fin, *fout;
40 sysadm 1.31 int fin_line = 0;
41     int i = 0;
42     int j = 0;
43 sysadm 1.23 char buffer[LINE_BUFFER_LEN];
44 sysadm 1.33 char temp[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 sysadm 1.33 log_error("Incomplete menu definition in menu config line %d\n", fin_line);
87 sysadm 1.31 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 sysadm 1.34 strncpy(temp, buffer, sizeof(temp)); // Duplicate line for strtok_r
525 sysadm 1.33 p = strtok_r(temp, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
526 sysadm 1.31 if (p != NULL && *p == '%') // END of menu screen
527 sysadm 1.21 {
528 sysadm 1.31 break;
529 sysadm 1.21 }
530 sysadm 1.31
531     if (fputs(buffer, fout) < 0)
532 sysadm 1.21 {
533 sysadm 1.31 log_error("Write %s failed", screen_filename);
534     return -2;
535 sysadm 1.21 }
536     }
537 sysadm 1.31
538     fclose(fout);
539 sysadm 1.21 }
540 sysadm 1.31 }
541     else // Invalid prefix
542     {
543     log_error("Error in menu config line %d\n", fin_line);
544     return -1;
545 sysadm 1.10 }
546 sysadm 1.3 }
547 sysadm 1.21 fclose(fin);
548 sysadm 1.3
549 sysadm 1.21 p_menu_set->menu_count = i;
550     p_menu_set->menu_select_depth = 0;
551     p_menu_set->p_menu_select[p_menu_set->menu_select_depth] = (i == 0 ? NULL : p_menu_set->p_menu[0]);
552 sysadm 1.2
553 sysadm 1.21 return 0;
554 sysadm 1.1 }
555    
556 sysadm 1.31 MENU *get_menu(MENU_SET *p_menu_set, const char *menu_name)
557 sysadm 1.3 {
558 sysadm 1.21 int i;
559 sysadm 1.5
560 sysadm 1.21 for (i = 0; i < p_menu_set->menu_count; i++)
561 sysadm 1.10 {
562 sysadm 1.21 if (strcmp(p_menu_set->p_menu[i]->name, menu_name) == 0)
563     {
564     return p_menu_set->p_menu[i];
565     }
566 sysadm 1.10 }
567 sysadm 1.5
568 sysadm 1.21 return NULL;
569 sysadm 1.3 }
570    
571 sysadm 1.22 static void display_menu_cursor(MENU *p_menu, int show)
572 sysadm 1.1 {
573 sysadm 1.21 moveto((p_menu->items[p_menu->item_cur_pos])->r_row,
574     (p_menu->items[p_menu->item_cur_pos])->r_col - 2);
575 sysadm 1.26 outc(show ? '>' : ' ');
576 sysadm 1.21 iflush();
577 sysadm 1.1 }
578    
579 sysadm 1.21 int display_menu(MENU *p_menu)
580 sysadm 1.1 {
581 sysadm 1.26 int row = 0;
582     int col = 0;
583     int menu_selectable = 0;
584 sysadm 1.3
585 sysadm 1.21 if (p_menu == NULL)
586 sysadm 1.26 {
587 sysadm 1.21 return -1;
588 sysadm 1.26 }
589 sysadm 1.5
590 sysadm 1.35 if (p_menu->item_cur_pos > 0 &&
591     checkpriv(&BBS_priv, 0, p_menu->items[p_menu->item_cur_pos]->priv) != 0 &&
592     checklevel(&BBS_priv, p_menu->items[p_menu->item_cur_pos]->level) != 0)
593     {
594     menu_selectable = 1;
595     }
596    
597 sysadm 1.21 if (p_menu->title.show)
598 sysadm 1.26 {
599 sysadm 1.21 show_top(p_menu->title.text);
600 sysadm 1.26 }
601 sysadm 1.3
602 sysadm 1.21 if (p_menu->screen.show)
603 sysadm 1.10 {
604 sysadm 1.21 moveto(p_menu->screen.row, p_menu->screen.col);
605     if (display_file(p_menu->screen.filename) != 0)
606 sysadm 1.26 {
607 sysadm 1.21 log_error("Display menu screen <%s> failed!\n",
608     p_menu->screen.filename);
609 sysadm 1.26 }
610 sysadm 1.10 }
611 sysadm 1.21
612 sysadm 1.26 for (int i = 0; i < p_menu->item_count; i++)
613     {
614     if (p_menu->items[i]->row != 0)
615     {
616     row = p_menu->items[i]->row;
617     }
618     if (p_menu->items[i]->col != 0)
619     {
620     col = p_menu->items[i]->col;
621     }
622 sysadm 1.21
623     if (checkpriv(&BBS_priv, 0, p_menu->items[i]->priv) == 0 || checklevel(&BBS_priv, p_menu->items[i]->level) == 0)
624     {
625     p_menu->items[i]->display = 0;
626 sysadm 1.26 p_menu->items[i]->r_row = 0;
627     p_menu->items[i]->r_col = 0;
628 sysadm 1.21 }
629     else
630     {
631     p_menu->items[i]->display = 1;
632 sysadm 1.10
633 sysadm 1.26 if (!menu_selectable)
634     {
635     p_menu->item_cur_pos = i;
636     menu_selectable = 1;
637     }
638 sysadm 1.3
639 sysadm 1.21 p_menu->items[i]->r_row = row;
640     p_menu->items[i]->r_col = col;
641 sysadm 1.26
642 sysadm 1.21 moveto(row, col);
643 sysadm 1.26 prints("%s", p_menu->items[i]->text);
644    
645     row++;
646 sysadm 1.21 }
647 sysadm 1.10 }
648    
649 sysadm 1.21 if (!menu_selectable)
650 sysadm 1.26 {
651 sysadm 1.21 return -1;
652 sysadm 1.26 }
653 sysadm 1.3
654 sysadm 1.21 display_menu_cursor(p_menu, 1);
655 sysadm 1.1
656 sysadm 1.21 return 0;
657 sysadm 1.1 }
658    
659 sysadm 1.21 int display_current_menu(MENU_SET *p_menu_set)
660 sysadm 1.12 {
661 sysadm 1.21 MENU *p_menu;
662 sysadm 1.12
663 sysadm 1.21 p_menu = p_menu_set->p_menu_select[p_menu_set->menu_select_depth];
664 sysadm 1.12
665 sysadm 1.21 return display_menu(p_menu);
666 sysadm 1.12 }
667    
668 sysadm 1.21 int menu_control(MENU_SET *p_menu_set, int key)
669 sysadm 1.1 {
670 sysadm 1.21 int i;
671     MENU *p_menu;
672 sysadm 1.3
673 sysadm 1.21 if (p_menu_set->menu_count == 0)
674 sysadm 1.26 {
675 sysadm 1.21 return 0;
676 sysadm 1.26 }
677 sysadm 1.3
678 sysadm 1.21 p_menu = p_menu_set->p_menu_select[p_menu_set->menu_select_depth];
679 sysadm 1.3
680 sysadm 1.21 switch (key)
681 sysadm 1.10 {
682 sysadm 1.21 case CR:
683 sysadm 1.24 igetch(1); // Cleanup remaining '\n' in the buffer
684 sysadm 1.21 case KEY_RIGHT:
685     if (p_menu->items[p_menu->item_cur_pos]->submenu)
686     {
687     if (strcmp(p_menu->items[p_menu->item_cur_pos]->action, "..") == 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 p_menu_set->menu_select_depth++;
692 sysadm 1.26 p_menu = get_menu(p_menu_set, p_menu->items[p_menu->item_cur_pos]->action);
693     p_menu_set->p_menu_select[p_menu_set->menu_select_depth] = p_menu;
694    
695 sysadm 1.21 if (display_menu(p_menu) != 0)
696 sysadm 1.26 {
697 sysadm 1.21 return menu_control(p_menu_set, KEY_LEFT);
698 sysadm 1.26 }
699 sysadm 1.21 break;
700     }
701     else
702     {
703     return (exec_cmd(p_menu->items[p_menu->item_cur_pos]->action,
704     p_menu->items[p_menu->item_cur_pos]->name));
705     }
706     case KEY_LEFT:
707     if (p_menu_set->menu_select_depth > 0)
708     {
709     p_menu_set->menu_select_depth--;
710     if (display_current_menu(p_menu_set) != 0)
711 sysadm 1.26 {
712 sysadm 1.21 return menu_control(p_menu_set, KEY_LEFT);
713 sysadm 1.26 }
714 sysadm 1.21 break;
715     }
716     else
717     {
718     display_menu_cursor(p_menu, 0);
719     p_menu->item_cur_pos = p_menu->item_count - 1;
720 sysadm 1.36 while (p_menu->item_cur_pos >= 0 && (!p_menu->items[p_menu->item_cur_pos]->display ||
721     p_menu->items[p_menu->item_cur_pos]->priv != 0 ||
722     p_menu->items[p_menu->item_cur_pos]->level != 0))
723 sysadm 1.26 {
724 sysadm 1.21 p_menu->item_cur_pos--;
725 sysadm 1.26 }
726 sysadm 1.21 display_menu_cursor(p_menu, 1);
727     break;
728     }
729     case KEY_UP:
730     display_menu_cursor(p_menu, 0);
731     do
732     {
733     p_menu->item_cur_pos--;
734     if (p_menu->item_cur_pos < 0)
735 sysadm 1.26 {
736 sysadm 1.21 p_menu->item_cur_pos = p_menu->item_count - 1;
737 sysadm 1.26 }
738 sysadm 1.21 } while (!p_menu->items[p_menu->item_cur_pos]->display);
739     display_menu_cursor(p_menu, 1);
740     break;
741     case KEY_DOWN:
742     display_menu_cursor(p_menu, 0);
743     do
744     {
745     p_menu->item_cur_pos++;
746     if (p_menu->item_cur_pos >= p_menu->item_count)
747 sysadm 1.26 {
748 sysadm 1.21 p_menu->item_cur_pos = 0;
749 sysadm 1.26 }
750 sysadm 1.21 } while (!p_menu->items[p_menu->item_cur_pos]->display);
751     display_menu_cursor(p_menu, 1);
752     break;
753     default:
754 sysadm 1.31 if (isalnum(key))
755 sysadm 1.21 {
756     for (i = 0; i < p_menu->item_count; i++)
757     {
758     if (toupper(key) == toupper(p_menu->items[i]->name[0]) &&
759     p_menu->items[i]->display)
760     {
761     display_menu_cursor(p_menu, 0);
762     p_menu->item_cur_pos = i;
763     display_menu_cursor(p_menu, 1);
764     return 0;
765     }
766     }
767 sysadm 1.16 }
768 sysadm 1.3 }
769 sysadm 1.1
770 sysadm 1.21 return 0;
771 sysadm 1.1 }
772 sysadm 1.15
773 sysadm 1.21 void unload_menu(MENU_SET *p_menu_set)
774 sysadm 1.15 {
775 sysadm 1.21 MENU *p_menu;
776     int i, j;
777    
778     for (i = 0; i < p_menu_set->menu_count; i++)
779 sysadm 1.16 {
780 sysadm 1.21 p_menu = p_menu_set->p_menu[i];
781     for (j = 0; j < p_menu->item_count; j++)
782     {
783     free(p_menu->items[j]);
784     }
785     free(p_menu);
786 sysadm 1.16 }
787    
788 sysadm 1.21 p_menu_set->menu_count = 0;
789     p_menu_set->menu_select_depth = 0;
790 sysadm 1.15 }
791 sysadm 1.18
792 sysadm 1.21 int reload_menu(MENU_SET *p_menu_set)
793 sysadm 1.18 {
794 sysadm 1.21 int result;
795 sysadm 1.23 char conf_file[FILE_PATH_LEN];
796 sysadm 1.21
797 sysadm 1.27 strncpy(conf_file, p_menu_set->conf_file, sizeof(conf_file) - 1);
798     conf_file[sizeof(conf_file) - 1] = '\0';
799    
800 sysadm 1.21 unload_menu(p_menu_set);
801     result = load_menu(p_menu_set, conf_file);
802 sysadm 1.18
803 sysadm 1.21 return result;
804 sysadm 1.18 }

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