struct menu;
+/* Note: the _UNRES variants must always be immediately after their
+ "normal" versions. */
enum menu_action {
MA_NONE, /* Undefined value */
MA_CMD, /* Execute a command */
MA_GOTO_UNRES, /* Unresolved go to */
MA_QUIT, /* Quit to CLI */
MA_EXIT, /* Exit to higher-level menu */
+ MA_EXIT_UNRES, /* Unresolved exit */
};
struct menu_entry {
break;
case MA_GOTO_UNRES:
+ case MA_EXIT_UNRES:
me->cmdline = refstr_get(ld->kernel);
break;
ld.kernel = refstrdup(skipspace(p+4));
}
} else if ( looking_at(p, "exit") ) {
+ p = skipspace(p+4);
if (ld.label && m->parent) {
- ld.action = MA_EXIT;
- ld.submenu = m->parent;
+ if (*p) {
+ /* This is really just a goto, except for the marker */
+ ld.action = MA_EXIT_UNRES;
+ refstr_put(ld.kernel);
+ ld.kernel = refstrdup(p);
+ } else {
+ ld.action = MA_EXIT;
+ ld.submenu = m->parent;
+ }
}
} else if ( looking_at(p, "start") ) {
start_menu = m;
struct menu *m;
for (me = all_entries; me; me = me->next) {
- if (me->action == MA_GOTO_UNRES) {
+ if (me->action == MA_GOTO_UNRES ||
+ me->action == MA_EXIT_UNRES) {
m = find_menu(me->cmdline);
refstr_put(me->cmdline);
me->cmdline = NULL;
if (m) {
me->submenu = m;
- me->action = MA_GOTO;
+ me->action--; /* Drop the _UNRES */
} else {
me->action = MA_DISABLED;
}
"menu goto .top".
-MENU EXIT
+MENU EXIT [tagname]
(Only valid after a label statement inside MENU BEGIN ...
MENU END)
- Exit to the next higher menu.
+ Exit to the next higher menu, or, if tagname is specified, to
+ the named menu.
MENU QUIT