MA_GOTO, /* Go to another menu */
MA_GOTO_UNRES, /* Unresolved go to */
MA_QUIT, /* Quit to CLI */
+ MA_EXIT, /* Exit to higher-level menu */
};
struct menu_entry {
const char *hotattrib, int width)
{
const char *p = entry->displayname;
- bool is_submenu = (entry->action == MA_SUBMENU || entry->action == MA_GOTO);
+ char marker;
if (!p)
p = "";
- if (is_submenu)
+ switch (entry->action) {
+ case MA_SUBMENU:
+ marker = '>';
+ break;
+ case MA_EXIT:
+ marker = '<';
+ break;
+ default:
+ marker = 0;
+ break;
+ }
+
+ if (marker)
width -= 2;
while ( width ) {
}
}
- if (is_submenu)
- fputs(" >", stdout);
+ if (marker) {
+ putchar(' ');
+ putchar(marker);
+ }
}
static void
break;
case MA_SUBMENU:
case MA_GOTO:
+ case MA_EXIT:
done = 0;
clear = 2;
cm = me->submenu;
unsigned int menudisabled;
unsigned int menuindent;
enum menu_action action;
+ struct menu *submenu;
};
/* Menu currently being parsed */
me->cmdline = refstr_get(ld->kernel);
break;
+ case MA_GOTO:
+ case MA_EXIT:
+ me->submenu = ld->submenu;
+ break;
+
default:
break;
}
refstr_put(ld.kernel);
ld.kernel = refstrdup(skipspace(p+4));
}
+ } else if ( looking_at(p, "exit") ) {
+ if (ld.label && m->parent) {
+ ld.action = MA_EXIT;
+ ld.submenu = m->parent;
+ }
} else if ( looking_at(p, "start") ) {
start_menu = m;
} else {
"menu goto .top".
+MENU EXIT
+
+ (Only valid after a label statement inside MENU BEGIN ...
+ MENU END)
+
+ Exit to the next higher menu.
+
+
MENU QUIT
(Only valid after a LABEL statement.)