Listing 1 (rmenu3.c)

  1: /***************************************************
  2:  * Program: RMENU Menu Interpreter
  3:  *  Module: rmenu3.c
  4:  *    Execute a Menu Item
  5:  * Written by: Leor Zolman, 7/91
  6:  ***************************************************/
  7:
  8: #include "cmenu.h"
  9: #include "rcmenu.h"
 10:
 11: #if __STDC__
 12: #pragma hdrstop
 13: #endif
 14:
 15: /************************************************************
 16:  * do_item():
 17:  * Perform the action associated with a particular item.
 18:  * Default path is supplied as "path":
 19:  ************************************************************/
 20:
 21: int do_item(M2p, curr, path)
 22: MENU2 *M2p;
 23: int curr;
 24: char *path;
 25: {
 26:    ITEM *Ip = M2p -> Items[curr];
 27:    char newpath[MAX_PATH];
 28:    int i, j;
 29:
 30:    strcpy(newpath, make_path(path, Ip -> path));
 31:
 32:    switch (Ip -> acttyp)
 33:    {
 34:       case ACT_CMND:
 35:          do_cmnd(Ip, newpath);
 36:          break;
 37:
 38:       case ACT_LMENU:
 39:          if (sub_menu(Ip->lmenunum, newpath) == EXITALL)
 40:             return EXITALL;
 41:          break;
 42:
 43:       case ACT_EMENU:
 44:          if (do_emenu(Ip, newpath) == EXITALL)
 45:             return EXITALL;
 46:          break;
 47:    }
 48:    return OK;
 49: }
 50:
 51:
 52: /************************************************************
 53:  * show_item():
 54:  * Display the action associated with a particular item.
 55:  * Default path is supplied as "path":
 56:  ************************************************************/
 57:
 58: Void show_item(M2p, curr, path)
 59: MENU2 *M2p;
 60: int curr;
 61: char *path;
 62: {
 63:    ITEM *Ip = M2p -> Items[curr];
 64:    char newpath[MAX_PATH];
 65:    int i, j;
 66:
 67:    strcpy(newpath, make_path(path, Ip -> path));
 68:
 69:    switch (Ip -> acttyp)
 70:    {
 71:       case ACT_CMND:
 72:          show_cmnd(Ip, newpath);
 73:          break;
 74:
 75:       case ACT_LMENU:
 76:          put_msg(0, "This is a local menu. Press any key: ");
 77:          break;
 78:
 79:       case ACT_EMENU:
 80:          put_msg(0,
 81:           " Path: %s; Emenu spec: %s. Press any key to continue:",
 82:                            newpath, Ip -> action);
 83:          break;
 84:    }
 85: /*  return OK; */
 86: }
 87:
 88:
 89: /************************************************************
 90:  * do_cmnd():
 91:  * Run a directly-executable item.
 92:  ************************************************************/
 93:
 94: Void do_cmnd(Ip, path)
 95: ITEM *Ip;
 96: char *path;
 97: {
 98:    char *cmd_line;
 99:    int retval;
100:
101:    cmd_line = make_cmd(path, Ip -> action);
102:
103:    if (Ip -> pre_clear == YES ||
104:       (Ip -> pre_clear == DEFAULT && DEF_PRECLEAR == YES))
105:          clear();
106:
107:    move(0, 0);
108:    refresh();
109:
110:    if (debug)
111:       put_msg(0, "About to exec: %s", cmd_line);
112:
113:    pre_shell();                      /* set up for shell call    */
114:    retval = system0(cmd_line);       /* make the shell call      */
115:
116:    switch (Ip -> prompt)             /* decide whether to prompt */
117:    {                                 /* or not after the command */
118:       case NO:                       /* explicit no is clear     */
119:          break;
120:
121:       case DEFAULT:                  /* if unspecified, then...  */
122:
123: #if (DEF_PROMPT == NO)               /* if default is NO,        */
124:             break;                   /* then don't prompt        */
125: #endif
126:
127: #if (DEF_PROMPT == ON_ERROR)         /* if prompting on errors,  */
128:          if (!retval)                /* but there wasn't any     */
129:             break;                   /* error, then don't prompt */
130: #endif
131:                                      /* else fall through to YES */
132:       case YES:
133:          puts("\nPress RETURN to continue . . .");
134:          (Void) getchar();
135:    }
136:                                      /* Upon return from shell,  */
137:    post_shell();                     /* restore everything       */
138: }
139:
140:
141: /************************************************************
142:  * show_cmnd():
143:  * Show a directly-executable action string.
144:  ************************************************************/
145:
146: Void show_cmnd(Ip, path)
147: ITEM *Ip;
148: char *path;
149: {
150:    char *cmd_line;
151:    int retval;
152:
153:    cmd_line= make_cmd(path, Ip -> action);
154:
155:    put_msg(0, "Action: %s. Press a key to continue: ", cmd_line);
156: }
157:
158:
159: /*************************************************************
160:  * do_emenu():
161:  * Run an external menu specification.
162:  *************************************************************/
163:
164: int do_emenu(Ip, path)
165: ITEM *Ip;
166: char *path;
167: {
168:    char filename[MAX_PATH];
169:    int retval;
170:
171:    if (nestlev == MAX_NEST - 1)
172:       return fatal("Menus nested too deeply (increase MAX_NEST)");
173:
174:    strcpy(filename, make_path(path, Ip -> action));
175:
176:    nestlev++;
177:    retval = do_menu("", filename);
178:    nestlev--;
179:
180:    return retval;
181: }
182:
183:
184: /*************************************************************
185:  * pre_shell()
186:  * Set tty mode for a shell call
187:  * DOS only: save drive and path for later restoration
188:  *************************************************************/
189:
190:
191: Void pre_shell()
192: {
193:    push_path();
194:    tty_shell();
195: }
196:
197:
198: /*************************************************************
199:  * post_shell()
200:  * Set tty mode for curses
201:  * DOS only: restore drive and path from before shell call
202:  *************************************************************/
203:
204: Void post_shell()
205: {
206:    pop_path();
207:    tty_curses();
208: }
/* End of File */