add 'deselect' property for menuconfig
authorFelix Fietkau <nbd@openwrt.org>
Fri, 23 Mar 2007 14:03:35 +0000 (14:03 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Fri, 23 Mar 2007 14:03:35 +0000 (14:03 +0000)
SVN-Revision: 6647

scripts/config/expr.h
scripts/config/lex.zconf.c_shipped
scripts/config/mconf.c
scripts/config/menu.c
scripts/config/symbol.c
scripts/config/zconf.gperf
scripts/config/zconf.hash.c_shipped
scripts/config/zconf.tab.c_shipped
scripts/config/zconf.y

index c1c5606..ae79d8f 100644 (file)
@@ -74,6 +74,7 @@ struct symbol {
        struct property *prop;
        struct expr *dep, *dep2;
        struct expr_value rev_dep;
+       struct expr_value rev_dep_inv;
 };
 
 #define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
@@ -100,7 +101,7 @@ struct symbol {
 #define SYMBOL_HASHMASK                0xff
 
 enum prop_type {
-       P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE, P_RESET
+       P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_DESELECT, P_SELECT, P_RANGE, P_RESET
 };
 
 struct property {
index 5e01ee5..42bcdd4 100644 (file)
@@ -20,7 +20,6 @@
 #include <string.h>
 #include <errno.h>
 #include <stdlib.h>
-#include <glob.h>
 
 /* end standard C headers. */
 
@@ -748,6 +747,7 @@ char *zconftext;
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <glob.h>
 
 #define LKC_DIRECT_LINK
 #include "lkc.h"
@@ -2280,7 +2280,7 @@ void zconf_nextfile(const char *name)
                filename = files.gl_pathv[i];
 
                file = file_lookup(filename);
-                buf = malloc(sizeof(*buf));
+               buf = malloc(sizeof(*buf));
                memset(buf, 0, sizeof(*buf));
                current_buf->state = YY_CURRENT_BUFFER;
                zconfin = zconf_fopen(filename);
index 7403617..8c58b62 100644 (file)
@@ -405,6 +405,7 @@ static void get_symbol_str(struct gstr *r, struct symbol *sym)
                                       sym_get_string_value(sym));
        for_all_prompts(sym, prop)
                get_prompt_str(r, prop);
+
        hit = false;
        for_all_properties(sym, prop, P_SELECT) {
                if (!hit) {
@@ -416,11 +417,29 @@ static void get_symbol_str(struct gstr *r, struct symbol *sym)
        }
        if (hit)
                str_append(r, "\n");
+
+       hit = false;
+       for_all_properties(sym, prop, P_DESELECT) {
+               if (!hit) {
+                       str_append(r, "  Deselects: ");
+                       hit = true;
+               } else
+                       str_printf(r, " && ");
+               expr_gstr_print(prop->expr, r);
+       }
+       if (hit)
+               str_append(r, "\n");
+
        if (sym->rev_dep.expr) {
                str_append(r, "  Selected by: ");
                expr_gstr_print(sym->rev_dep.expr, r);
                str_append(r, "\n");
        }
+       if (sym->rev_dep_inv.expr) {
+               str_append(r, "  Deselected by: ");
+               expr_gstr_print(sym->rev_dep_inv.expr, r);
+               str_append(r, "\n");
+       }
        str_append(r, "\n\n");
 }
 
index 20fda9b..286e255 100644 (file)
@@ -74,37 +74,9 @@ void menu_end_menu(void)
        current_menu = current_menu->parent;
 }
 
-struct expr *menu_check_dep(struct expr *e)
-{
-       if (!e)
-               return e;
-
-       switch (e->type) {
-       case E_NOT:
-               e->left.expr = menu_check_dep(e->left.expr);
-               break;
-       case E_OR:
-       case E_AND:
-               e->left.expr = menu_check_dep(e->left.expr);
-               e->right.expr = menu_check_dep(e->right.expr);
-               break;
-/* tristate always enabled */
-#if 0
-       case E_SYMBOL:
-               /* change 'm' into 'm' && MODULES */
-               if (e->left.sym == &symbol_mod)
-                       return expr_alloc_and(e, expr_alloc_symbol(modules_sym));
-               break;
-#endif
-       default:
-               break;
-       }
-       return e;
-}
-
 void menu_add_dep(struct expr *dep)
 {
-       current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep));
+       current_entry->dep = expr_alloc_and(current_entry->dep, dep);
 }
 
 void menu_set_type(int type)
@@ -129,7 +101,7 @@ struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *e
        prop->menu = current_entry;
        prop->text = prompt;
        prop->expr = expr;
-       prop->visible.expr = menu_check_dep(dep);
+       prop->visible.expr = dep;
 
        if (prompt) {
                if (current_entry->prompt)
@@ -191,6 +163,23 @@ void sym_check_prop(struct symbol *sym)
                                    "accept arguments of boolean and "
                                    "tristate type", sym2->name);
                        break;
+               case P_DESELECT:
+                       sym2 = prop_get_symbol(prop);
+                       if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE)
+                               prop_warn(prop,
+                                   "config symbol '%s' uses deselect, but is "
+                                   "not boolean or tristate", sym->name);
+                       else if (sym2->type == S_UNKNOWN)
+                               prop_warn(prop,
+                                   "'deselect' used by config symbol '%s' "
+                                   "refer to undefined symbol '%s'",
+                                   sym->name, sym2->name);
+                       else if (sym2->type != S_BOOLEAN && sym2->type != S_TRISTATE)
+                               prop_warn(prop,
+                                   "'%s' has wrong type. 'deselect' only "
+                                   "accept arguments of boolean and "
+                                   "tristate type", sym2->name);
+                       break;
                case P_RANGE:
                        if (sym->type != S_INT && sym->type != S_HEX)
                                prop_warn(prop, "range is only allowed "
@@ -240,11 +229,12 @@ void menu_finalize(struct menu *parent)
                                prop = menu->sym->prop;
                        else
                                prop = menu->prompt;
+
                        for (; prop; prop = prop->next) {
                                if (prop->menu != menu)
                                        continue;
                                dep = expr_transform(prop->visible.expr);
-                               dep = expr_alloc_and(expr_copy(basedep), dep);
+                               dep = expr_alloc_and(expr_copy(menu->dep), dep);
                                dep = expr_eliminate_dups(dep);
                                if (menu->sym && menu->sym->type != S_TRISTATE)
                                        dep = expr_trans_bool(dep);
@@ -254,6 +244,11 @@ void menu_finalize(struct menu *parent)
                                        es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr,
                                                        expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
                                }
+                               if (prop->type == P_DESELECT) {
+                                       struct symbol *es = prop_get_symbol(prop);
+                                       es->rev_dep_inv.expr = expr_alloc_or(es->rev_dep_inv.expr,
+                                                       expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
+                               }
                        }
                }
                for (menu = parent->list; menu; menu = menu->next)
index b79d81a..23246ca 100644 (file)
@@ -204,13 +204,12 @@ static void sym_calc_visibility(struct symbol *sym)
                prop->visible.tri = expr_calc_value(prop->visible.expr);
                tri = E_OR(tri, prop->visible.tri);
        }
-/* tristate always enabled */
-#if 0
-       if (tri == mod && (sym->type != S_TRISTATE || modules_val == no))
-#else
        if (tri == mod && (sym->type != S_TRISTATE))
-#endif
                tri = yes;
+       if (sym->rev_dep_inv.expr) {
+               if (expr_calc_value(sym->rev_dep_inv.expr) == yes)
+                       tri = no;
+       }
        if (sym->visible != tri) {
                sym->visible = tri;
                sym_set_changed(sym);
@@ -814,7 +813,7 @@ struct symbol *sym_check_deps(struct symbol *sym)
                goto out;
 
        for (prop = sym->prop; prop; prop = prop->next) {
-               if (prop->type == P_CHOICE || prop->type == P_SELECT)
+               if (prop->type == P_CHOICE || prop->type == P_SELECT || prop->type == P_DESELECT)
                        continue;
                sym2 = sym_check_expr_deps(prop->visible.expr);
                if (sym2)
@@ -882,6 +881,8 @@ const char *prop_get_type_name(enum prop_type type)
                return "choice";
        case P_SELECT:
                return "select";
+       case P_DESELECT:
+               return "deselect";
        case P_RANGE:
                return "range";
        case P_UNKNOWN:
index 3ed8b96..faa6530 100644 (file)
@@ -37,6 +37,7 @@ def_boolean,  T_DEFAULT,      TF_COMMAND, S_BOOLEAN
 int,           T_TYPE,         TF_COMMAND, S_INT
 hex,           T_TYPE,         TF_COMMAND, S_HEX
 string,                T_TYPE,         TF_COMMAND, S_STRING
+deselect,      T_DESELECT,     TF_COMMAND
 select,                T_SELECT,       TF_COMMAND
 enable,                T_SELECT,       TF_COMMAND
 range,         T_RANGE,        TF_COMMAND
index 4f6fa50..7b8f074 100644 (file)
@@ -30,7 +30,7 @@
 #endif
 
 struct kconf_id;
-/* maximum key range = 45, duplicates = 0 */
+/* maximum key range = 40, duplicates = 0 */
 
 #ifdef __GNUC__
 __inline
@@ -44,32 +44,32 @@ kconf_id_hash (register const char *str, register unsigned int len)
 {
   static unsigned char asso_values[] =
     {
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47,  0, 10, 15,
-       0,  0,  5, 47,  5,  0, 47, 47, 10, 10,
-       0, 20, 20, 20,  5, 15,  0, 15, 47, 47,
-      15, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 35,  0, 20,
+       5,  0,  5, 42,  0, 25, 42, 42,  5,  5,
+      10,  0, 25, 15,  0,  0,  0, 10, 42, 42,
+       0, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+      42, 42, 42, 42, 42, 42
     };
   register int hval = len;
 
@@ -88,71 +88,73 @@ kconf_id_hash (register const char *str, register unsigned int len)
 
 struct kconf_id_strings_t
   {
-    char kconf_id_strings_str2[sizeof("if")];
-    char kconf_id_strings_str3[sizeof("int")];
-    char kconf_id_strings_str5[sizeof("endif")];
-    char kconf_id_strings_str6[sizeof("enable")];
-    char kconf_id_strings_str7[sizeof("endmenu")];
-    char kconf_id_strings_str8[sizeof("tristate")];
-    char kconf_id_strings_str9[sizeof("endchoice")];
-    char kconf_id_strings_str10[sizeof("range")];
-    char kconf_id_strings_str12[sizeof("default")];
-    char kconf_id_strings_str13[sizeof("def_bool")];
-    char kconf_id_strings_str14[sizeof("menu")];
-    char kconf_id_strings_str16[sizeof("def_boolean")];
-    char kconf_id_strings_str17[sizeof("def_tristate")];
-    char kconf_id_strings_str18[sizeof("mainmenu")];
-    char kconf_id_strings_str19[sizeof("help")];
-    char kconf_id_strings_str20[sizeof("menuconfig")];
-    char kconf_id_strings_str21[sizeof("config")];
-    char kconf_id_strings_str22[sizeof("on")];
-    char kconf_id_strings_str23[sizeof("hex")];
-    char kconf_id_strings_str25[sizeof("reset")];
-    char kconf_id_strings_str26[sizeof("string")];
-    char kconf_id_strings_str27[sizeof("depends")];
-    char kconf_id_strings_str28[sizeof("optional")];
-    char kconf_id_strings_str31[sizeof("select")];
+    char kconf_id_strings_str2[sizeof("on")];
+    char kconf_id_strings_str3[sizeof("hex")];
+    char kconf_id_strings_str4[sizeof("bool")];
+    char kconf_id_strings_str5[sizeof("reset")];
+    char kconf_id_strings_str6[sizeof("string")];
+    char kconf_id_strings_str7[sizeof("boolean")];
+    char kconf_id_strings_str8[sizeof("optional")];
+    char kconf_id_strings_str9[sizeof("help")];
+    char kconf_id_strings_str10[sizeof("endif")];
+    char kconf_id_strings_str11[sizeof("select")];
+    char kconf_id_strings_str12[sizeof("endmenu")];
+    char kconf_id_strings_str13[sizeof("deselect")];
+    char kconf_id_strings_str14[sizeof("endchoice")];
+    char kconf_id_strings_str15[sizeof("range")];
+    char kconf_id_strings_str16[sizeof("source")];
+    char kconf_id_strings_str17[sizeof("default")];
+    char kconf_id_strings_str18[sizeof("def_bool")];
+    char kconf_id_strings_str19[sizeof("menu")];
+    char kconf_id_strings_str21[sizeof("def_boolean")];
+    char kconf_id_strings_str22[sizeof("def_tristate")];
+    char kconf_id_strings_str23[sizeof("requires")];
+    char kconf_id_strings_str25[sizeof("menuconfig")];
+    char kconf_id_strings_str26[sizeof("choice")];
+    char kconf_id_strings_str27[sizeof("if")];
+    char kconf_id_strings_str28[sizeof("int")];
+    char kconf_id_strings_str31[sizeof("prompt")];
     char kconf_id_strings_str32[sizeof("comment")];
-    char kconf_id_strings_str33[sizeof("requires")];
-    char kconf_id_strings_str34[sizeof("bool")];
-    char kconf_id_strings_str36[sizeof("source")];
-    char kconf_id_strings_str37[sizeof("boolean")];
-    char kconf_id_strings_str41[sizeof("choice")];
-    char kconf_id_strings_str46[sizeof("prompt")];
+    char kconf_id_strings_str33[sizeof("tristate")];
+    char kconf_id_strings_str36[sizeof("config")];
+    char kconf_id_strings_str37[sizeof("depends")];
+    char kconf_id_strings_str38[sizeof("mainmenu")];
+    char kconf_id_strings_str41[sizeof("enable")];
   };
 static struct kconf_id_strings_t kconf_id_strings_contents =
   {
-    "if",
-    "int",
+    "on",
+    "hex",
+    "bool",
+    "reset",
+    "string",
+    "boolean",
+    "optional",
+    "help",
     "endif",
-    "enable",
+    "select",
     "endmenu",
-    "tristate",
+    "deselect",
     "endchoice",
     "range",
+    "source",
     "default",
     "def_bool",
     "menu",
     "def_boolean",
     "def_tristate",
-    "mainmenu",
-    "help",
+    "requires",
     "menuconfig",
+    "choice",
+    "if",
+    "int",
+    "prompt",
+    "comment",
+    "tristate",
     "config",
-    "on",
-    "hex",
-    "reset",
-    "string",
     "depends",
-    "optional",
-    "select",
-    "comment",
-    "requires",
-    "bool",
-    "source",
-    "boolean",
-    "choice",
-    "prompt"
+    "mainmenu",
+    "enable"
   };
 #define kconf_id_strings ((const char *) &kconf_id_strings_contents)
 #ifdef __GNUC__
@@ -163,55 +165,53 @@ kconf_id_lookup (register const char *str, register unsigned int len)
 {
   enum
     {
-      TOTAL_KEYWORDS = 31,
+      TOTAL_KEYWORDS = 32,
       MIN_WORD_LENGTH = 2,
       MAX_WORD_LENGTH = 12,
       MIN_HASH_VALUE = 2,
-      MAX_HASH_VALUE = 46
+      MAX_HASH_VALUE = 41
     };
 
   static struct kconf_id wordlist[] =
     {
       {-1}, {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2,            T_IF,           TF_COMMAND|TF_PARAM},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str3,            T_TYPE,         TF_COMMAND, S_INT},
-      {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str5,            T_ENDIF,        TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str6,            T_SELECT,       TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7,    T_ENDMENU,      TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8,    T_TYPE,         TF_COMMAND, S_TRISTATE},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str9,    T_ENDCHOICE,    TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str10,           T_RANGE,        TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2,            T_ON,           TF_PARAM},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str3,            T_TYPE,         TF_COMMAND, S_HEX},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str4,            T_TYPE,         TF_COMMAND, S_BOOLEAN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str5,            T_RESET,        TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str6,            T_TYPE,         TF_COMMAND, S_STRING},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7,    T_TYPE,         TF_COMMAND, S_BOOLEAN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8,    T_OPTIONAL,     TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str9,            T_HELP,         TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str10,           T_ENDIF,        TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str11,           T_SELECT,       TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12,   T_ENDMENU,      TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13,   T_DESELECT,     TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14,   T_ENDCHOICE,    TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str15,           T_RANGE,        TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str16,           T_SOURCE,       TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17,   T_DEFAULT,      TF_COMMAND, S_UNKNOWN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18,   T_DEFAULT,      TF_COMMAND, S_BOOLEAN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str19,           T_MENU,         TF_COMMAND},
       {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12,   T_DEFAULT,      TF_COMMAND, S_UNKNOWN},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13,   T_DEFAULT,      TF_COMMAND, S_BOOLEAN},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14,           T_MENU,         TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21,   T_DEFAULT,      TF_COMMAND, S_BOOLEAN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22,   T_DEFAULT,      TF_COMMAND, S_TRISTATE},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23,   T_REQUIRES,     TF_COMMAND},
       {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str16,   T_DEFAULT,      TF_COMMAND, S_BOOLEAN},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17,   T_DEFAULT,      TF_COMMAND, S_TRISTATE},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18,   T_MAINMENU,     TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str19,           T_HELP,         TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str20,   T_MENUCONFIG,   TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21,           T_CONFIG,       TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22,           T_ON,           TF_PARAM},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23,           T_TYPE,         TF_COMMAND, S_HEX},
-      {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str25,           T_RESET,        TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str26,           T_TYPE,         TF_COMMAND, S_STRING},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27,   T_DEPENDS,      TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28,   T_OPTIONAL,     TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str25,   T_MENUCONFIG,   TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str26,           T_CHOICE,       TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27,           T_IF,           TF_COMMAND|TF_PARAM},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28,           T_TYPE,         TF_COMMAND, S_INT},
       {-1}, {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31,           T_SELECT,       TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31,           T_PROMPT,       TF_COMMAND},
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32,   T_COMMENT,      TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33,   T_REQUIRES,     TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str34,           T_TYPE,         TF_COMMAND, S_BOOLEAN},
-      {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str36,           T_SOURCE,       TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str37,   T_TYPE,         TF_COMMAND, S_BOOLEAN},
-      {-1}, {-1}, {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41,           T_CHOICE,       TF_COMMAND},
-      {-1}, {-1}, {-1}, {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46,           T_PROMPT,       TF_COMMAND}
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33,   T_TYPE,         TF_COMMAND, S_TRISTATE},
+      {-1}, {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str36,           T_CONFIG,       TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str37,   T_DEPENDS,      TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str38,   T_MAINMENU,     TF_COMMAND},
+      {-1}, {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41,           T_SELECT,       TF_COMMAND}
     };
 
   if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
index c7c0f0c..77f392a 100644 (file)
      T_PROMPT = 274,
      T_TYPE = 275,
      T_DEFAULT = 276,
-     T_SELECT = 277,
-     T_RANGE = 278,
-     T_ON = 279,
-     T_RESET = 280,
-     T_WORD = 281,
-     T_WORD_QUOTE = 282,
-     T_UNEQUAL = 283,
-     T_CLOSE_PAREN = 284,
-     T_OPEN_PAREN = 285,
-     T_EOL = 286,
-     T_OR = 287,
-     T_AND = 288,
-     T_EQUAL = 289,
-     T_NOT = 290
+     T_DESELECT = 277,
+     T_SELECT = 278,
+     T_RANGE = 279,
+     T_ON = 280,
+     T_RESET = 281,
+     T_WORD = 282,
+     T_WORD_QUOTE = 283,
+     T_UNEQUAL = 284,
+     T_CLOSE_PAREN = 285,
+     T_OPEN_PAREN = 286,
+     T_EOL = 287,
+     T_OR = 288,
+     T_AND = 289,
+     T_EQUAL = 290,
+     T_NOT = 291
    };
 #endif
 #define T_MAINMENU 258
 #define T_PROMPT 274
 #define T_TYPE 275
 #define T_DEFAULT 276
-#define T_SELECT 277
-#define T_RANGE 278
-#define T_ON 279
-#define T_RESET 280
-#define T_WORD 281
-#define T_WORD_QUOTE 282
-#define T_UNEQUAL 283
-#define T_CLOSE_PAREN 284
-#define T_OPEN_PAREN 285
-#define T_EOL 286
-#define T_OR 287
-#define T_AND 288
-#define T_EQUAL 289
-#define T_NOT 290
+#define T_DESELECT 277
+#define T_SELECT 278
+#define T_RANGE 279
+#define T_ON 280
+#define T_RESET 281
+#define T_WORD 282
+#define T_WORD_QUOTE 283
+#define T_UNEQUAL 284
+#define T_CLOSE_PAREN 285
+#define T_OPEN_PAREN 286
+#define T_EOL 287
+#define T_OR 288
+#define T_AND 289
+#define T_EQUAL 290
+#define T_NOT 291
 
 
 
@@ -319,20 +321,20 @@ union yyalloc
 /* YYFINAL -- State number of the termination state. */
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   271
+#define YYLAST   285
 
 /* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS  36
+#define YYNTOKENS  37
 /* YYNNTS -- Number of nonterminals. */
 #define YYNNTS  42
 /* YYNRULES -- Number of rules. */
-#define YYNRULES  106
+#define YYNRULES  108
 /* YYNRULES -- Number of states. */
-#define YYNSTATES  179
+#define YYNSTATES  184
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   290
+#define YYMAXUTOK   291
 
 #define YYTRANSLATE(YYX)                                               \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -369,7 +371,7 @@ static const unsigned char yytranslate[] =
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35
+      35,    36
 };
 
 #if YYDEBUG
@@ -379,68 +381,69 @@ static const unsigned short int yyprhs[] =
 {
        0,     0,     3,     5,     6,     9,    12,    15,    20,    23,
       28,    33,    37,    39,    41,    43,    45,    47,    49,    51,
-      53,    55,    57,    59,    61,    63,    65,    69,    72,    76,
-      79,    83,    86,    87,    90,    93,    96,    99,   102,   106,
-     111,   116,   121,   127,   130,   133,   135,   139,   140,   143,
-     146,   149,   152,   155,   160,   164,   167,   171,   176,   177,
-     180,   184,   186,   190,   191,   194,   197,   200,   204,   207,
-     209,   213,   214,   217,   220,   223,   227,   231,   234,   237,
-     240,   241,   244,   247,   250,   255,   259,   263,   264,   267,
-     269,   271,   274,   277,   280,   282,   285,   286,   289,   291,
-     295,   299,   303,   306,   310,   314,   316
+      53,    55,    57,    59,    61,    63,    65,    67,    71,    74,
+      78,    81,    85,    88,    89,    92,    95,    98,   101,   104,
+     108,   113,   118,   123,   128,   134,   137,   140,   142,   146,
+     147,   150,   153,   156,   159,   162,   167,   171,   174,   178,
+     183,   184,   187,   191,   193,   197,   198,   201,   204,   207,
+     211,   214,   216,   220,   221,   224,   227,   230,   234,   238,
+     241,   244,   247,   248,   251,   254,   257,   262,   266,   270,
+     271,   274,   276,   278,   281,   284,   287,   289,   292,   293,
+     296,   298,   302,   306,   310,   313,   317,   321,   323
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
 static const yysigned_char yyrhs[] =
 {
-      37,     0,    -1,    38,    -1,    -1,    38,    40,    -1,    38,
-      51,    -1,    38,    62,    -1,    38,     3,    72,    74,    -1,
-      38,    73,    -1,    38,    26,     1,    31,    -1,    38,    39,
-       1,    31,    -1,    38,     1,    31,    -1,    16,    -1,    19,
-      -1,    20,    -1,    22,    -1,    18,    -1,    23,    -1,    21,
-      -1,    25,    -1,    31,    -1,    57,    -1,    66,    -1,    43,
-      -1,    45,    -1,    64,    -1,    26,     1,    31,    -1,     1,
-      31,    -1,    10,    26,    31,    -1,    42,    46,    -1,    11,
-      26,    31,    -1,    44,    46,    -1,    -1,    46,    47,    -1,
-      46,    70,    -1,    46,    68,    -1,    46,    41,    -1,    46,
-      31,    -1,    20,    71,    31,    -1,    19,    72,    75,    31,
-      -1,    21,    76,    75,    31,    -1,    22,    26,    75,    31,
-      -1,    23,    77,    77,    75,    31,    -1,     7,    31,    -1,
-      48,    52,    -1,    73,    -1,    49,    54,    50,    -1,    -1,
-      52,    53,    -1,    52,    70,    -1,    52,    68,    -1,    52,
-      31,    -1,    52,    41,    -1,    19,    72,    75,    31,    -1,
-      20,    71,    31,    -1,    18,    31,    -1,    25,    75,    31,
-      -1,    21,    26,    75,    31,    -1,    -1,    54,    40,    -1,
-      14,    76,    74,    -1,    73,    -1,    55,    58,    56,    -1,
-      -1,    58,    40,    -1,    58,    62,    -1,    58,    51,    -1,
-       4,    72,    31,    -1,    59,    69,    -1,    73,    -1,    60,
-      63,    61,    -1,    -1,    63,    40,    -1,    63,    62,    -1,
-      63,    51,    -1,     6,    72,    31,    -1,     9,    72,    31,
-      -1,    65,    69,    -1,    12,    31,    -1,    67,    13,    -1,
-      -1,    69,    70,    -1,    69,    31,    -1,    69,    41,    -1,
-      16,    24,    76,    31,    -1,    16,    76,    31,    -1,    17,
-      76,    31,    -1,    -1,    72,    75,    -1,    26,    -1,    27,
-      -1,     5,    31,    -1,     8,    31,    -1,    15,    31,    -1,
-      31,    -1,    74,    31,    -1,    -1,    14,    76,    -1,    77,
-      -1,    77,    34,    77,    -1,    77,    28,    77,    -1,    30,
-      76,    29,    -1,    35,    76,    -1,    76,    32,    76,    -1,
-      76,    33,    76,    -1,    26,    -1,    27,    -1
+      38,     0,    -1,    39,    -1,    -1,    39,    41,    -1,    39,
+      52,    -1,    39,    63,    -1,    39,     3,    73,    75,    -1,
+      39,    74,    -1,    39,    27,     1,    32,    -1,    39,    40,
+       1,    32,    -1,    39,     1,    32,    -1,    16,    -1,    19,
+      -1,    20,    -1,    22,    -1,    23,    -1,    18,    -1,    24,
+      -1,    21,    -1,    26,    -1,    32,    -1,    58,    -1,    67,
+      -1,    44,    -1,    46,    -1,    65,    -1,    27,     1,    32,
+      -1,     1,    32,    -1,    10,    27,    32,    -1,    43,    47,
+      -1,    11,    27,    32,    -1,    45,    47,    -1,    -1,    47,
+      48,    -1,    47,    71,    -1,    47,    69,    -1,    47,    42,
+      -1,    47,    32,    -1,    20,    72,    32,    -1,    19,    73,
+      76,    32,    -1,    21,    77,    76,    32,    -1,    22,    27,
+      76,    32,    -1,    23,    27,    76,    32,    -1,    24,    78,
+      78,    76,    32,    -1,     7,    32,    -1,    49,    53,    -1,
+      74,    -1,    50,    55,    51,    -1,    -1,    53,    54,    -1,
+      53,    71,    -1,    53,    69,    -1,    53,    32,    -1,    53,
+      42,    -1,    19,    73,    76,    32,    -1,    20,    72,    32,
+      -1,    18,    32,    -1,    26,    76,    32,    -1,    21,    27,
+      76,    32,    -1,    -1,    55,    41,    -1,    14,    77,    75,
+      -1,    74,    -1,    56,    59,    57,    -1,    -1,    59,    41,
+      -1,    59,    63,    -1,    59,    52,    -1,     4,    73,    32,
+      -1,    60,    70,    -1,    74,    -1,    61,    64,    62,    -1,
+      -1,    64,    41,    -1,    64,    63,    -1,    64,    52,    -1,
+       6,    73,    32,    -1,     9,    73,    32,    -1,    66,    70,
+      -1,    12,    32,    -1,    68,    13,    -1,    -1,    70,    71,
+      -1,    70,    32,    -1,    70,    42,    -1,    16,    25,    77,
+      32,    -1,    16,    77,    32,    -1,    17,    77,    32,    -1,
+      -1,    73,    76,    -1,    27,    -1,    28,    -1,     5,    32,
+      -1,     8,    32,    -1,    15,    32,    -1,    32,    -1,    75,
+      32,    -1,    -1,    14,    77,    -1,    78,    -1,    78,    35,
+      78,    -1,    78,    29,    78,    -1,    31,    77,    30,    -1,
+      36,    77,    -1,    77,    33,    77,    -1,    77,    34,    77,
+      -1,    27,    -1,    28,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const unsigned short int yyrline[] =
 {
-       0,   104,   104,   106,   108,   109,   110,   111,   112,   113,
-     114,   118,   122,   122,   122,   122,   122,   122,   122,   122,
-     126,   127,   128,   129,   130,   131,   135,   136,   142,   150,
-     156,   164,   174,   176,   177,   178,   179,   180,   183,   191,
-     197,   207,   213,   221,   230,   235,   243,   246,   248,   249,
-     250,   251,   252,   255,   261,   272,   278,   283,   293,   295,
-     300,   308,   316,   319,   321,   322,   323,   328,   335,   340,
-     348,   351,   353,   354,   355,   358,   366,   373,   380,   386,
-     393,   395,   396,   397,   400,   405,   410,   418,   420,   425,
-     426,   429,   430,   431,   435,   436,   439,   440,   443,   444,
-     445,   446,   447,   448,   449,   452,   453
+       0,   105,   105,   107,   109,   110,   111,   112,   113,   114,
+     115,   119,   123,   123,   123,   123,   123,   123,   123,   123,
+     123,   127,   128,   129,   130,   131,   132,   136,   137,   143,
+     151,   157,   165,   175,   177,   178,   179,   180,   181,   184,
+     192,   198,   208,   214,   220,   228,   237,   242,   250,   253,
+     255,   256,   257,   258,   259,   262,   268,   279,   285,   290,
+     300,   302,   307,   315,   323,   326,   328,   329,   330,   335,
+     342,   347,   355,   358,   360,   361,   362,   365,   373,   380,
+     387,   393,   400,   402,   403,   404,   407,   412,   417,   425,
+     427,   432,   433,   436,   437,   438,   442,   443,   446,   447,
+     450,   451,   452,   453,   454,   455,   456,   459,   460
 };
 #endif
 
@@ -453,17 +456,18 @@ static const char *const yytname[] =
   "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG",
   "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS",
   "T_REQUIRES", "T_OPTIONAL", "T_PROMPT", "T_TYPE", "T_DEFAULT",
-  "T_SELECT", "T_RANGE", "T_ON", "T_RESET", "T_WORD", "T_WORD_QUOTE",
-  "T_UNEQUAL", "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_EOL", "T_OR", "T_AND",
-  "T_EQUAL", "T_NOT", "$accept", "input", "stmt_list", "option_name",
-  "common_stmt", "option_error", "config_entry_start", "config_stmt",
-  "menuconfig_entry_start", "menuconfig_stmt", "config_option_list",
-  "config_option", "choice", "choice_entry", "choice_end", "choice_stmt",
-  "choice_option_list", "choice_option", "choice_block", "if_entry",
-  "if_end", "if_stmt", "if_block", "menu", "menu_entry", "menu_end",
-  "menu_stmt", "menu_block", "source_stmt", "comment", "comment_stmt",
-  "help_start", "help", "depends_list", "depends", "prompt_stmt_opt",
-  "prompt", "end", "nl", "if_expr", "expr", "symbol", 0
+  "T_DESELECT", "T_SELECT", "T_RANGE", "T_ON", "T_RESET", "T_WORD",
+  "T_WORD_QUOTE", "T_UNEQUAL", "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_EOL",
+  "T_OR", "T_AND", "T_EQUAL", "T_NOT", "$accept", "input", "stmt_list",
+  "option_name", "common_stmt", "option_error", "config_entry_start",
+  "config_stmt", "menuconfig_entry_start", "menuconfig_stmt",
+  "config_option_list", "config_option", "choice", "choice_entry",
+  "choice_end", "choice_stmt", "choice_option_list", "choice_option",
+  "choice_block", "if_entry", "if_end", "if_stmt", "if_block", "menu",
+  "menu_entry", "menu_end", "menu_stmt", "menu_block", "source_stmt",
+  "comment", "comment_stmt", "help_start", "help", "depends_list",
+  "depends", "prompt_stmt_opt", "prompt", "end", "nl", "if_expr", "expr",
+  "symbol", 0
 };
 #endif
 
@@ -475,24 +479,24 @@ static const unsigned short int yytoknum[] =
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
-     285,   286,   287,   288,   289,   290
+     285,   286,   287,   288,   289,   290,   291
 };
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const unsigned char yyr1[] =
 {
-       0,    36,    37,    38,    38,    38,    38,    38,    38,    38,
-      38,    38,    39,    39,    39,    39,    39,    39,    39,    39,
-      40,    40,    40,    40,    40,    40,    41,    41,    42,    43,
-      44,    45,    46,    46,    46,    46,    46,    46,    47,    47,
-      47,    47,    47,    48,    49,    50,    51,    52,    52,    52,
-      52,    52,    52,    53,    53,    53,    53,    53,    54,    54,
-      55,    56,    57,    58,    58,    58,    58,    59,    60,    61,
-      62,    63,    63,    63,    63,    64,    65,    66,    67,    68,
-      69,    69,    69,    69,    70,    70,    70,    71,    71,    72,
-      72,    73,    73,    73,    74,    74,    75,    75,    76,    76,
-      76,    76,    76,    76,    76,    77,    77
+       0,    37,    38,    39,    39,    39,    39,    39,    39,    39,
+      39,    39,    40,    40,    40,    40,    40,    40,    40,    40,
+      40,    41,    41,    41,    41,    41,    41,    42,    42,    43,
+      44,    45,    46,    47,    47,    47,    47,    47,    47,    48,
+      48,    48,    48,    48,    48,    49,    50,    51,    52,    53,
+      53,    53,    53,    53,    53,    54,    54,    54,    54,    54,
+      55,    55,    56,    57,    58,    59,    59,    59,    59,    60,
+      61,    62,    63,    64,    64,    64,    64,    65,    66,    67,
+      68,    69,    70,    70,    70,    70,    71,    71,    71,    72,
+      72,    73,    73,    74,    74,    74,    75,    75,    76,    76,
+      77,    77,    77,    77,    77,    77,    77,    78,    78
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -500,15 +504,15 @@ static const unsigned char yyr2[] =
 {
        0,     2,     1,     0,     2,     2,     2,     4,     2,     4,
        4,     3,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     3,     2,     3,     2,
-       3,     2,     0,     2,     2,     2,     2,     2,     3,     4,
-       4,     4,     5,     2,     2,     1,     3,     0,     2,     2,
-       2,     2,     2,     4,     3,     2,     3,     4,     0,     2,
-       3,     1,     3,     0,     2,     2,     2,     3,     2,     1,
-       3,     0,     2,     2,     2,     3,     3,     2,     2,     2,
-       0,     2,     2,     2,     4,     3,     3,     0,     2,     1,
-       1,     2,     2,     2,     1,     2,     0,     2,     1,     3,
-       3,     3,     2,     3,     3,     1,     1
+       1,     1,     1,     1,     1,     1,     1,     3,     2,     3,
+       2,     3,     2,     0,     2,     2,     2,     2,     2,     3,
+       4,     4,     4,     4,     5,     2,     2,     1,     3,     0,
+       2,     2,     2,     2,     2,     4,     3,     2,     3,     4,
+       0,     2,     3,     1,     3,     0,     2,     2,     2,     3,
+       2,     1,     3,     0,     2,     2,     2,     3,     3,     2,
+       2,     2,     0,     2,     2,     2,     4,     3,     3,     0,
+       2,     1,     1,     2,     2,     2,     1,     2,     0,     2,
+       1,     3,     3,     3,     2,     3,     3,     1,     1
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -517,161 +521,166 @@ static const unsigned char yyr2[] =
 static const unsigned char yydefact[] =
 {
        3,     0,     0,     1,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    12,    16,    13,    14,
-      18,    15,    17,    19,     0,    20,     0,     4,    32,    23,
-      32,    24,    47,    58,     5,    63,    21,    80,    71,     6,
-      25,    80,    22,     8,    11,    89,    90,     0,     0,    91,
-       0,    43,    92,     0,     0,     0,   105,   106,     0,     0,
-       0,    98,    93,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    94,     7,    67,    75,    76,    28,    30,
-       0,   102,     0,     0,    60,     0,     0,     9,    10,     0,
-       0,     0,     0,     0,    87,     0,     0,     0,     0,    37,
-      36,    33,     0,    35,    34,     0,     0,    87,     0,    96,
-      51,    52,    48,    50,    49,    59,    46,    45,    64,    66,
-      62,    65,    61,    82,    83,    81,    72,    74,    70,    73,
-      69,    95,   101,   103,   104,   100,    99,    27,    78,     0,
-       0,     0,    96,     0,    96,    96,    96,     0,     0,    79,
-      55,    96,     0,    96,     0,     0,     0,    85,    86,     0,
-      38,    88,     0,     0,    96,    26,     0,    54,     0,    97,
-      56,    84,    39,    40,    41,     0,    53,    57,    42
+       0,     0,     0,     0,     0,     0,    12,    17,    13,    14,
+      19,    15,    16,    18,    20,     0,    21,     0,     4,    33,
+      24,    33,    25,    49,    60,     5,    65,    22,    82,    73,
+       6,    26,    82,    23,     8,    11,    91,    92,     0,     0,
+      93,     0,    45,    94,     0,     0,     0,   107,   108,     0,
+       0,     0,   100,    95,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    96,     7,    69,    77,    78,    29,
+      31,     0,   104,     0,     0,    62,     0,     0,     9,    10,
+       0,     0,     0,     0,     0,    89,     0,     0,     0,     0,
+       0,    38,    37,    34,     0,    36,    35,     0,     0,    89,
+       0,    98,    53,    54,    50,    52,    51,    61,    48,    47,
+      66,    68,    64,    67,    63,    84,    85,    83,    74,    76,
+      72,    75,    71,    97,   103,   105,   106,   102,   101,    28,
+      80,     0,     0,     0,    98,     0,    98,    98,    98,    98,
+       0,     0,    81,    57,    98,     0,    98,     0,     0,     0,
+      87,    88,     0,    39,    90,     0,     0,     0,    98,    27,
+       0,    56,     0,    99,    58,    86,    40,    41,    42,    43,
+       0,    55,    59,    44
 };
 
 /* YYDEFGOTO[NTERM-NUM]. */
 static const short int yydefgoto[] =
 {
-      -1,     1,     2,    26,    27,   100,    28,    29,    30,    31,
-      65,   101,    32,    33,   116,    34,    67,   112,    68,    35,
-     120,    36,    69,    37,    38,   128,    39,    71,    40,    41,
-      42,   102,   103,    70,   104,   143,   144,    43,    74,   155,
-      60,    61
+      -1,     1,     2,    27,    28,   102,    29,    30,    31,    32,
+      66,   103,    33,    34,   118,    35,    68,   114,    69,    36,
+     122,    37,    70,    38,    39,   130,    40,    72,    41,    42,
+      43,   104,   105,    71,   106,   145,   146,    44,    75,   158,
+      61,    62
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -134
+#define YYPACT_NINF -80
 static const short int yypact[] =
 {
-    -134,     2,   160,  -134,   -16,    53,    53,   -14,    53,    -8,
-      -1,    53,    26,    63,    60,    73,  -134,  -134,  -134,  -134,
-    -134,  -134,  -134,  -134,   114,  -134,   125,  -134,  -134,  -134,
-    -134,  -134,  -134,  -134,  -134,  -134,  -134,  -134,  -134,  -134,
-    -134,  -134,  -134,  -134,  -134,  -134,  -134,   124,   127,  -134,
-     128,  -134,  -134,   141,   142,   146,  -134,  -134,    60,    60,
-       3,   -18,  -134,   153,   159,    39,   102,   187,   226,   215,
-      67,   215,   131,  -134,   163,  -134,  -134,  -134,  -134,  -134,
-      34,  -134,    60,    60,   163,   103,   103,  -134,  -134,   169,
-     186,   218,    60,    53,    53,    60,   201,   103,   227,  -134,
-    -134,  -134,   220,  -134,  -134,   207,    53,    53,   213,   229,
-    -134,  -134,  -134,  -134,  -134,  -134,  -134,  -134,  -134,  -134,
-    -134,  -134,  -134,  -134,  -134,  -134,  -134,  -134,  -134,  -134,
-    -134,  -134,  -134,   214,  -134,  -134,  -134,  -134,  -134,    60,
-     178,   183,   229,   224,   229,     0,   229,   103,   228,  -134,
-    -134,   229,   230,   229,    60,   231,   219,  -134,  -134,   232,
-    -134,  -134,   233,   234,   229,  -134,   235,  -134,   236,   111,
-    -134,  -134,  -134,  -134,  -134,   237,  -134,  -134,  -134
+     -80,     2,   164,   -80,   -22,   105,   105,    -6,   105,     0,
+       7,   105,    17,    28,    70,    35,   -80,   -80,   -80,   -80,
+     -80,   -80,   -80,   -80,   -80,    69,   -80,    78,   -80,   -80,
+     -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,
+     -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,    62,    68,
+     -80,    85,   -80,   -80,    97,   127,   144,   -80,   -80,    70,
+      70,   188,    -8,   -80,   149,   163,    42,   104,   192,    67,
+     221,     8,   221,   134,   -80,   167,   -80,   -80,   -80,   -80,
+     -80,    50,   -80,    70,    70,   167,   119,   119,   -80,   -80,
+     173,   184,    60,    70,   105,   105,    70,    65,   150,   119,
+     232,   -80,   -80,   -80,   210,   -80,   -80,   202,   105,   105,
+     231,   224,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,
+     -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,
+     -80,   -80,   -80,   -80,   -80,   226,   -80,   -80,   -80,   -80,
+     -80,    70,   211,   218,   224,   230,   224,    -3,   224,   224,
+     119,   233,   -80,   -80,   224,   234,   224,    70,   235,   222,
+     -80,   -80,   236,   -80,   -80,   237,   238,   239,   224,   -80,
+     240,   -80,   241,   129,   -80,   -80,   -80,   -80,   -80,   -80,
+     242,   -80,   -80,   -80
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const short int yypgoto[] =
 {
-    -134,  -134,  -134,  -134,    23,   -46,  -134,  -134,  -134,  -134,
-     239,  -134,  -134,  -134,  -134,   118,  -134,  -134,  -134,  -134,
-    -134,  -134,  -134,  -134,  -134,  -134,   185,  -134,  -134,  -134,
-    -134,  -134,   182,   217,   -45,   164,    -5,    28,   200,  -133,
-     -54,   -78
+     -80,   -80,   -80,   -80,   -36,    22,   -80,   -80,   -80,   -80,
+     244,   -80,   -80,   -80,   -80,   176,   -80,   -80,   -80,   -80,
+     -80,   -80,   -80,   -80,   -80,   -80,   187,   -80,   -80,   -80,
+     -80,   -80,   195,   243,   121,   155,    -5,   145,   215,    93,
+     -55,   -79
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If zero, do what YYDEFACT says.
    If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -78
+#define YYTABLE_NINF -80
 static const short int yytable[] =
 {
-      47,    48,     3,    50,    80,    81,    53,   135,   136,   159,
-      85,   161,   162,   163,   154,    44,    86,    49,   166,   147,
-     168,   111,   114,    51,   124,   125,   124,   125,   133,   134,
-      52,   175,    82,    83,    73,    82,    83,   140,   141,   -29,
-      89,   145,   -29,   -29,   -29,   -29,   -29,   -29,   -29,   -29,
-     -29,    90,    54,   -29,   -29,    91,    92,   -29,    93,    94,
-      95,    96,    97,   132,   -29,    98,    82,    83,    89,   164,
-      99,   -68,   -68,   -68,   -68,   -68,   -68,   -68,   -68,    45,
-      46,   -68,   -68,    91,    92,   156,    56,    57,   142,    55,
-      58,   115,   118,    98,   126,    59,   117,   122,   123,   130,
-     169,   151,   -31,    89,    62,   -31,   -31,   -31,   -31,   -31,
-     -31,   -31,   -31,   -31,    90,    63,   -31,   -31,    91,    92,
-     -31,    93,    94,    95,    96,    97,    64,   -31,    98,    56,
-      57,   -77,    89,    99,   -77,   -77,   -77,   -77,   -77,   -77,
-     -77,   -77,   -77,    82,    83,   -77,   -77,    91,    92,   -77,
-     -77,   -77,   -77,   -77,   -77,    73,   -77,    98,    75,    76,
-      -2,     4,   123,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    77,    78,    14,    15,    16,    79,    17,    18,
-      19,    20,    21,    22,    87,    23,    24,   119,    89,   127,
-      88,    25,   -44,   -44,   131,   -44,   -44,   -44,   -44,    90,
-     137,   -44,   -44,    91,    92,   105,   106,   107,   108,   157,
-      82,    83,   109,    98,   158,    82,    83,   138,   110,     6,
-       7,     8,     9,    10,    11,    12,    13,   146,   148,    14,
-      15,     7,     8,   149,    10,    11,    12,    13,   150,   153,
-      14,    15,   139,   154,    56,    57,    25,    83,    58,   113,
-     171,    82,    83,    59,   121,   160,   129,    25,    72,   165,
-      84,   167,   170,   172,   173,   174,   176,   177,   178,    66,
-       0,   152
+      48,    49,     3,    51,    81,    82,    54,   137,   138,    90,
+      45,   157,   -70,   -70,   -70,   -70,   -70,   -70,   -70,   -70,
+     150,    86,   -70,   -70,    92,    93,    50,    87,   135,   136,
+      83,    84,    52,   117,   120,   100,   128,   142,   143,    53,
+     125,   147,   -30,    90,    55,   -30,   -30,   -30,   -30,   -30,
+     -30,   -30,   -30,   -30,    91,    56,   -30,   -30,    92,    93,
+     -30,    94,    95,    96,    97,    98,    99,    63,   -30,   100,
+      64,   168,     7,     8,   101,    10,    11,    12,    13,    65,
+     134,    14,    15,    83,    84,   141,   159,    57,    58,   144,
+     113,    59,   148,   126,    74,   126,    60,    57,    58,    26,
+      76,    59,   173,   154,   -32,    90,    60,   -32,   -32,   -32,
+     -32,   -32,   -32,   -32,   -32,   -32,    91,    77,   -32,   -32,
+      92,    93,   -32,    94,    95,    96,    97,    98,    99,    78,
+     -32,   100,    46,    47,   -79,    90,   101,   -79,   -79,   -79,
+     -79,   -79,   -79,   -79,   -79,   -79,    57,    58,   -79,   -79,
+      92,    93,   -79,   -79,   -79,   -79,   -79,   -79,   -79,    79,
+     -79,   100,    83,    84,    -2,     4,   125,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    80,   149,    14,    15,
+      16,    88,    17,    18,    19,    20,    21,    22,    23,   116,
+      24,    25,   127,    90,   127,    89,    26,   -46,   -46,   133,
+     -46,   -46,   -46,   -46,    91,   139,   -46,   -46,    92,    93,
+     107,   108,   109,   110,   119,   124,   140,   132,   111,   100,
+      74,    83,    84,   152,   112,     6,     7,     8,     9,    10,
+      11,    12,    13,   151,   153,    14,    15,   162,   157,   164,
+     165,   166,   167,   160,    83,    84,   121,   170,   129,   172,
+     161,    83,    84,    26,   175,    83,    84,   123,   156,   131,
+      84,   180,   163,   115,   155,   169,   171,   174,   176,   177,
+     178,   179,   181,   182,   183,    67,    85,     0,     0,     0,
+       0,     0,     0,     0,     0,    73
 };
 
 static const short int yycheck[] =
 {
-       5,     6,     0,     8,    58,    59,    11,    85,    86,   142,
-      28,   144,   145,   146,    14,    31,    34,    31,   151,    97,
-     153,    67,    67,    31,    70,    70,    72,    72,    82,    83,
-      31,   164,    32,    33,    31,    32,    33,    91,    92,     0,
-       1,    95,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    26,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    29,    25,    26,    32,    33,     1,   147,
-      31,     4,     5,     6,     7,     8,     9,    10,    11,    26,
-      27,    14,    15,    16,    17,   139,    26,    27,    93,    26,
-      30,    68,    69,    26,    71,    35,    68,    69,    31,    71,
-     154,   106,     0,     1,    31,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,     1,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,     1,    25,    26,    26,
-      27,     0,     1,    31,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    32,    33,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    31,    25,    26,    31,    31,
-       0,     1,    31,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    31,    31,    14,    15,    16,    31,    18,    19,
-      20,    21,    22,    23,    31,    25,    26,    69,     1,    71,
-      31,    31,     5,     6,    31,     8,     9,    10,    11,    12,
-      31,    14,    15,    16,    17,    18,    19,    20,    21,    31,
-      32,    33,    25,    26,    31,    32,    33,    31,    31,     4,
-       5,     6,     7,     8,     9,    10,    11,    26,     1,    14,
-      15,     5,     6,    13,     8,     9,    10,    11,    31,    26,
-      14,    15,    24,    14,    26,    27,    31,    33,    30,    67,
-      31,    32,    33,    35,    69,    31,    71,    31,    41,    31,
-      60,    31,    31,    31,    31,    31,    31,    31,    31,    30,
-      -1,   107
+       5,     6,     0,     8,    59,    60,    11,    86,    87,     1,
+      32,    14,     4,     5,     6,     7,     8,     9,    10,    11,
+      99,    29,    14,    15,    16,    17,    32,    35,    83,    84,
+      33,    34,    32,    69,    70,    27,    72,    92,    93,    32,
+      32,    96,     0,     1,    27,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    27,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    32,    26,    27,
+       1,   150,     5,     6,    32,     8,     9,    10,    11,     1,
+      30,    14,    15,    33,    34,    25,   141,    27,    28,    94,
+      68,    31,    27,    71,    32,    73,    36,    27,    28,    32,
+      32,    31,   157,   108,     0,     1,    36,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    32,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    32,
+      26,    27,    27,    28,     0,     1,    32,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    27,    28,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    32,
+      26,    27,    33,    34,     0,     1,    32,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    32,    27,    14,    15,
+      16,    32,    18,    19,    20,    21,    22,    23,    24,    68,
+      26,    27,    71,     1,    73,    32,    32,     5,     6,    32,
+       8,     9,    10,    11,    12,    32,    14,    15,    16,    17,
+      18,    19,    20,    21,    69,    70,    32,    72,    26,    27,
+      32,    33,    34,    13,    32,     4,     5,     6,     7,     8,
+       9,    10,    11,     1,    32,    14,    15,   144,    14,   146,
+     147,   148,   149,    32,    33,    34,    70,   154,    72,   156,
+      32,    33,    34,    32,    32,    33,    34,    70,    27,    72,
+      34,   168,    32,    68,   109,    32,    32,    32,    32,    32,
+      32,    32,    32,    32,    32,    31,    61,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    42
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 static const unsigned char yystos[] =
 {
-       0,    37,    38,     0,     1,     3,     4,     5,     6,     7,
+       0,    38,    39,     0,     1,     3,     4,     5,     6,     7,
        8,     9,    10,    11,    14,    15,    16,    18,    19,    20,
-      21,    22,    23,    25,    26,    31,    39,    40,    42,    43,
-      44,    45,    48,    49,    51,    55,    57,    59,    60,    62,
-      64,    65,    66,    73,    31,    26,    27,    72,    72,    31,
-      72,    31,    31,    72,    26,    26,    26,    27,    30,    35,
-      76,    77,    31,     1,     1,    46,    46,    52,    54,    58,
-      69,    63,    69,    31,    74,    31,    31,    31,    31,    31,
-      76,    76,    32,    33,    74,    28,    34,    31,    31,     1,
-      12,    16,    17,    19,    20,    21,    22,    23,    26,    31,
-      41,    47,    67,    68,    70,    18,    19,    20,    21,    25,
-      31,    41,    53,    68,    70,    40,    50,    73,    40,    51,
-      56,    62,    73,    31,    41,    70,    40,    51,    61,    62,
-      73,    31,    29,    76,    76,    77,    77,    31,    31,    24,
-      76,    76,    72,    71,    72,    76,    26,    77,     1,    13,
-      31,    72,    71,    26,    14,    75,    76,    31,    31,    75,
-      31,    75,    75,    75,    77,    31,    75,    31,    75,    76,
-      31,    31,    31,    31,    31,    75,    31,    31,    31
+      21,    22,    23,    24,    26,    27,    32,    40,    41,    43,
+      44,    45,    46,    49,    50,    52,    56,    58,    60,    61,
+      63,    65,    66,    67,    74,    32,    27,    28,    73,    73,
+      32,    73,    32,    32,    73,    27,    27,    27,    28,    31,
+      36,    77,    78,    32,     1,     1,    47,    47,    53,    55,
+      59,    70,    64,    70,    32,    75,    32,    32,    32,    32,
+      32,    77,    77,    33,    34,    75,    29,    35,    32,    32,
+       1,    12,    16,    17,    19,    20,    21,    22,    23,    24,
+      27,    32,    42,    48,    68,    69,    71,    18,    19,    20,
+      21,    26,    32,    42,    54,    69,    71,    41,    51,    74,
+      41,    52,    57,    63,    74,    32,    42,    71,    41,    52,
+      62,    63,    74,    32,    30,    77,    77,    78,    78,    32,
+      32,    25,    77,    77,    73,    72,    73,    77,    27,    27,
+      78,     1,    13,    32,    73,    72,    27,    14,    76,    77,
+      32,    32,    76,    32,    76,    76,    76,    76,    78,    32,
+      76,    32,    76,    77,    32,    32,    32,    32,    32,    32,
+      76,    32,    32,    32
 };
 
 #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
@@ -981,7 +990,7 @@ yydestruct (yytype, yyvaluep)
 
   switch (yytype)
     {
-      case 49: /* choice_entry */
+      case 50: /* choice_entry */
 
         {
        fprintf(stderr, "%s:%d: missing end statement for this entry\n",
@@ -991,7 +1000,7 @@ yydestruct (yytype, yyvaluep)
 };
 
         break;
-      case 55: /* if_entry */
+      case 56: /* if_entry */
 
         {
        fprintf(stderr, "%s:%d: missing end statement for this entry\n",
@@ -1001,7 +1010,7 @@ yydestruct (yytype, yyvaluep)
 };
 
         break;
-      case 60: /* menu_entry */
+      case 61: /* menu_entry */
 
         {
        fprintf(stderr, "%s:%d: missing end statement for this entry\n",
@@ -1334,17 +1343,17 @@ yyreduce:
     { zconf_error("invalid statement"); ;}
     break;
 
-  case 26:
+  case 27:
 
     { zconf_error("unknown option \"%s\"", yyvsp[-2].string); ;}
     break;
 
-  case 27:
+  case 28:
 
     { zconf_error("invalid option"); ;}
     break;
 
-  case 28:
+  case 29:
 
     {
        struct symbol *sym = sym_lookup(yyvsp[-1].string, 0);
@@ -1354,7 +1363,7 @@ yyreduce:
 ;}
     break;
 
-  case 29:
+  case 30:
 
     {
        menu_end_entry();
@@ -1362,7 +1371,7 @@ yyreduce:
 ;}
     break;
 
-  case 30:
+  case 31:
 
     {
        struct symbol *sym = sym_lookup(yyvsp[-1].string, 0);
@@ -1372,7 +1381,7 @@ yyreduce:
 ;}
     break;
 
-  case 31:
+  case 32:
 
     {
        if (current_entry->prompt)
@@ -1384,7 +1393,7 @@ yyreduce:
 ;}
     break;
 
-  case 38:
+  case 39:
 
     {
        menu_set_type(yyvsp[-2].id->stype);
@@ -1394,7 +1403,7 @@ yyreduce:
 ;}
     break;
 
-  case 39:
+  case 40:
 
     {
        menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr);
@@ -1402,7 +1411,7 @@ yyreduce:
 ;}
     break;
 
-  case 40:
+  case 41:
 
     {
        menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr);
@@ -1414,7 +1423,15 @@ yyreduce:
 ;}
     break;
 
-  case 41:
+  case 42:
+
+    {
+       menu_add_symbol(P_DESELECT, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr);
+       printd(DEBUG_PARSE, "%s:%d:deselect\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 43:
 
     {
        menu_add_symbol(P_SELECT, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr);
@@ -1422,7 +1439,7 @@ yyreduce:
 ;}
     break;
 
-  case 42:
+  case 44:
 
     {
        menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,yyvsp[-3].symbol, yyvsp[-2].symbol), yyvsp[-1].expr);
@@ -1430,7 +1447,7 @@ yyreduce:
 ;}
     break;
 
-  case 43:
+  case 45:
 
     {
        struct symbol *sym = sym_lookup(NULL, 0);
@@ -1441,14 +1458,14 @@ yyreduce:
 ;}
     break;
 
-  case 44:
+  case 46:
 
     {
        yyval.menu = menu_add_menu();
 ;}
     break;
 
-  case 45:
+  case 47:
 
     {
        if (zconf_endtoken(yyvsp[0].id, T_CHOICE, T_ENDCHOICE)) {
@@ -1458,7 +1475,7 @@ yyreduce:
 ;}
     break;
 
-  case 53:
+  case 55:
 
     {
        menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr);
@@ -1466,7 +1483,7 @@ yyreduce:
 ;}
     break;
 
-  case 54:
+  case 56:
 
     {
        if (yyvsp[-2].id->stype == S_BOOLEAN || yyvsp[-2].id->stype == S_TRISTATE) {
@@ -1479,7 +1496,7 @@ yyreduce:
 ;}
     break;
 
-  case 55:
+  case 57:
 
     {
        current_entry->sym->flags |= SYMBOL_OPTIONAL;
@@ -1487,14 +1504,14 @@ yyreduce:
 ;}
     break;
 
-  case 56:
+  case 58:
 
     {
        menu_add_prop(P_RESET, NULL, NULL, yyvsp[-1].expr);
 ;}
     break;
 
-  case 57:
+  case 59:
 
     {
        if (yyvsp[-3].id->stype == S_UNKNOWN) {
@@ -1506,7 +1523,7 @@ yyreduce:
 ;}
     break;
 
-  case 60:
+  case 62:
 
     {
        printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
@@ -1516,7 +1533,7 @@ yyreduce:
 ;}
     break;
 
-  case 61:
+  case 63:
 
     {
        if (zconf_endtoken(yyvsp[0].id, T_IF, T_ENDIF)) {
@@ -1526,7 +1543,7 @@ yyreduce:
 ;}
     break;
 
-  case 67:
+  case 69:
 
     {
        menu_add_entry(NULL);
@@ -1535,14 +1552,14 @@ yyreduce:
 ;}
     break;
 
-  case 68:
+  case 70:
 
     {
        yyval.menu = menu_add_menu();
 ;}
     break;
 
-  case 69:
+  case 71:
 
     {
        if (zconf_endtoken(yyvsp[0].id, T_MENU, T_ENDMENU)) {
@@ -1552,7 +1569,7 @@ yyreduce:
 ;}
     break;
 
-  case 75:
+  case 77:
 
     {
        printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string);
@@ -1560,7 +1577,7 @@ yyreduce:
 ;}
     break;
 
-  case 76:
+  case 78:
 
     {
        menu_add_entry(NULL);
@@ -1569,14 +1586,14 @@ yyreduce:
 ;}
     break;
 
-  case 77:
+  case 79:
 
     {
        menu_end_entry();
 ;}
     break;
 
-  case 78:
+  case 80:
 
     {
        printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
@@ -1584,14 +1601,14 @@ yyreduce:
 ;}
     break;
 
-  case 79:
+  case 81:
 
     {
        current_entry->sym->help = yyvsp[0].string;
 ;}
     break;
 
-  case 84:
+  case 86:
 
     {
        menu_add_dep(yyvsp[-1].expr);
@@ -1599,7 +1616,7 @@ yyreduce:
 ;}
     break;
 
-  case 85:
+  case 87:
 
     {
        menu_add_dep(yyvsp[-1].expr);
@@ -1607,7 +1624,7 @@ yyreduce:
 ;}
     break;
 
-  case 86:
+  case 88:
 
     {
        menu_add_dep(yyvsp[-1].expr);
@@ -1615,79 +1632,79 @@ yyreduce:
 ;}
     break;
 
-  case 88:
+  case 90:
 
     {
        menu_add_prompt(P_PROMPT, yyvsp[-1].string, yyvsp[0].expr);
 ;}
     break;
 
-  case 91:
+  case 93:
 
     { yyval.id = yyvsp[-1].id; ;}
     break;
 
-  case 92:
+  case 94:
 
     { yyval.id = yyvsp[-1].id; ;}
     break;
 
-  case 93:
+  case 95:
 
     { yyval.id = yyvsp[-1].id; ;}
     break;
 
-  case 96:
+  case 98:
 
     { yyval.expr = NULL; ;}
     break;
 
-  case 97:
+  case 99:
 
     { yyval.expr = yyvsp[0].expr; ;}
     break;
 
-  case 98:
+  case 100:
 
     { yyval.expr = expr_alloc_symbol(yyvsp[0].symbol); ;}
     break;
 
-  case 99:
+  case 101:
 
     { yyval.expr = expr_alloc_comp(E_EQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;}
     break;
 
-  case 100:
+  case 102:
 
     { yyval.expr = expr_alloc_comp(E_UNEQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;}
     break;
 
-  case 101:
+  case 103:
 
     { yyval.expr = yyvsp[-1].expr; ;}
     break;
 
-  case 102:
+  case 104:
 
     { yyval.expr = expr_alloc_one(E_NOT, yyvsp[0].expr); ;}
     break;
 
-  case 103:
+  case 105:
 
     { yyval.expr = expr_alloc_two(E_OR, yyvsp[-2].expr, yyvsp[0].expr); ;}
     break;
 
-  case 104:
+  case 106:
 
     { yyval.expr = expr_alloc_two(E_AND, yyvsp[-2].expr, yyvsp[0].expr); ;}
     break;
 
-  case 105:
+  case 107:
 
     { yyval.symbol = sym_lookup(yyvsp[0].string, 0); free(yyvsp[0].string); ;}
     break;
 
-  case 106:
+  case 108:
 
     { yyval.symbol = sym_lookup(yyvsp[0].string, 1); free(yyvsp[0].string); ;}
     break;
index 4b8ba45..9689a3e 100644 (file)
@@ -69,6 +69,7 @@ static struct menu *current_menu, *current_entry;
 %token <id>T_PROMPT
 %token <id>T_TYPE
 %token <id>T_DEFAULT
+%token <id>T_DESELECT
 %token <id>T_SELECT
 %token <id>T_RANGE
 %token <id>T_ON
@@ -119,7 +120,7 @@ stmt_list:
 ;
 
 option_name:
-       T_DEPENDS | T_PROMPT | T_TYPE | T_SELECT | T_OPTIONAL | T_RANGE | T_DEFAULT | T_RESET
+       T_DEPENDS | T_PROMPT | T_TYPE | T_DESELECT | T_SELECT | T_OPTIONAL | T_RANGE | T_DEFAULT | T_RESET
 ;
 
 common_stmt:
@@ -204,6 +205,12 @@ config_option: T_DEFAULT expr if_expr T_EOL
                $1->stype);
 };
 
+config_option: T_DESELECT T_WORD if_expr T_EOL
+{
+       menu_add_symbol(P_DESELECT, sym_lookup($2, 0), $3);
+       printd(DEBUG_PARSE, "%s:%d:deselect\n", zconf_curname(), zconf_lineno());
+};
+
 config_option: T_SELECT T_WORD if_expr T_EOL
 {
        menu_add_symbol(P_SELECT, sym_lookup($2, 0), $3);