/[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.4 by sysadm, Sat Mar 19 13:46:26 2005 UTC Revision 1.9 by sysadm, Sun Mar 20 17:23:17 2005 UTC
# Line 22  Line 22 
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    
# Line 46  load_menu (MENU_SET * p_menu_set, const Line 47  load_menu (MENU_SET * p_menu_set, const
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, 2, pmatch) == 0)
51              {              {
52                strncpy (temp, buffer + pmatch[0].rm_so,                strncpy (temp, buffer + pmatch[1].rm_so,
53                         pmatch[0].rm_eo - pmatch[0].rm_so + 1);                         pmatch[1].rm_eo - pmatch[1].rm_so);
54                sprintf (screen_filename, "%sMENU_SCR_%s", app_temp_dir, temp);                temp [pmatch[1].rm_eo - pmatch[1].rm_so] = '\0';
55                  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                  {                  {
# Line 70  load_menu (MENU_SET * p_menu_set, const Line 72  load_menu (MENU_SET * p_menu_set, const
72                break;                break;
73              }              }
74    
75            if (ireg ("^%menu ([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));                p_menu_set->p_menu[i] = malloc (sizeof (MENU));
78    
79                strncpy (p_menu_set->p_menu[i]->name,                strncpy (p_menu_set->p_menu[i]->name,
80                  buffer + pmatch[0].rm_so,                  buffer + pmatch[1].rm_so,
81                  pmatch[0].rm_eo - pmatch[0].rm_so + 1);                  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    
84                j = 0;                j = 0;
85                                
86                while (fgets (buffer, 255, fin))                while (fgets (buffer, 255, fin))
# Line 97  load_menu (MENU_SET * p_menu_set, const Line 100  load_menu (MENU_SET * p_menu_set, const
100                      "^!([A-Za-z0-9_.]+)[[:space:]]*([0-9]+),"                      "^!([A-Za-z0-9_.]+)[[:space:]]*([0-9]+),"
101                      "[[:space:]]*([0-9]+),[[:space:]]*([0-9]+),"                      "[[:space:]]*([0-9]+),[[:space:]]*([0-9]+),"
102                      "[[:space:]]*\"([A-Za-z0-9_]+)\",[[:space:]]*\"([^\"]+)\"",                      "[[:space:]]*\"([A-Za-z0-9_]+)\",[[:space:]]*\"([^\"]+)\"",
103                      buffer, 6, pmatch) == 0)                      buffer, 7, pmatch) == 0)
104                      {                      {
105                        p_menu_set->p_menu[i]->items[j] = malloc (sizeof (MENU_ITEM));                        p_menu_set->p_menu[i]->items[j] = malloc (sizeof (MENU_ITEM));
106                        p_menu_set->p_menu[i]->items[j]->submenu = 1;                        p_menu_set->p_menu[i]->items[j]->submenu = 1;
107                        strncpy (p_menu_set->p_menu[i]->items[j]->action,                        strncpy (p_menu_set->p_menu[i]->items[j]->action,
                         buffer + pmatch[0].rm_so,  
                         pmatch[0].rm_eo - pmatch[0].rm_so + 1);  
                       strncpy (temp,  
108                          buffer + pmatch[1].rm_so,                          buffer + pmatch[1].rm_so,
109                          pmatch[1].rm_eo - pmatch[1].rm_so + 1);                          pmatch[1].rm_eo - pmatch[1].rm_so);
110                        p_menu_set->p_menu[i]->items[j]->row = atoi (temp);                        p_menu_set->p_menu[i]->items[j]->action[pmatch[1].rm_eo - pmatch[1].rm_so] = '\0';
111                        strncpy (temp,                        strncpy (temp,
112                          buffer + pmatch[2].rm_so,                          buffer + pmatch[2].rm_so,
113                          pmatch[2].rm_eo - pmatch[2].rm_so + 1);                          pmatch[2].rm_eo - pmatch[2].rm_so);
114                        p_menu_set->p_menu[i]->items[j]->col = atoi (temp);                        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,                        strncpy (temp,
117                          buffer + pmatch[3].rm_so,                          buffer + pmatch[3].rm_so,
118                          pmatch[3].rm_eo - pmatch[3].rm_so + 1);                          pmatch[3].rm_eo - pmatch[3].rm_so);
119                        p_menu_set->p_menu[i]->items[j]->priv = atoi (temp);                        temp[pmatch[3].rm_eo - pmatch[3].rm_so] = '\0';
120                        strncpy (p_menu_set->p_menu[i]->items[j]->name,                        p_menu_set->p_menu[i]->items[j]->col = atoi (temp);
121                          strncpy (temp,
122                          buffer + pmatch[4].rm_so,                          buffer + pmatch[4].rm_so,
123                          pmatch[4].rm_eo - pmatch[4].rm_so + 1);                          pmatch[4].rm_eo - pmatch[4].rm_so);
124                        strncpy (p_menu_set->p_menu[i]->items[j]->text,                        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,                          buffer + pmatch[5].rm_so,
128                          pmatch[5].rm_eo - pmatch[5].rm_so + 1);                          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++;                        j++;
135                        continue;                        continue;
136                      }                      }
# Line 129  load_menu (MENU_SET * p_menu_set, const Line 138  load_menu (MENU_SET * p_menu_set, const
138                      "^@([A-Za-z0-9_]+)[[:space:]]*([0-9]+),"                      "^@([A-Za-z0-9_]+)[[:space:]]*([0-9]+),"
139                      "[[:space:]]*([0-9]+),[[:space:]]*([0-9]+),"                      "[[:space:]]*([0-9]+),[[:space:]]*([0-9]+),"
140                      "[[:space:]]*\"([A-Za-z0-9_]+)\",[[:space:]]*\"([^\"]+)\"",                      "[[:space:]]*\"([A-Za-z0-9_]+)\",[[:space:]]*\"([^\"]+)\"",
141                      buffer, 6, pmatch) == 0)                      buffer, 7, pmatch) == 0)
142                      {                      {
143                        p_menu_set->p_menu[i]->items[j] = malloc (sizeof (MENU_ITEM));                        p_menu_set->p_menu[i]->items[j] = malloc (sizeof (MENU_ITEM));
144                        p_menu_set->p_menu[i]->items[j]->submenu = 0;                        p_menu_set->p_menu[i]->items[j]->submenu = 0;
145                        strncpy (p_menu_set->p_menu[i]->items[j]->action,                        strncpy (p_menu_set->p_menu[i]->items[j]->action,
                         buffer + pmatch[0].rm_so,  
                         pmatch[0].rm_eo - pmatch[0].rm_so + 1);  
                       strncpy (temp,  
146                          buffer + pmatch[1].rm_so,                          buffer + pmatch[1].rm_so,
147                          pmatch[1].rm_eo - pmatch[1].rm_so + 1);                          pmatch[1].rm_eo - pmatch[1].rm_so);
148                        p_menu_set->p_menu[i]->items[j]->row = atoi (temp);                        p_menu_set->p_menu[i]->items[j]->action[pmatch[0].rm_eo - pmatch[0].rm_so] = '\0';
149                        strncpy (temp,                        strncpy (temp,
150                          buffer + pmatch[2].rm_so,                          buffer + pmatch[2].rm_so,
151                          pmatch[2].rm_eo - pmatch[2].rm_so + 1);                          pmatch[2].rm_eo - pmatch[2].rm_so);
152                        p_menu_set->p_menu[i]->items[j]->col = atoi (temp);                        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,                        strncpy (temp,
155                          buffer + pmatch[3].rm_so,                          buffer + pmatch[3].rm_so,
156                          pmatch[3].rm_eo - pmatch[3].rm_so + 1);                          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);                        p_menu_set->p_menu[i]->items[j]->priv = atoi (temp);
164                        strncpy (p_menu_set->p_menu[i]->items[j]->name,                        strncpy (p_menu_set->p_menu[i]->items[j]->name,
                         buffer + pmatch[4].rm_so,  
                         pmatch[4].rm_eo - pmatch[4].rm_so + 1);  
                       strncpy (p_menu_set->p_menu[i]->items[j]->text,  
165                          buffer + pmatch[5].rm_so,                          buffer + pmatch[5].rm_so,
166                          pmatch[5].rm_eo - pmatch[5].rm_so + 1);                          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++;                        j++;
173                        continue;                        continue;
174                      }                      }
175                    if (ireg (                    if (ireg (
176                      "^title[[:space:]]*([0-9]+),"                      "^title[[:space:]]*([0-9]+),"
177                      "[[:space:]]*([0-9]+),[[:space:]]*\"([^\"]+)\"",                      "[[:space:]]*([0-9]+),[[:space:]]*\"([^\"]+)\"",
178                      buffer, 3, pmatch) == 0)                      buffer, 4, pmatch) == 0)
179                      {                      {
180                        strncpy (temp,                        strncpy (temp,
181                          buffer + pmatch[0].rm_so,                          buffer + pmatch[1].rm_so,
182                          pmatch[0].rm_eo - pmatch[0].rm_so + 1);                          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);                        p_menu_set->p_menu[i]->title.row = atoi (temp);
185                        strncpy (temp,                        strncpy (temp,
186                          buffer + pmatch[1].rm_so,                          buffer + pmatch[2].rm_so,
187                          pmatch[1].rm_eo - pmatch[1].rm_so + 1);                          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);                        p_menu_set->p_menu[i]->title.col = atoi (temp);
190                        strncpy (p_menu_set->p_menu[i]->title.text,                        strncpy (p_menu_set->p_menu[i]->title.text,
191                          buffer + pmatch[2].rm_so,                          buffer + pmatch[3].rm_so,
192                          pmatch[2].rm_eo - pmatch[2].rm_so + 1);                          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;                        continue;
195                      }                      }
196                    if (ireg (                    if (ireg (
197                      "^title[[:space:]]*([0-9]+),"                      "^screen[[:space:]]*([0-9]+),"
198                      "[[:space:]]*([0-9]+),[[:space:]]*S_([A-Za-z0-9_]+)",                      "[[:space:]]*([0-9]+),[[:space:]]*S_([A-Za-z0-9_]+)",
199                      buffer, 3, pmatch) == 0)                      buffer, 4, pmatch) == 0)
200                      {                      {
201                        strncpy (temp,                        strncpy (temp,
202                          buffer + pmatch[0].rm_so,                          buffer + pmatch[1].rm_so,
203                          pmatch[0].rm_eo - pmatch[0].rm_so + 1);                          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);                        p_menu_set->p_menu[i]->screen.row = atoi (temp);
206                        strncpy (temp,                        strncpy (temp,
207                          buffer + pmatch[1].rm_so,                          buffer + pmatch[2].rm_so,
208                          pmatch[1].rm_eo - pmatch[1].rm_so + 1);                          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);                        p_menu_set->p_menu[i]->screen.col = atoi (temp);
211                        strncpy (temp,                        strncpy (temp,
212                          buffer + pmatch[2].rm_so,                          buffer + pmatch[3].rm_so,
213                          pmatch[2].rm_eo - pmatch[2].rm_so + 1);                          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,                        sprintf (p_menu_set->p_menu[i]->screen.filename,
216                          "%sMENU_SCR_%s", app_temp_dir, temp);                          "%sMENU_SCR_%s", app_temp_dir, temp);
217                        continue;                        continue;
# Line 214  MENU * Line 235  MENU *
235  get_menu (MENU_SET * p_menu_set, const char * menu_name)  get_menu (MENU_SET * p_menu_set, const char * menu_name)
236  {  {
237    int i;    int i;
238    
239    for (i = 0; i < p_menu_set->menu_count; i++)    for (i = 0; i < p_menu_set->menu_count; i++)
240    {    {
241      if (strcmp(p_menu_set->p_menu[i]->name, menu_name) == 0)      if (strcmp(p_menu_set->p_menu[i]->name, menu_name) == 0)
# Line 221  get_menu (MENU_SET * p_menu_set, const c Line 243  get_menu (MENU_SET * p_menu_set, const c
243        return p_menu_set->p_menu[i];        return p_menu_set->p_menu[i];
244      }      }
245    }    }
246    
247      return NULL;
248  }  }
249    
250  void  void
# Line 237  display_menu (MENU * p_menu) Line 261  display_menu (MENU * p_menu)
261  {  {
262    int i, row, col, menu_selectable = 0;    int i, row, col, menu_selectable = 0;
263    
264      if (p_menu == NULL)
265        return -1;
266    
267    show_top (p_menu->title.text);    show_top (p_menu->title.text);
268    
269    moveto (p_menu->screen.row, p_menu->screen.col);    moveto (p_menu->screen.row, p_menu->screen.col);
270    display_file (p_menu->screen.filename);    if (display_file (p_menu->screen.filename) != 0)
271        log_error ("Display menu screen <%s> failed!\n", p_menu->screen.filename);
272    
273    row = p_menu->items[0]->row;    row = p_menu->items[0]->row;
274    col = p_menu->items[0]->col;    col = p_menu->items[0]->col;
# Line 257  display_menu (MENU * p_menu) Line 285  display_menu (MENU * p_menu)
285    
286          menu_selectable = 1;          menu_selectable = 1;
287                    
288          if (p_menu->items[i]->row == 0)          if (p_menu->items[i]->row != 0)
           row ++;  
         else  
289            row = p_menu->items[i]->row;            row = p_menu->items[i]->row;
         p_menu->items[i]->r_row = row;  
         if (p_menu->items[i]->col == 0)  
           col ++;  
290          else          else
291              row ++;
292            p_menu->items[i]->r_row = row;
293            if (p_menu->items[i]->col != 0)
294            col = p_menu->items[i]->col;            col = p_menu->items[i]->col;
295          p_menu->items[i]->r_col = col;          p_menu->items[i]->r_col = col;
296          moveto (row, col);          moveto (row, col);
# Line 298  menu_control (MENU_SET * p_menu_set, int Line 324  menu_control (MENU_SET * p_menu_set, int
324      case KEY_RIGHT:      case KEY_RIGHT:
325        if (p_menu->items[p_menu->item_cur_pos]->submenu)        if (p_menu->items[p_menu->item_cur_pos]->submenu)
326          {          {
327              if (strcmp (p_menu->items[p_menu->item_cur_pos]->action, "..") == 0)
328                return menu_control (p_menu_set, KEY_LEFT);
329            p_menu_set->menu_select_depth ++;            p_menu_set->menu_select_depth ++;
330            p_menu =            p_menu =
331              p_menu_set->p_menu_select[p_menu_set->menu_select_depth] =              p_menu_set->p_menu_select[p_menu_set->menu_select_depth] =
# Line 308  menu_control (MENU_SET * p_menu_set, int Line 336  menu_control (MENU_SET * p_menu_set, int
336          }          }
337        else        else
338          {          {
339            if (strcmp (p_menu->items[p_menu->item_cur_pos]->action, "..") == 0)            return (p_menu->items[p_menu->item_cur_pos]->action);
             return menu_control (p_menu_set, KEY_LEFT);  
           else  
             return (p_menu->items[p_menu->item_cur_pos]->action);  
340          }          }
341      case KEY_LEFT:      case KEY_LEFT:
342        if (p_menu_set->menu_select_depth > 0)        if (p_menu_set->menu_select_depth > 0)
# Line 334  menu_control (MENU_SET * p_menu_set, int Line 359  menu_control (MENU_SET * p_menu_set, int
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 --;        do
363        while (!p_menu->items[p_menu->item_cur_pos]->display)        {
364          p_menu->item_cur_pos --;           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)        } while (!p_menu->items[p_menu->item_cur_pos]->display);
         p_menu->item_cur_pos --;  
368        display_menu_cursor (p_menu, 1);        display_menu_cursor (p_menu, 1);
369        break;        break;
370      case KEY_DOWN:      case KEY_DOWN:
371        display_menu_cursor (p_menu, 0);        display_menu_cursor (p_menu, 0);
372        p_menu->item_cur_pos++;        do
373        while (!p_menu->items[p_menu->item_cur_pos]->display)        {
374          p_menu->item_cur_pos ++;          p_menu->item_cur_pos++;
375        if (p_menu->item_cur_pos >= p_menu->item_count)          if (p_menu->item_cur_pos >= p_menu->item_count)
376          p_menu->item_cur_pos = 0;            p_menu->item_cur_pos = 0;
377        while (!p_menu->items[p_menu->item_cur_pos]->display)        } while (!p_menu->items[p_menu->item_cur_pos]->display);
         p_menu->item_cur_pos ++;  
378        display_menu_cursor (p_menu, 1);        display_menu_cursor (p_menu, 1);
379        break;        break;
380      default:      default:


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

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