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

Annotation of /lbbs/src/menu.c

Parent Directory Parent Directory | Revision Log Revision Log


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

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