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

Diff of /lbbs/src/menu.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.2 by sysadm, Sat Mar 19 08:23:05 2005 UTC Revision 1.6 by sysadm, Sun Mar 20 07:39:28 2005 UTC
# Line 15  Line 15 
15   *                                                                         *   *                                                                         *
16   ***************************************************************************/   ***************************************************************************/
17    
18    #include "bbs.h"
19  #include "menu.h"  #include "menu.h"
20  #include "io.h"  #include "io.h"
21  #include "common.h"  #include "common.h"
22  #include <stdio.h>  #include <stdio.h>
23  #include <ctype.h>  #include <ctype.h>
24  #include <regex.h>  #include <regex.h>
25    #include <stdlib.h>
26    
27  MENU_SET bbs_menu;  MENU_SET bbs_menu;
28    
29  int  int
30  load_menu (MENU *p_menu, const char *conf_file)  load_menu (MENU_SET * p_menu_set, const char *conf_file)
31  {  {
32    FILE *fin, *fout;    FILE *fin, *fout;
33    int i = 0;    int i = 0, j, k;
34    char buffer[256], screen_filename[256], temp[256];    char buffer[256], screen_filename[256], temp[256];
35    regmatch_t pmatch[10];    regmatch_t pmatch[10];
36    
# Line 39  load_menu (MENU *p_menu, const char *con Line 41  load_menu (MENU *p_menu, const char *con
41      }      }
42    
43    while (fgets (buffer, 255, fin))    while (fgets (buffer, 255, fin))
44    {      {
45          switch (buffer[0])        switch (buffer[0])
46          {          {
47            case '#':          case '#':
48                  break;            break;
49            case '%':          case '%':
50                  if (ireg ("^%S_([A-Za-z0-9_]+)", buffer, 1, pmatch) == 0)            if (ireg ("^%S_([A-Za-z0-9_]+)", buffer, 1, pmatch) == 0)
51                  {              {
52                    strncpy (temp, buffer + pmatch[0].rm_so,                strncpy (temp, buffer + pmatch[0].rm_so,
53                      pmatch[0].rm_eo - pmatch[0].rm_so + 1);                         pmatch[0].rm_eo - pmatch[0].rm_so);
54                    sprintf (screen_filename, "%sMENU_SCR_%s",                temp [pmatch[0].rm_eo - pmatch[0].rm_so] = '\0';
55                      app_temp_dir, temp);                sprintf (screen_filename, "%sMENU_SCR_%s", app_temp_dir, temp);
56                        
57                    if ((fout = fopen (screen_filename, "w")) == NULL)                if ((fout = fopen (screen_filename, "w")) == NULL)
58                     {                  {
59                            log_error ("Open %s failed", screen_filename);                    log_error ("Open %s failed", screen_filename);
60                           return -2;                    return -2;
61                      }                  }
62    
63                    while (fgets (buffer, 255, fin))                while (fgets (buffer, 255, fin))
64                    {                  {
65                          if (buffer[0] != '%')                    if (buffer[0] != '%')
66                          fputs (buffer, fout);                      fputs (buffer, fout);
67                           else                    else
68                             break;                      break;
69                    }                  }
70              
71                    fclose (fout);                fclose (fout);
72                    break;                break;
73                  }              }
74                    
75                  if (ireg ("^%S_([A-Za-z0-9_]+)", buffer, 1, pmatch) == 0)            if (ireg ("^%menu ([A-Za-z0-9_]+)", buffer, 2, pmatch) == 0)
76                  {              {
77                  }                p_menu_set->p_menu[i] = malloc (sizeof (MENU));
78                  break;  
79            }                    strncpy (p_menu_set->p_menu[i]->name,
80        fscanf (fin, "%d %d %s ", &((p_menu->items[i]).row),                  buffer + pmatch[1].rm_so,
81          &((p_menu->items[i]).col), &((p_menu->items[i]).name));                  pmatch[1].rm_eo - pmatch[1].rm_so);
82        fgets ((p_menu->items[i]).text, MAX_MENUITEM_LENGTH, fin);                p_menu_set->p_menu[i]->name[pmatch[1].rm_eo - pmatch[1].rm_so] = '\0';
83        i++;        
84                  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                        "^!([A-Za-z0-9_.]+)[[:space:]]*([0-9]+),"
101                        "[[:space:]]*([0-9]+),[[:space:]]*([0-9]+),"
102                        "[[:space:]]*\"([A-Za-z0-9_]+)\",[[:space:]]*\"([^\"]+)\"",
103                        buffer, 7, pmatch) == 0)
104                        {
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                            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                            buffer + pmatch[2].rm_so,
113                            pmatch[2].rm_eo - pmatch[2].rm_so);
114                          temp[pmatch[2].rm_eo - pmatch[2].rm_so] = '\0';
115                          p_menu_set->p_menu[i]->items[j]->row = atoi (temp);
116                          strncpy (temp,
117                            buffer + pmatch[3].rm_so,
118                            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                          strncpy (temp,
122                            buffer + pmatch[4].rm_so,
123                            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                          strncpy (p_menu_set->p_menu[i]->items[j]->name,
127                            buffer + pmatch[5].rm_so,
128                            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                          strncpy (p_menu_set->p_menu[i]->items[j]->text,
131                            buffer + pmatch[6].rm_so,
132                            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                          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                        buffer, 7, pmatch) == 0)
142                        {
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                            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                          strncpy (temp,
150                            buffer + pmatch[2].rm_so,
151                            pmatch[2].rm_eo - pmatch[2].rm_so);
152                          temp[pmatch[2].rm_eo - pmatch[2].rm_so] = '\0';
153                          p_menu_set->p_menu[i]->items[j]->row = atoi (temp);
154                          strncpy (temp,
155                            buffer + pmatch[3].rm_so,
156                            pmatch[3].rm_eo - pmatch[3].rm_so);
157                          temp[pmatch[3].rm_eo - pmatch[3].rm_so] = '\0';
158                          p_menu_set->p_menu[i]->items[j]->col = atoi (temp);
159                          strncpy (temp,
160                            buffer + pmatch[4].rm_so,
161                            pmatch[4].rm_eo - pmatch[4].rm_so);
162                          temp[pmatch[4].rm_eo - pmatch[4].rm_so] = '\0';
163                          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                            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                          strncpy (p_menu_set->p_menu[i]->items[j]->text,
169                            buffer + pmatch[6].rm_so,
170                            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                          j++;
173                          continue;
174                        }
175                      if (ireg (
176                        "^title[[:space:]]*([0-9]+),"
177                        "[[:space:]]*([0-9]+),[[:space:]]*\"([^\"]+)\"",
178                        buffer, 4, pmatch) == 0)
179                        {
180                          strncpy (temp,
181                            buffer + pmatch[1].rm_so,
182                            pmatch[1].rm_eo - pmatch[1].rm_so);
183                          temp[pmatch[1].rm_eo - pmatch[1].rm_so] = '\0';
184                          p_menu_set->p_menu[i]->title.row = atoi (temp);
185                          strncpy (temp,
186                            buffer + pmatch[2].rm_so,
187                            pmatch[2].rm_eo - pmatch[2].rm_so);
188                          temp[pmatch[2].rm_eo - pmatch[2].rm_so] = '\0';
189                          p_menu_set->p_menu[i]->title.col = atoi (temp);
190                          strncpy (p_menu_set->p_menu[i]->title.text,
191                            buffer + pmatch[3].rm_so,
192                            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                          continue;
195                        }
196                      if (ireg (
197                        "^title[[:space:]]*([0-9]+),"
198                        "[[:space:]]*([0-9]+),[[:space:]]*S_([A-Za-z0-9_]+)",
199                        buffer, 4, pmatch) == 0)
200                        {
201                          strncpy (temp,
202                            buffer + pmatch[1].rm_so,
203                            pmatch[1].rm_eo - pmatch[1].rm_so);
204                          temp[pmatch[1].rm_eo - pmatch[1].rm_so] = '\0';
205                          p_menu_set->p_menu[i]->screen.row = atoi (temp);
206                          strncpy (temp,
207                            buffer + pmatch[2].rm_so,
208                            pmatch[2].rm_eo - pmatch[2].rm_so);
209                          temp[pmatch[2].rm_eo - pmatch[2].rm_so] = '\0';
210                          p_menu_set->p_menu[i]->screen.col = atoi (temp);
211                          strncpy (temp,
212                            buffer + pmatch[3].rm_so,
213                            pmatch[3].rm_eo - pmatch[3].rm_so);
214                          temp[pmatch[3].rm_eo - pmatch[3].rm_so] = '\0';
215                          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      }      }
224        fclose (fin);
225      fclose (fin);  
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    
   p_menu->item_count = i;  
   p_menu->item_cur_pos = 0;  
     
231    return 0;    return 0;
232  }  }
233    
234    MENU *
235    get_menu (MENU_SET * p_menu_set, const char * menu_name)
236    {
237      int i;
238    
239      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    
247      return NULL;
248    }
249    
250  void  void
251  display_menu_cursor (MENU *p_menu, int show)  display_menu_cursor (MENU * p_menu, int show)
252  {  {
253    moveto ((p_menu->items[p_menu->item_cur_pos]).row,    moveto ((p_menu->items[p_menu->item_cur_pos])->r_row,
254      (p_menu->items[p_menu->item_cur_pos]).col - 2);            (p_menu->items[p_menu->item_cur_pos])->r_col - 2);
255    prints (show ? ">" : " ");    prints (show ? ">" : " ");
256    iflush ();    iflush ();
257  }  }
258    
259  int  int
260  display_menu (MENU *p_menu)  display_menu (MENU * p_menu)
261  {  {
262    int i;    int i, row, col, menu_selectable = 0;
263      
264      if (p_menu == NULL)
265        return -1;
266    
267      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++)    for (i = 0; i < p_menu->item_count; i++)
276    {      {
277      moveto ((p_menu->items[i]).row, (p_menu->items[i]).col);        if (checkpriv (&BBS_priv, 0, p_menu->items[i]->priv) == 0)
278      prints ((p_menu->items[i]).text);        {
279      iflush ();          p_menu->items[i]->display = 0;
280    }        }
281          else
282          {
283            p_menu->items[i]->display = 1;
284    
285            menu_selectable = 1;
286            
287            if (p_menu->items[i]->row != 0)
288              row = p_menu->items[i]->row;
289            else
290              row ++;
291            p_menu->items[i]->r_row = row;
292            if (p_menu->items[i]->col != 0)
293              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      
301      if (!menu_selectable)
302        return -1;
303    
304    display_menu_cursor (p_menu, 1);    display_menu_cursor (p_menu, 1);
305    
306    return 0;    return 0;
307  }  }
308    
309  char  const char *
310  menu_control (MENU *p_menu, int key)  menu_control (MENU_SET * p_menu_set, int key)
311  {  {
312    int i;    int i;
313        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    switch (key)    switch (key)
321      {      {
322      case CR:      case CR:
323      case KEY_RIGHT:      case KEY_RIGHT:
324        return ((p_menu->items[p_menu->item_cur_pos]).key);        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              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            }
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      case KEY_UP:      case KEY_UP:
361        display_menu_cursor (p_menu, 0);        display_menu_cursor (p_menu, 0);
362        p_menu->item_cur_pos --;        p_menu->item_cur_pos --;
363          while (!p_menu->items[p_menu->item_cur_pos]->display)
364            p_menu->item_cur_pos --;
365        if (p_menu->item_cur_pos < 0)        if (p_menu->item_cur_pos < 0)
366          p_menu->item_cur_pos = p_menu->item_count - 1;          p_menu->item_cur_pos = p_menu->item_count - 1;
367          while (!p_menu->items[p_menu->item_cur_pos]->display)
368            p_menu->item_cur_pos --;
369        display_menu_cursor (p_menu, 1);        display_menu_cursor (p_menu, 1);
370        break;        break;
371      case KEY_DOWN:      case KEY_DOWN:
372        display_menu_cursor (p_menu, 0);        display_menu_cursor (p_menu, 0);
373        p_menu->item_cur_pos ++;        p_menu->item_cur_pos++;
374          while (!p_menu->items[p_menu->item_cur_pos]->display)
375            p_menu->item_cur_pos ++;
376        if (p_menu->item_cur_pos >= p_menu->item_count)        if (p_menu->item_cur_pos >= p_menu->item_count)
377          p_menu->item_cur_pos = 0;          p_menu->item_cur_pos = 0;
378          while (!p_menu->items[p_menu->item_cur_pos]->display)
379            p_menu->item_cur_pos ++;
380        display_menu_cursor (p_menu, 1);        display_menu_cursor (p_menu, 1);
381        break;        break;
382      default:      default:
383        for (i = 0; i < p_menu->item_count; i++)        for (i = 0; i < p_menu->item_count; i++)
384        {          {
385          if (toupper(key) == toupper((p_menu->items[i]).key))            if (toupper (key) == toupper (p_menu->items[i]->name[0]))
386          {              {
387            display_menu_cursor (p_menu, 0);                display_menu_cursor (p_menu, 0);
388            p_menu->item_cur_pos = i;                p_menu->item_cur_pos = i;
389            display_menu_cursor (p_menu, 1);                display_menu_cursor (p_menu, 1);
390            break;                break;
391          }              }
392        }          }
393      }      }
394    
395    return '\0';    return "";
396  }  }


Legend:
Removed lines/characters  
Changed lines/characters
  Added lines/characters

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