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

Annotation of /lbbs/src/menu.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.8 - (hide annotations)
Sun Mar 20 14:49:24 2005 UTC (21 years ago) by sysadm
Branch: MAIN
Changes since 1.7: +12 -14 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     temp [pmatch[1].rm_eo - pmatch[1].rm_so] = '\0';
55 sysadm 1.6 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.5 buffer + pmatch[1].rm_so,
81 sysadm 1.6 pmatch[1].rm_eo - pmatch[1].rm_so);
82     p_menu_set->p_menu[i]->name[pmatch[1].rm_eo - pmatch[1].rm_so] = '\0';
83 sysadm 1.5
84 sysadm 1.3 j = 0;
85    
86     while (fgets (buffer, 255, fin))
87     {
88     if (buffer[0] == '#')
89     {
90     break;
91     }
92     if (buffer[0] == '%')
93     {
94     p_menu_set->p_menu[i]->item_count = j;
95     p_menu_set->p_menu[i]->item_cur_pos = 0;
96     i++;
97     break;
98     }
99     if (ireg (
100 sysadm 1.4 "^!([A-Za-z0-9_.]+)[[:space:]]*([0-9]+),"
101 sysadm 1.3 "[[:space:]]*([0-9]+),[[:space:]]*([0-9]+),"
102     "[[:space:]]*\"([A-Za-z0-9_]+)\",[[:space:]]*\"([^\"]+)\"",
103 sysadm 1.5 buffer, 7, pmatch) == 0)
104 sysadm 1.3 {
105     p_menu_set->p_menu[i]->items[j] = malloc (sizeof (MENU_ITEM));
106     p_menu_set->p_menu[i]->items[j]->submenu = 1;
107     strncpy (p_menu_set->p_menu[i]->items[j]->action,
108     buffer + pmatch[1].rm_so,
109 sysadm 1.6 pmatch[1].rm_eo - pmatch[1].rm_so);
110     p_menu_set->p_menu[i]->items[j]->action[pmatch[1].rm_eo - pmatch[1].rm_so] = '\0';
111     strncpy (temp,
112 sysadm 1.3 buffer + pmatch[2].rm_so,
113 sysadm 1.6 pmatch[2].rm_eo - pmatch[2].rm_so);
114     temp[pmatch[2].rm_eo - pmatch[2].rm_so] = '\0';
115 sysadm 1.5 p_menu_set->p_menu[i]->items[j]->row = atoi (temp);
116 sysadm 1.3 strncpy (temp,
117     buffer + pmatch[3].rm_so,
118 sysadm 1.6 pmatch[3].rm_eo - pmatch[3].rm_so);
119     temp[pmatch[3].rm_eo - pmatch[3].rm_so] = '\0';
120     p_menu_set->p_menu[i]->items[j]->col = atoi (temp);
121 sysadm 1.5 strncpy (temp,
122     buffer + pmatch[4].rm_so,
123 sysadm 1.6 pmatch[4].rm_eo - pmatch[4].rm_so);
124     temp[pmatch[4].rm_eo - pmatch[4].rm_so] = '\0';
125     p_menu_set->p_menu[i]->items[j]->priv = atoi (temp);
126 sysadm 1.3 strncpy (p_menu_set->p_menu[i]->items[j]->name,
127     buffer + pmatch[5].rm_so,
128 sysadm 1.6 pmatch[5].rm_eo - pmatch[5].rm_so);
129     p_menu_set->p_menu[i]->items[j]->name[pmatch[5].rm_eo - pmatch[5].rm_so] = '\0';
130 sysadm 1.5 strncpy (p_menu_set->p_menu[i]->items[j]->text,
131     buffer + pmatch[6].rm_so,
132 sysadm 1.6 pmatch[6].rm_eo - pmatch[6].rm_so);
133     p_menu_set->p_menu[i]->items[j]->text[pmatch[6].rm_eo - pmatch[6].rm_so] = '\0';
134 sysadm 1.3 j++;
135     continue;
136     }
137     if (ireg (
138     "^@([A-Za-z0-9_]+)[[:space:]]*([0-9]+),"
139     "[[:space:]]*([0-9]+),[[:space:]]*([0-9]+),"
140     "[[:space:]]*\"([A-Za-z0-9_]+)\",[[:space:]]*\"([^\"]+)\"",
141 sysadm 1.5 buffer, 7, pmatch) == 0)
142 sysadm 1.3 {
143     p_menu_set->p_menu[i]->items[j] = malloc (sizeof (MENU_ITEM));
144     p_menu_set->p_menu[i]->items[j]->submenu = 0;
145     strncpy (p_menu_set->p_menu[i]->items[j]->action,
146     buffer + pmatch[1].rm_so,
147 sysadm 1.6 pmatch[1].rm_eo - pmatch[1].rm_so);
148     p_menu_set->p_menu[i]->items[j]->action[pmatch[0].rm_eo - pmatch[0].rm_so] = '\0';
149 sysadm 1.3 strncpy (temp,
150     buffer + pmatch[2].rm_so,
151 sysadm 1.6 pmatch[2].rm_eo - pmatch[2].rm_so);
152     temp[pmatch[2].rm_eo - pmatch[2].rm_so] = '\0';
153 sysadm 1.5 p_menu_set->p_menu[i]->items[j]->row = atoi (temp);
154 sysadm 1.3 strncpy (temp,
155     buffer + pmatch[3].rm_so,
156 sysadm 1.6 pmatch[3].rm_eo - pmatch[3].rm_so);
157     temp[pmatch[3].rm_eo - pmatch[3].rm_so] = '\0';
158 sysadm 1.5 p_menu_set->p_menu[i]->items[j]->col = atoi (temp);
159     strncpy (temp,
160     buffer + pmatch[4].rm_so,
161 sysadm 1.6 pmatch[4].rm_eo - pmatch[4].rm_so);
162     temp[pmatch[4].rm_eo - pmatch[4].rm_so] = '\0';
163 sysadm 1.3 p_menu_set->p_menu[i]->items[j]->priv = atoi (temp);
164     strncpy (p_menu_set->p_menu[i]->items[j]->name,
165     buffer + pmatch[5].rm_so,
166 sysadm 1.6 pmatch[5].rm_eo - pmatch[5].rm_so);
167     p_menu_set->p_menu[i]->items[j]->name[pmatch[5].rm_eo - pmatch[5].rm_so] = '\0';
168 sysadm 1.5 strncpy (p_menu_set->p_menu[i]->items[j]->text,
169     buffer + pmatch[6].rm_so,
170 sysadm 1.6 pmatch[6].rm_eo - pmatch[6].rm_so);
171     p_menu_set->p_menu[i]->items[j]->text[pmatch[6].rm_eo - pmatch[6].rm_so] = '\0';
172 sysadm 1.3 j++;
173     continue;
174     }
175     if (ireg (
176     "^title[[:space:]]*([0-9]+),"
177     "[[:space:]]*([0-9]+),[[:space:]]*\"([^\"]+)\"",
178 sysadm 1.5 buffer, 4, pmatch) == 0)
179 sysadm 1.3 {
180     strncpy (temp,
181 sysadm 1.5 buffer + pmatch[1].rm_so,
182 sysadm 1.6 pmatch[1].rm_eo - pmatch[1].rm_so);
183     temp[pmatch[1].rm_eo - pmatch[1].rm_so] = '\0';
184 sysadm 1.3 p_menu_set->p_menu[i]->title.row = atoi (temp);
185     strncpy (temp,
186 sysadm 1.5 buffer + pmatch[2].rm_so,
187 sysadm 1.6 pmatch[2].rm_eo - pmatch[2].rm_so);
188     temp[pmatch[2].rm_eo - pmatch[2].rm_so] = '\0';
189 sysadm 1.3 p_menu_set->p_menu[i]->title.col = atoi (temp);
190     strncpy (p_menu_set->p_menu[i]->title.text,
191 sysadm 1.5 buffer + pmatch[3].rm_so,
192 sysadm 1.6 pmatch[3].rm_eo - pmatch[3].rm_so);
193     p_menu_set->p_menu[i]->title.text[pmatch[3].rm_eo - pmatch[3].rm_so] = '\0';
194 sysadm 1.3 continue;
195     }
196     if (ireg (
197     "^title[[:space:]]*([0-9]+),"
198     "[[:space:]]*([0-9]+),[[:space:]]*S_([A-Za-z0-9_]+)",
199 sysadm 1.5 buffer, 4, pmatch) == 0)
200 sysadm 1.3 {
201     strncpy (temp,
202     buffer + pmatch[1].rm_so,
203 sysadm 1.6 pmatch[1].rm_eo - pmatch[1].rm_so);
204     temp[pmatch[1].rm_eo - pmatch[1].rm_so] = '\0';
205 sysadm 1.5 p_menu_set->p_menu[i]->screen.row = atoi (temp);
206 sysadm 1.3 strncpy (temp,
207     buffer + pmatch[2].rm_so,
208 sysadm 1.6 pmatch[2].rm_eo - pmatch[2].rm_so);
209     temp[pmatch[2].rm_eo - pmatch[2].rm_so] = '\0';
210 sysadm 1.5 p_menu_set->p_menu[i]->screen.col = atoi (temp);
211     strncpy (temp,
212     buffer + pmatch[3].rm_so,
213 sysadm 1.6 pmatch[3].rm_eo - pmatch[3].rm_so);
214     temp[pmatch[3].rm_eo - pmatch[3].rm_so] = '\0';
215 sysadm 1.3 sprintf (p_menu_set->p_menu[i]->screen.filename,
216     "%sMENU_SCR_%s", app_temp_dir, temp);
217     continue;
218     }
219     }
220     }
221     break;
222     }
223 sysadm 1.1 }
224 sysadm 1.3 fclose (fin);
225    
226     p_menu_set->menu_count = i;
227     p_menu_set->menu_select_depth = 0;
228     p_menu_set->p_menu_select[p_menu_set->menu_select_depth]
229     = (i == 0 ? NULL : p_menu_set->p_menu[0]);
230 sysadm 1.2
231 sysadm 1.1 return 0;
232     }
233    
234 sysadm 1.3 MENU *
235     get_menu (MENU_SET * p_menu_set, const char * menu_name)
236     {
237     int i;
238 sysadm 1.5
239 sysadm 1.3 for (i = 0; i < p_menu_set->menu_count; i++)
240     {
241     if (strcmp(p_menu_set->p_menu[i]->name, menu_name) == 0)
242     {
243     return p_menu_set->p_menu[i];
244     }
245     }
246 sysadm 1.5
247     return NULL;
248 sysadm 1.3 }
249    
250 sysadm 1.1 void
251 sysadm 1.3 display_menu_cursor (MENU * p_menu, int show)
252 sysadm 1.1 {
253 sysadm 1.3 moveto ((p_menu->items[p_menu->item_cur_pos])->r_row,
254     (p_menu->items[p_menu->item_cur_pos])->r_col - 2);
255 sysadm 1.1 prints (show ? ">" : " ");
256     iflush ();
257     }
258    
259     int
260 sysadm 1.3 display_menu (MENU * p_menu)
261 sysadm 1.1 {
262 sysadm 1.3 int i, row, col, menu_selectable = 0;
263    
264 sysadm 1.5 if (p_menu == NULL)
265     return -1;
266    
267 sysadm 1.3 show_top (p_menu->title.text);
268    
269     moveto (p_menu->screen.row, p_menu->screen.col);
270     display_file (p_menu->screen.filename);
271    
272     row = p_menu->items[0]->row;
273     col = p_menu->items[0]->col;
274    
275     for (i = 0; i < p_menu->item_count; i++)
276     {
277     if (checkpriv (&BBS_priv, 0, p_menu->items[i]->priv) == 0)
278     {
279     p_menu->items[i]->display = 0;
280     }
281     else
282     {
283     p_menu->items[i]->display = 1;
284    
285     menu_selectable = 1;
286    
287 sysadm 1.5 if (p_menu->items[i]->row != 0)
288     row = p_menu->items[i]->row;
289     else
290 sysadm 1.3 row ++;
291     p_menu->items[i]->r_row = row;
292 sysadm 1.5 if (p_menu->items[i]->col != 0)
293 sysadm 1.3 col = p_menu->items[i]->col;
294     p_menu->items[i]->r_col = col;
295     moveto (row, col);
296     prints (p_menu->items[i]->text);
297     iflush ();
298     }
299     }
300 sysadm 1.1
301 sysadm 1.3 if (!menu_selectable)
302     return -1;
303    
304 sysadm 1.1 display_menu_cursor (p_menu, 1);
305    
306     return 0;
307     }
308    
309 sysadm 1.3 const char *
310     menu_control (MENU_SET * p_menu_set, int key)
311 sysadm 1.1 {
312     int i;
313 sysadm 1.3 MENU *p_menu;
314    
315     if (p_menu_set->menu_count == 0)
316     return "";
317    
318     p_menu = p_menu_set->p_menu_select[p_menu_set->menu_select_depth];
319    
320 sysadm 1.1 switch (key)
321     {
322     case CR:
323     case KEY_RIGHT:
324 sysadm 1.3 if (p_menu->items[p_menu->item_cur_pos]->submenu)
325     {
326     p_menu_set->menu_select_depth ++;
327     p_menu =
328     p_menu_set->p_menu_select[p_menu_set->menu_select_depth] =
329     get_menu (p_menu_set, p_menu->items[p_menu->item_cur_pos]->action);
330     if (display_menu (p_menu) != 0)
331     return menu_control (p_menu_set, KEY_LEFT);
332     break;
333     }
334     else
335     {
336 sysadm 1.4 if (strcmp (p_menu->items[p_menu->item_cur_pos]->action, "..") == 0)
337     return menu_control (p_menu_set, KEY_LEFT);
338     else
339     return (p_menu->items[p_menu->item_cur_pos]->action);
340 sysadm 1.3 }
341     case KEY_LEFT:
342     if (p_menu_set->menu_select_depth > 0)
343     {
344     p_menu_set->menu_select_depth --;
345     p_menu =
346     p_menu_set->p_menu_select[p_menu_set->menu_select_depth];
347     if (display_menu (p_menu) != 0)
348     return menu_control (p_menu_set, KEY_LEFT);
349     break;
350     }
351     else
352     {
353     display_menu_cursor (p_menu, 0);
354     p_menu->item_cur_pos = p_menu->item_count - 1;
355     while (!p_menu->items[p_menu->item_cur_pos]->display)
356     p_menu->item_cur_pos --;
357     display_menu_cursor (p_menu, 1);
358     break;
359     }
360 sysadm 1.1 case KEY_UP:
361     display_menu_cursor (p_menu, 0);
362 sysadm 1.8 do
363     {
364     p_menu->item_cur_pos --;
365     if (p_menu->item_cur_pos < 0)
366     p_menu->item_cur_pos = p_menu->item_count - 1;
367     } while (!p_menu->items[p_menu->item_cur_pos]->display);
368 sysadm 1.1 display_menu_cursor (p_menu, 1);
369     break;
370     case KEY_DOWN:
371     display_menu_cursor (p_menu, 0);
372 sysadm 1.8 do
373     {
374     p_menu->item_cur_pos++;
375     if (p_menu->item_cur_pos >= p_menu->item_count)
376     p_menu->item_cur_pos = 0;
377     } while (!p_menu->items[p_menu->item_cur_pos]->display);
378 sysadm 1.1 display_menu_cursor (p_menu, 1);
379     break;
380     default:
381     for (i = 0; i < p_menu->item_count; i++)
382 sysadm 1.3 {
383     if (toupper (key) == toupper (p_menu->items[i]->name[0]))
384     {
385     display_menu_cursor (p_menu, 0);
386     p_menu->item_cur_pos = i;
387     display_menu_cursor (p_menu, 1);
388     break;
389     }
390     }
391 sysadm 1.1 }
392    
393 sysadm 1.3 return "";
394 sysadm 1.1 }

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