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

Annotation of /lbbs/src/menu.c

Parent Directory Parent Directory | Revision Log Revision Log


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

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