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

Annotation of /lbbs/src/menu.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.17 - (hide annotations)
Fri May 6 15:48:44 2005 UTC (20 years, 10 months ago) by sysadm
Branch: MAIN
Changes since 1.16: +10 -8 lines
Content type: text/x-csrc
*** empty log message ***

1 sysadm 1.1 /***************************************************************************
2     menu.c - description
3     -------------------
4     begin : Wed Mar 16 2004
5     copyright : (C) 2005 by Leaflet
6     email : leaflet@leafok.com
7     ***************************************************************************/
8    
9     /***************************************************************************
10     * *
11     * This program is free software; you can redistribute it and/or modify *
12     * it under the terms of the GNU General Public License as published by *
13     * the Free Software Foundation; either version 2 of the License, or *
14     * (at your option) any later version. *
15     * *
16     ***************************************************************************/
17    
18 sysadm 1.3 #include "bbs.h"
19 sysadm 1.17 #include "bbs_cmd.h"
20 sysadm 1.1 #include "menu.h"
21     #include "io.h"
22 sysadm 1.2 #include "common.h"
23 sysadm 1.1 #include <stdio.h>
24     #include <ctype.h>
25 sysadm 1.2 #include <regex.h>
26 sysadm 1.6 #include <stdlib.h>
27 sysadm 1.1
28 sysadm 1.2 MENU_SET bbs_menu;
29 sysadm 1.1
30     int
31 sysadm 1.3 load_menu (MENU_SET * p_menu_set, const char *conf_file)
32 sysadm 1.1 {
33 sysadm 1.2 FILE *fin, *fout;
34 sysadm 1.7 int i = 0, j;
35 sysadm 1.2 char buffer[256], screen_filename[256], temp[256];
36     regmatch_t pmatch[10];
37 sysadm 1.1
38     if ((fin = fopen (conf_file, "r")) == NULL)
39     {
40     log_error ("Open %s failed", conf_file);
41     return -1;
42     }
43    
44 sysadm 1.2 while (fgets (buffer, 255, fin))
45 sysadm 1.3 {
46     switch (buffer[0])
47     {
48     case '#':
49     break;
50     case '%':
51 sysadm 1.7 if (ireg ("^%S_([A-Za-z0-9_]+)", buffer, 2, pmatch) == 0)
52 sysadm 1.3 {
53 sysadm 1.7 strncpy (temp, buffer + pmatch[1].rm_so,
54     pmatch[1].rm_eo - pmatch[1].rm_so);
55 sysadm 1.10 temp[pmatch[1].rm_eo - pmatch[1].rm_so] = '\0';
56     sprintf (screen_filename, "%sMENU_SCR_%s", app_temp_dir, temp);
57 sysadm 1.3
58     if ((fout = fopen (screen_filename, "w")) == NULL)
59     {
60     log_error ("Open %s failed", screen_filename);
61     return -2;
62     }
63    
64     while (fgets (buffer, 255, fin))
65     {
66     if (buffer[0] != '%')
67     fputs (buffer, fout);
68     else
69     break;
70     }
71    
72     fclose (fout);
73     break;
74     }
75    
76 sysadm 1.5 if (ireg ("^%menu ([A-Za-z0-9_]+)", buffer, 2, pmatch) == 0)
77 sysadm 1.3 {
78     p_menu_set->p_menu[i] = malloc (sizeof (MENU));
79 sysadm 1.13 p_menu_set->p_menu[i]->title.show = 0;
80     p_menu_set->p_menu[i]->screen.show = 0;
81 sysadm 1.3
82     strncpy (p_menu_set->p_menu[i]->name,
83 sysadm 1.10 buffer + pmatch[1].rm_so,
84     pmatch[1].rm_eo - pmatch[1].rm_so);
85     p_menu_set->p_menu[i]->name[pmatch[1].rm_eo - pmatch[1].rm_so] =
86     '\0';
87 sysadm 1.5
88 sysadm 1.3 j = 0;
89 sysadm 1.10
90 sysadm 1.3 while (fgets (buffer, 255, fin))
91 sysadm 1.10 {
92 sysadm 1.3 if (buffer[0] == '#')
93 sysadm 1.10 {
94 sysadm 1.11 continue;
95 sysadm 1.10 }
96 sysadm 1.3 if (buffer[0] == '%')
97 sysadm 1.10 {
98     p_menu_set->p_menu[i]->item_count = j;
99     p_menu_set->p_menu[i]->item_cur_pos = 0;
100     i++;
101     break;
102     }
103     if (ireg ("^!([A-Za-z0-9_.]+)[[:space:]]*([0-9]+),"
104     "[[:space:]]*([0-9]+),[[:space:]]*([0-9]+),"
105 sysadm 1.17 "[[:space:]]*([0-9]+),[[:space:]]*\"([^\"]+)\","
106 sysadm 1.11 "[[:space:]]*\"([^\"]+)\"",
107     buffer, 8, pmatch) == 0)
108 sysadm 1.10 {
109     p_menu_set->p_menu[i]->items[j] =
110     malloc (sizeof (MENU_ITEM));
111     p_menu_set->p_menu[i]->items[j]->submenu = 1;
112     strncpy (p_menu_set->p_menu[i]->items[j]->action,
113     buffer + pmatch[1].rm_so,
114     pmatch[1].rm_eo - pmatch[1].rm_so);
115     p_menu_set->p_menu[i]->items[j]->action[pmatch[1].
116     rm_eo -
117     pmatch[1].
118     rm_so] = '\0';
119     strncpy (temp, buffer + pmatch[2].rm_so,
120     pmatch[2].rm_eo - pmatch[2].rm_so);
121     temp[pmatch[2].rm_eo - pmatch[2].rm_so] = '\0';
122     p_menu_set->p_menu[i]->items[j]->row = atoi (temp);
123     strncpy (temp,
124     buffer + pmatch[3].rm_so,
125     pmatch[3].rm_eo - pmatch[3].rm_so);
126     temp[pmatch[3].rm_eo - pmatch[3].rm_so] = '\0';
127     p_menu_set->p_menu[i]->items[j]->col = atoi (temp);
128     strncpy (temp,
129     buffer + pmatch[4].rm_so,
130     pmatch[4].rm_eo - pmatch[4].rm_so);
131     temp[pmatch[4].rm_eo - pmatch[4].rm_so] = '\0';
132     p_menu_set->p_menu[i]->items[j]->priv = atoi (temp);
133 sysadm 1.11 strncpy (temp,
134 sysadm 1.10 buffer + pmatch[5].rm_so,
135     pmatch[5].rm_eo - pmatch[5].rm_so);
136 sysadm 1.11 temp[pmatch[5].rm_eo - pmatch[5].rm_so] = '\0';
137     p_menu_set->p_menu[i]->items[j]->level = atoi (temp);
138     strncpy (p_menu_set->p_menu[i]->items[j]->name,
139 sysadm 1.10 buffer + pmatch[6].rm_so,
140     pmatch[6].rm_eo - pmatch[6].rm_so);
141 sysadm 1.11 p_menu_set->p_menu[i]->items[j]->name[pmatch[6].rm_eo -
142 sysadm 1.10 pmatch[6].rm_so] =
143     '\0';
144 sysadm 1.11 strncpy (p_menu_set->p_menu[i]->items[j]->text,
145     buffer + pmatch[7].rm_so,
146     pmatch[7].rm_eo - pmatch[7].rm_so);
147     p_menu_set->p_menu[i]->items[j]->text[pmatch[7].rm_eo -
148     pmatch[7].rm_so] =
149     '\0';
150 sysadm 1.10 j++;
151     continue;
152     }
153     if (ireg ("^@([A-Za-z0-9_]+)[[:space:]]*([0-9]+),"
154     "[[:space:]]*([0-9]+),[[:space:]]*([0-9]+),"
155 sysadm 1.17 "[[:space:]]*([0-9]+),[[:space:]]*\"([^\"]+)\","
156 sysadm 1.11 "[[:space:]]*\"([^\"]+)\"",
157     buffer, 8, pmatch) == 0)
158 sysadm 1.10 {
159     p_menu_set->p_menu[i]->items[j] =
160     malloc (sizeof (MENU_ITEM));
161     p_menu_set->p_menu[i]->items[j]->submenu = 0;
162     strncpy (p_menu_set->p_menu[i]->items[j]->action,
163     buffer + pmatch[1].rm_so,
164     pmatch[1].rm_eo - pmatch[1].rm_so);
165 sysadm 1.12 p_menu_set->p_menu[i]->items[j]->action[pmatch[1].
166 sysadm 1.10 rm_eo -
167 sysadm 1.12 pmatch[1].
168 sysadm 1.10 rm_so] = '\0';
169     strncpy (temp, buffer + pmatch[2].rm_so,
170     pmatch[2].rm_eo - pmatch[2].rm_so);
171     temp[pmatch[2].rm_eo - pmatch[2].rm_so] = '\0';
172     p_menu_set->p_menu[i]->items[j]->row = atoi (temp);
173     strncpy (temp,
174     buffer + pmatch[3].rm_so,
175     pmatch[3].rm_eo - pmatch[3].rm_so);
176     temp[pmatch[3].rm_eo - pmatch[3].rm_so] = '\0';
177     p_menu_set->p_menu[i]->items[j]->col = atoi (temp);
178     strncpy (temp,
179     buffer + pmatch[4].rm_so,
180     pmatch[4].rm_eo - pmatch[4].rm_so);
181     temp[pmatch[4].rm_eo - pmatch[4].rm_so] = '\0';
182     p_menu_set->p_menu[i]->items[j]->priv = atoi (temp);
183 sysadm 1.11 strncpy (temp,
184 sysadm 1.10 buffer + pmatch[5].rm_so,
185     pmatch[5].rm_eo - pmatch[5].rm_so);
186 sysadm 1.11 temp[pmatch[5].rm_eo - pmatch[5].rm_so] = '\0';
187     p_menu_set->p_menu[i]->items[j]->level = atoi (temp);
188     strncpy (p_menu_set->p_menu[i]->items[j]->name,
189 sysadm 1.10 buffer + pmatch[6].rm_so,
190     pmatch[6].rm_eo - pmatch[6].rm_so);
191 sysadm 1.11 p_menu_set->p_menu[i]->items[j]->name[pmatch[6].rm_eo -
192 sysadm 1.10 pmatch[6].rm_so] =
193     '\0';
194 sysadm 1.11 strncpy (p_menu_set->p_menu[i]->items[j]->text,
195     buffer + pmatch[7].rm_so,
196     pmatch[7].rm_eo - pmatch[7].rm_so);
197     p_menu_set->p_menu[i]->items[j]->text[pmatch[7].rm_eo -
198     pmatch[7].rm_so] =
199     '\0';
200 sysadm 1.10 j++;
201     continue;
202     }
203     if (ireg ("^title[[:space:]]*([0-9]+),"
204     "[[:space:]]*([0-9]+),[[:space:]]*\"([^\"]+)\"",
205     buffer, 4, pmatch) == 0)
206     {
207 sysadm 1.13 p_menu_set->p_menu[i]->title.show = 1;
208 sysadm 1.10 strncpy (temp,
209     buffer + pmatch[1].rm_so,
210     pmatch[1].rm_eo - pmatch[1].rm_so);
211     temp[pmatch[1].rm_eo - pmatch[1].rm_so] = '\0';
212     p_menu_set->p_menu[i]->title.row = atoi (temp);
213     strncpy (temp,
214     buffer + pmatch[2].rm_so,
215     pmatch[2].rm_eo - pmatch[2].rm_so);
216     temp[pmatch[2].rm_eo - pmatch[2].rm_so] = '\0';
217     p_menu_set->p_menu[i]->title.col = atoi (temp);
218     strncpy (p_menu_set->p_menu[i]->title.text,
219     buffer + pmatch[3].rm_so,
220     pmatch[3].rm_eo - pmatch[3].rm_so);
221     p_menu_set->p_menu[i]->title.text[pmatch[3].rm_eo -
222     pmatch[3].rm_so] =
223     '\0';
224     continue;
225     }
226     if (ireg ("^screen[[:space:]]*([0-9]+),"
227     "[[:space:]]*([0-9]+),[[:space:]]*S_([A-Za-z0-9_]+)",
228     buffer, 4, pmatch) == 0)
229     {
230 sysadm 1.13 p_menu_set->p_menu[i]->screen.show = 1;
231 sysadm 1.10 strncpy (temp,
232     buffer + pmatch[1].rm_so,
233     pmatch[1].rm_eo - pmatch[1].rm_so);
234     temp[pmatch[1].rm_eo - pmatch[1].rm_so] = '\0';
235     p_menu_set->p_menu[i]->screen.row = atoi (temp);
236     strncpy (temp,
237     buffer + pmatch[2].rm_so,
238     pmatch[2].rm_eo - pmatch[2].rm_so);
239     temp[pmatch[2].rm_eo - pmatch[2].rm_so] = '\0';
240     p_menu_set->p_menu[i]->screen.col = atoi (temp);
241     strncpy (temp,
242     buffer + pmatch[3].rm_so,
243     pmatch[3].rm_eo - pmatch[3].rm_so);
244     temp[pmatch[3].rm_eo - pmatch[3].rm_so] = '\0';
245     sprintf (p_menu_set->p_menu[i]->screen.filename,
246     "%sMENU_SCR_%s", app_temp_dir, temp);
247     continue;
248     }
249     }
250 sysadm 1.3 }
251     break;
252     }
253 sysadm 1.1 }
254 sysadm 1.3 fclose (fin);
255    
256     p_menu_set->menu_count = i;
257     p_menu_set->menu_select_depth = 0;
258     p_menu_set->p_menu_select[p_menu_set->menu_select_depth]
259     = (i == 0 ? NULL : p_menu_set->p_menu[0]);
260 sysadm 1.2
261 sysadm 1.1 return 0;
262     }
263    
264 sysadm 1.10 MENU *
265     get_menu (MENU_SET * p_menu_set, const char *menu_name)
266 sysadm 1.3 {
267     int i;
268 sysadm 1.5
269 sysadm 1.3 for (i = 0; i < p_menu_set->menu_count; i++)
270     {
271 sysadm 1.10 if (strcmp (p_menu_set->p_menu[i]->name, menu_name) == 0)
272     {
273     return p_menu_set->p_menu[i];
274     }
275 sysadm 1.3 }
276 sysadm 1.5
277     return NULL;
278 sysadm 1.3 }
279    
280 sysadm 1.1 void
281 sysadm 1.3 display_menu_cursor (MENU * p_menu, int show)
282 sysadm 1.1 {
283 sysadm 1.3 moveto ((p_menu->items[p_menu->item_cur_pos])->r_row,
284     (p_menu->items[p_menu->item_cur_pos])->r_col - 2);
285 sysadm 1.1 prints (show ? ">" : " ");
286     iflush ();
287     }
288    
289     int
290 sysadm 1.3 display_menu (MENU * p_menu)
291 sysadm 1.1 {
292 sysadm 1.3 int i, row, col, menu_selectable = 0;
293    
294 sysadm 1.5 if (p_menu == NULL)
295     return -1;
296    
297 sysadm 1.13 if (p_menu->title.show)
298     show_top (p_menu->title.text);
299 sysadm 1.3
300 sysadm 1.13 if (p_menu->screen.show)
301     {
302     moveto (p_menu->screen.row, p_menu->screen.col);
303     if (display_file (p_menu->screen.filename) != 0)
304     log_error ("Display menu screen <%s> failed!\n",
305     p_menu->screen.filename);
306     }
307 sysadm 1.3
308     row = p_menu->items[0]->row;
309     col = p_menu->items[0]->col;
310    
311     for (i = 0; i < p_menu->item_count; i++)
312     {
313 sysadm 1.11 if (checkpriv (&BBS_priv, 0, p_menu->items[i]->priv) == 0
314 sysadm 1.13 || checklevel (&BBS_priv, p_menu->items[i]->level) == 0)
315 sysadm 1.10 {
316     p_menu->items[i]->display = 0;
317     }
318 sysadm 1.3 else
319 sysadm 1.10 {
320     p_menu->items[i]->display = 1;
321    
322     menu_selectable = 1;
323 sysadm 1.3
324 sysadm 1.10 if (p_menu->items[i]->row != 0)
325     row = p_menu->items[i]->row;
326     else
327     row++;
328     p_menu->items[i]->r_row = row;
329     if (p_menu->items[i]->col != 0)
330     col = p_menu->items[i]->col;
331     p_menu->items[i]->r_col = col;
332     moveto (row, col);
333     prints (p_menu->items[i]->text);
334     iflush ();
335     }
336 sysadm 1.3 }
337 sysadm 1.10
338 sysadm 1.3 if (!menu_selectable)
339     return -1;
340    
341 sysadm 1.1 display_menu_cursor (p_menu, 1);
342    
343     return 0;
344     }
345    
346 sysadm 1.12 int
347     display_current_menu (MENU_SET * p_menu_set)
348     {
349     MENU *p_menu;
350    
351     p_menu = p_menu_set->p_menu_select[p_menu_set->menu_select_depth];
352    
353     return display_menu (p_menu);
354     }
355    
356 sysadm 1.17 int
357 sysadm 1.3 menu_control (MENU_SET * p_menu_set, int key)
358 sysadm 1.1 {
359     int i;
360 sysadm 1.3 MENU *p_menu;
361    
362     if (p_menu_set->menu_count == 0)
363 sysadm 1.17 return 0;
364 sysadm 1.3
365     p_menu = p_menu_set->p_menu_select[p_menu_set->menu_select_depth];
366    
367 sysadm 1.1 switch (key)
368     {
369     case CR:
370     case KEY_RIGHT:
371 sysadm 1.3 if (p_menu->items[p_menu->item_cur_pos]->submenu)
372 sysadm 1.10 {
373     if (strcmp (p_menu->items[p_menu->item_cur_pos]->action, "..") == 0)
374     return menu_control (p_menu_set, KEY_LEFT);
375     p_menu_set->menu_select_depth++;
376     p_menu =
377     p_menu_set->p_menu_select[p_menu_set->menu_select_depth] =
378     get_menu (p_menu_set,
379     p_menu->items[p_menu->item_cur_pos]->action);
380     if (display_menu (p_menu) != 0)
381     return menu_control (p_menu_set, KEY_LEFT);
382     break;
383     }
384 sysadm 1.3 else
385 sysadm 1.10 {
386 sysadm 1.17 return (exec_cmd(p_menu->items[p_menu->item_cur_pos]->action,
387     p_menu->items[p_menu->item_cur_pos]->name));
388 sysadm 1.10 }
389 sysadm 1.3 case KEY_LEFT:
390     if (p_menu_set->menu_select_depth > 0)
391 sysadm 1.10 {
392     p_menu_set->menu_select_depth--;
393 sysadm 1.12 if (display_current_menu (p_menu_set) != 0)
394 sysadm 1.10 return menu_control (p_menu_set, KEY_LEFT);
395     break;
396     }
397 sysadm 1.3 else
398 sysadm 1.10 {
399     display_menu_cursor (p_menu, 0);
400     p_menu->item_cur_pos = p_menu->item_count - 1;
401 sysadm 1.12 while (!p_menu->items[p_menu->item_cur_pos]->display
402 sysadm 1.13 || p_menu->items[p_menu->item_cur_pos]->priv != 0
403     || p_menu->items[p_menu->item_cur_pos]->level != 0)
404 sysadm 1.10 p_menu->item_cur_pos--;
405     display_menu_cursor (p_menu, 1);
406     break;
407     }
408 sysadm 1.1 case KEY_UP:
409     display_menu_cursor (p_menu, 0);
410 sysadm 1.8 do
411 sysadm 1.10 {
412     p_menu->item_cur_pos--;
413     if (p_menu->item_cur_pos < 0)
414     p_menu->item_cur_pos = p_menu->item_count - 1;
415     }
416     while (!p_menu->items[p_menu->item_cur_pos]->display);
417 sysadm 1.1 display_menu_cursor (p_menu, 1);
418     break;
419     case KEY_DOWN:
420     display_menu_cursor (p_menu, 0);
421 sysadm 1.8 do
422 sysadm 1.10 {
423     p_menu->item_cur_pos++;
424     if (p_menu->item_cur_pos >= p_menu->item_count)
425     p_menu->item_cur_pos = 0;
426     }
427     while (!p_menu->items[p_menu->item_cur_pos]->display);
428 sysadm 1.1 display_menu_cursor (p_menu, 1);
429     break;
430     default:
431     for (i = 0; i < p_menu->item_count; i++)
432 sysadm 1.3 {
433 sysadm 1.14 if (key == p_menu->items[i]->name[0])
434     {
435     display_menu_cursor (p_menu, 0);
436     p_menu->item_cur_pos = i;
437     display_menu_cursor (p_menu, 1);
438 sysadm 1.17 return 0;
439 sysadm 1.14 }
440     }
441     if (isalpha (key))
442     {
443 sysadm 1.16 for (i = 0; i < p_menu->item_count; i++)
444 sysadm 1.3 {
445 sysadm 1.16 if (toupper (key) == toupper (p_menu->items[i]->name[0]))
446     {
447     display_menu_cursor (p_menu, 0);
448     p_menu->item_cur_pos = i;
449     display_menu_cursor (p_menu, 1);
450 sysadm 1.17 return 0;
451 sysadm 1.16 }
452 sysadm 1.3 }
453     }
454 sysadm 1.1 }
455    
456 sysadm 1.17 return 0;
457 sysadm 1.1 }
458 sysadm 1.15
459     void
460     unload_menu (MENU_SET * p_menu_set)
461     {
462 sysadm 1.16 MENU *p_menu;
463     MENU_ITEM *p_menuitem;
464 sysadm 1.15 int i, j;
465 sysadm 1.16
466 sysadm 1.15 for (i = 0; i < p_menu_set->menu_count; i++)
467     {
468 sysadm 1.16 p_menu = p_menu_set->p_menu[i];
469     for (j = 0; j < p_menu->item_count; j++)
470     {
471     free (p_menu->items[j]);
472     }
473     free (p_menu);
474 sysadm 1.15 }
475 sysadm 1.16
476 sysadm 1.15 p_menu_set->menu_count = 0;
477     p_menu_set->menu_select_depth = 0;
478     }

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