浏览代码

add 'deselect' property for menuconfig

SVN-Revision: 6647
Felix Fietkau 18 年之前
父节点
当前提交
c48b6508fe

+ 2 - 1
scripts/config/expr.h

@@ -74,6 +74,7 @@ struct symbol {
 	struct property *prop;
 	struct property *prop;
 	struct expr *dep, *dep2;
 	struct expr *dep, *dep2;
 	struct expr_value rev_dep;
 	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)
 #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
 #define SYMBOL_HASHMASK		0xff
 
 
 enum prop_type {
 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 {
 struct property {

+ 2 - 2
scripts/config/lex.zconf.c_shipped

@@ -20,7 +20,6 @@
 #include <string.h>
 #include <string.h>
 #include <errno.h>
 #include <errno.h>
 #include <stdlib.h>
 #include <stdlib.h>
-#include <glob.h>
 
 
 /* end standard C headers. */
 /* end standard C headers. */
 
 
@@ -748,6 +747,7 @@ char *zconftext;
 #include <stdlib.h>
 #include <stdlib.h>
 #include <string.h>
 #include <string.h>
 #include <unistd.h>
 #include <unistd.h>
+#include <glob.h>
 
 
 #define LKC_DIRECT_LINK
 #define LKC_DIRECT_LINK
 #include "lkc.h"
 #include "lkc.h"
@@ -2280,7 +2280,7 @@ void zconf_nextfile(const char *name)
 		filename = files.gl_pathv[i];
 		filename = files.gl_pathv[i];
 
 
 		file = file_lookup(filename);
 		file = file_lookup(filename);
-                buf = malloc(sizeof(*buf));
+		buf = malloc(sizeof(*buf));
 		memset(buf, 0, sizeof(*buf));
 		memset(buf, 0, sizeof(*buf));
 		current_buf->state = YY_CURRENT_BUFFER;
 		current_buf->state = YY_CURRENT_BUFFER;
 		zconfin = zconf_fopen(filename);
 		zconfin = zconf_fopen(filename);

+ 19 - 0
scripts/config/mconf.c

@@ -405,6 +405,7 @@ static void get_symbol_str(struct gstr *r, struct symbol *sym)
 	                               sym_get_string_value(sym));
 	                               sym_get_string_value(sym));
 	for_all_prompts(sym, prop)
 	for_all_prompts(sym, prop)
 		get_prompt_str(r, prop);
 		get_prompt_str(r, prop);
+
 	hit = false;
 	hit = false;
 	for_all_properties(sym, prop, P_SELECT) {
 	for_all_properties(sym, prop, P_SELECT) {
 		if (!hit) {
 		if (!hit) {
@@ -416,11 +417,29 @@ static void get_symbol_str(struct gstr *r, struct symbol *sym)
 	}
 	}
 	if (hit)
 	if (hit)
 		str_append(r, "\n");
 		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) {
 	if (sym->rev_dep.expr) {
 		str_append(r, "  Selected by: ");
 		str_append(r, "  Selected by: ");
 		expr_gstr_print(sym->rev_dep.expr, r);
 		expr_gstr_print(sym->rev_dep.expr, r);
 		str_append(r, "\n");
 		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");
 	str_append(r, "\n\n");
 }
 }
 
 

+ 26 - 31
scripts/config/menu.c

@@ -74,37 +74,9 @@ void menu_end_menu(void)
 	current_menu = current_menu->parent;
 	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)
 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)
 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->menu = current_entry;
 	prop->text = prompt;
 	prop->text = prompt;
 	prop->expr = expr;
 	prop->expr = expr;
-	prop->visible.expr = menu_check_dep(dep);
+	prop->visible.expr = dep;
 
 
 	if (prompt) {
 	if (prompt) {
 		if (current_entry->prompt)
 		if (current_entry->prompt)
@@ -191,6 +163,23 @@ void sym_check_prop(struct symbol *sym)
 				    "accept arguments of boolean and "
 				    "accept arguments of boolean and "
 				    "tristate type", sym2->name);
 				    "tristate type", sym2->name);
 			break;
 			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:
 		case P_RANGE:
 			if (sym->type != S_INT && sym->type != S_HEX)
 			if (sym->type != S_INT && sym->type != S_HEX)
 				prop_warn(prop, "range is only allowed "
 				prop_warn(prop, "range is only allowed "
@@ -240,11 +229,12 @@ void menu_finalize(struct menu *parent)
 				prop = menu->sym->prop;
 				prop = menu->sym->prop;
 			else
 			else
 				prop = menu->prompt;
 				prop = menu->prompt;
+
 			for (; prop; prop = prop->next) {
 			for (; prop; prop = prop->next) {
 				if (prop->menu != menu)
 				if (prop->menu != menu)
 					continue;
 					continue;
 				dep = expr_transform(prop->visible.expr);
 				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);
 				dep = expr_eliminate_dups(dep);
 				if (menu->sym && menu->sym->type != S_TRISTATE)
 				if (menu->sym && menu->sym->type != S_TRISTATE)
 					dep = expr_trans_bool(dep);
 					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,
 					es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr,
 							expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
 							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)
 		for (menu = parent->list; menu; menu = menu->next)

+ 7 - 6
scripts/config/symbol.c

@@ -204,13 +204,12 @@ static void sym_calc_visibility(struct symbol *sym)
 		prop->visible.tri = expr_calc_value(prop->visible.expr);
 		prop->visible.tri = expr_calc_value(prop->visible.expr);
 		tri = E_OR(tri, prop->visible.tri);
 		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))
 	if (tri == mod && (sym->type != S_TRISTATE))
-#endif
 		tri = yes;
 		tri = yes;
+	if (sym->rev_dep_inv.expr) {
+		if (expr_calc_value(sym->rev_dep_inv.expr) == yes)
+			tri = no;
+	}
 	if (sym->visible != tri) {
 	if (sym->visible != tri) {
 		sym->visible = tri;
 		sym->visible = tri;
 		sym_set_changed(sym);
 		sym_set_changed(sym);
@@ -814,7 +813,7 @@ struct symbol *sym_check_deps(struct symbol *sym)
 		goto out;
 		goto out;
 
 
 	for (prop = sym->prop; prop; prop = prop->next) {
 	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;
 			continue;
 		sym2 = sym_check_expr_deps(prop->visible.expr);
 		sym2 = sym_check_expr_deps(prop->visible.expr);
 		if (sym2)
 		if (sym2)
@@ -882,6 +881,8 @@ const char *prop_get_type_name(enum prop_type type)
 		return "choice";
 		return "choice";
 	case P_SELECT:
 	case P_SELECT:
 		return "select";
 		return "select";
+	case P_DESELECT:
+		return "deselect";
 	case P_RANGE:
 	case P_RANGE:
 		return "range";
 		return "range";
 	case P_UNKNOWN:
 	case P_UNKNOWN:

+ 1 - 0
scripts/config/zconf.gperf

@@ -37,6 +37,7 @@ def_boolean,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN
 int,		T_TYPE,		TF_COMMAND, S_INT
 int,		T_TYPE,		TF_COMMAND, S_INT
 hex,		T_TYPE,		TF_COMMAND, S_HEX
 hex,		T_TYPE,		TF_COMMAND, S_HEX
 string,		T_TYPE,		TF_COMMAND, S_STRING
 string,		T_TYPE,		TF_COMMAND, S_STRING
+deselect,	T_DESELECT,	TF_COMMAND
 select,		T_SELECT,	TF_COMMAND
 select,		T_SELECT,	TF_COMMAND
 enable,		T_SELECT,	TF_COMMAND
 enable,		T_SELECT,	TF_COMMAND
 range,		T_RANGE,	TF_COMMAND
 range,		T_RANGE,	TF_COMMAND

+ 113 - 113
scripts/config/zconf.hash.c_shipped

@@ -30,7 +30,7 @@
 #endif
 #endif
 
 
 struct kconf_id;
 struct kconf_id;
-/* maximum key range = 45, duplicates = 0 */
+/* maximum key range = 40, duplicates = 0 */
 
 
 #ifdef __GNUC__
 #ifdef __GNUC__
 __inline
 __inline
@@ -44,32 +44,32 @@ kconf_id_hash (register const char *str, register unsigned int len)
 {
 {
   static unsigned char asso_values[] =
   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;
   register int hval = len;
 
 
@@ -88,71 +88,73 @@ kconf_id_hash (register const char *str, register unsigned int len)
 
 
 struct kconf_id_strings_t
 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_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 =
 static struct kconf_id_strings_t kconf_id_strings_contents =
   {
   {
-    "if",
-    "int",
+    "on",
+    "hex",
+    "bool",
+    "reset",
+    "string",
+    "boolean",
+    "optional",
+    "help",
     "endif",
     "endif",
-    "enable",
+    "select",
     "endmenu",
     "endmenu",
-    "tristate",
+    "deselect",
     "endchoice",
     "endchoice",
     "range",
     "range",
+    "source",
     "default",
     "default",
     "def_bool",
     "def_bool",
     "menu",
     "menu",
     "def_boolean",
     "def_boolean",
     "def_tristate",
     "def_tristate",
-    "mainmenu",
-    "help",
+    "requires",
     "menuconfig",
     "menuconfig",
+    "choice",
+    "if",
+    "int",
+    "prompt",
+    "comment",
+    "tristate",
     "config",
     "config",
-    "on",
-    "hex",
-    "reset",
-    "string",
     "depends",
     "depends",
-    "optional",
-    "select",
-    "comment",
-    "requires",
-    "bool",
-    "source",
-    "boolean",
-    "choice",
-    "prompt"
+    "mainmenu",
+    "enable"
   };
   };
 #define kconf_id_strings ((const char *) &kconf_id_strings_contents)
 #define kconf_id_strings ((const char *) &kconf_id_strings_contents)
 #ifdef __GNUC__
 #ifdef __GNUC__
@@ -163,55 +165,53 @@ kconf_id_lookup (register const char *str, register unsigned int len)
 {
 {
   enum
   enum
     {
     {
-      TOTAL_KEYWORDS = 31,
+      TOTAL_KEYWORDS = 32,
       MIN_WORD_LENGTH = 2,
       MIN_WORD_LENGTH = 2,
       MAX_WORD_LENGTH = 12,
       MAX_WORD_LENGTH = 12,
       MIN_HASH_VALUE = 2,
       MIN_HASH_VALUE = 2,
-      MAX_HASH_VALUE = 46
+      MAX_HASH_VALUE = 41
     };
     };
 
 
   static struct kconf_id wordlist[] =
   static struct kconf_id wordlist[] =
     {
     {
       {-1}, {-1},
       {-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},
       {-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},
       {-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},
       {-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_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)
   if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)

+ 305 - 288
scripts/config/zconf.tab.c_shipped

@@ -81,20 +81,21 @@
      T_PROMPT = 274,
      T_PROMPT = 274,
      T_TYPE = 275,
      T_TYPE = 275,
      T_DEFAULT = 276,
      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
 #endif
 #define T_MAINMENU 258
 #define T_MAINMENU 258
@@ -116,20 +117,21 @@
 #define T_PROMPT 274
 #define T_PROMPT 274
 #define T_TYPE 275
 #define T_TYPE 275
 #define T_DEFAULT 276
 #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. */
 /* YYFINAL -- State number of the termination state. */
 #define YYFINAL  3
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   271
+#define YYLAST   285
 
 
 /* YYNTOKENS -- Number of terminals. */
 /* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS  36
+#define YYNTOKENS  37
 /* YYNNTS -- Number of nonterminals. */
 /* YYNNTS -- Number of nonterminals. */
 #define YYNNTS  42
 #define YYNNTS  42
 /* YYNRULES -- Number of rules. */
 /* YYNRULES -- Number of rules. */
-#define YYNRULES  106
+#define YYNRULES  108
 /* YYNRULES -- Number of states. */
 /* YYNRULES -- Number of states. */
-#define YYNSTATES  179
+#define YYNSTATES  184
 
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   290
+#define YYMAXUTOK   291
 
 
 #define YYTRANSLATE(YYX) 						\
 #define YYTRANSLATE(YYX) 						\
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
   ((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,
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35
+      35,    36
 };
 };
 
 
 #if YYDEBUG
 #if YYDEBUG
@@ -379,68 +381,69 @@ static const unsigned short int yyprhs[] =
 {
 {
        0,     0,     3,     5,     6,     9,    12,    15,    20,    23,
        0,     0,     3,     5,     6,     9,    12,    15,    20,    23,
       28,    33,    37,    39,    41,    43,    45,    47,    49,    51,
       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. */
 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
 static const yysigned_char yyrhs[] =
 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.  */
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const unsigned short int yyrline[] =
 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
 #endif
 
 
@@ -453,17 +456,18 @@ static const char *const yytname[] =
   "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG",
   "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG",
   "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS",
   "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS",
   "T_REQUIRES", "T_OPTIONAL", "T_PROMPT", "T_TYPE", "T_DEFAULT",
   "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
 #endif
 
 
@@ -475,24 +479,24 @@ static const unsigned short int yytoknum[] =
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
-     285,   286,   287,   288,   289,   290
+     285,   286,   287,   288,   289,   290,   291
 };
 };
 # endif
 # endif
 
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const unsigned char yyr1[] =
 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.  */
 /* 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,
        0,     2,     1,     0,     2,     2,     2,     4,     2,     4,
        4,     3,     1,     1,     1,     1,     1,     1,     1,     1,
        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
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -517,161 +521,166 @@ static const unsigned char yyr2[] =
 static const unsigned char yydefact[] =
 static const unsigned char yydefact[] =
 {
 {
        3,     0,     0,     1,     0,     0,     0,     0,     0,     0,
        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]. */
 /* YYDEFGOTO[NTERM-NUM]. */
 static const short int yydefgoto[] =
 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
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
    STATE-NUM.  */
-#define YYPACT_NINF -134
+#define YYPACT_NINF -80
 static const short int yypact[] =
 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].  */
 /* YYPGOTO[NTERM-NUM].  */
 static const short int yypgoto[] =
 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
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If zero, do what YYDEFACT says.
    number is the opposite.  If zero, do what YYDEFACT says.
    If YYTABLE_NINF, syntax error.  */
    If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -78
+#define YYTABLE_NINF -80
 static const short int yytable[] =
 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[] =
 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
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
    symbol of state STATE-NUM.  */
 static const unsigned char yystos[] =
 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,
        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__)
 #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
@@ -981,7 +990,7 @@ yydestruct (yytype, yyvaluep)
 
 
   switch (yytype)
   switch (yytype)
     {
     {
-      case 49: /* choice_entry */
+      case 50: /* choice_entry */
 
 
         {
         {
 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
@@ -991,7 +1000,7 @@ yydestruct (yytype, yyvaluep)
 };
 };
 
 
         break;
         break;
-      case 55: /* if_entry */
+      case 56: /* if_entry */
 
 
         {
         {
 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
@@ -1001,7 +1010,7 @@ yydestruct (yytype, yyvaluep)
 };
 };
 
 
         break;
         break;
-      case 60: /* menu_entry */
+      case 61: /* menu_entry */
 
 
         {
         {
 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
@@ -1334,17 +1343,17 @@ yyreduce:
     { zconf_error("invalid statement"); ;}
     { zconf_error("invalid statement"); ;}
     break;
     break;
 
 
-  case 26:
+  case 27:
 
 
     { zconf_error("unknown option \"%s\"", yyvsp[-2].string); ;}
     { zconf_error("unknown option \"%s\"", yyvsp[-2].string); ;}
     break;
     break;
 
 
-  case 27:
+  case 28:
 
 
     { zconf_error("invalid option"); ;}
     { zconf_error("invalid option"); ;}
     break;
     break;
 
 
-  case 28:
+  case 29:
 
 
     {
     {
 	struct symbol *sym = sym_lookup(yyvsp[-1].string, 0);
 	struct symbol *sym = sym_lookup(yyvsp[-1].string, 0);
@@ -1354,7 +1363,7 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 29:
+  case 30:
 
 
     {
     {
 	menu_end_entry();
 	menu_end_entry();
@@ -1362,7 +1371,7 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 30:
+  case 31:
 
 
     {
     {
 	struct symbol *sym = sym_lookup(yyvsp[-1].string, 0);
 	struct symbol *sym = sym_lookup(yyvsp[-1].string, 0);
@@ -1372,7 +1381,7 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 31:
+  case 32:
 
 
     {
     {
 	if (current_entry->prompt)
 	if (current_entry->prompt)
@@ -1384,7 +1393,7 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 38:
+  case 39:
 
 
     {
     {
 	menu_set_type(yyvsp[-2].id->stype);
 	menu_set_type(yyvsp[-2].id->stype);
@@ -1394,7 +1403,7 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 39:
+  case 40:
 
 
     {
     {
 	menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr);
 	menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr);
@@ -1402,7 +1411,7 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 40:
+  case 41:
 
 
     {
     {
 	menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr);
 	menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr);
@@ -1414,7 +1423,15 @@ yyreduce:
 ;}
 ;}
     break;
     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);
 	menu_add_symbol(P_SELECT, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr);
@@ -1422,7 +1439,7 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 42:
+  case 44:
 
 
     {
     {
 	menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,yyvsp[-3].symbol, yyvsp[-2].symbol), yyvsp[-1].expr);
 	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;
     break;
 
 
-  case 43:
+  case 45:
 
 
     {
     {
 	struct symbol *sym = sym_lookup(NULL, 0);
 	struct symbol *sym = sym_lookup(NULL, 0);
@@ -1441,14 +1458,14 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 44:
+  case 46:
 
 
     {
     {
 	yyval.menu = menu_add_menu();
 	yyval.menu = menu_add_menu();
 ;}
 ;}
     break;
     break;
 
 
-  case 45:
+  case 47:
 
 
     {
     {
 	if (zconf_endtoken(yyvsp[0].id, T_CHOICE, T_ENDCHOICE)) {
 	if (zconf_endtoken(yyvsp[0].id, T_CHOICE, T_ENDCHOICE)) {
@@ -1458,7 +1475,7 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 53:
+  case 55:
 
 
     {
     {
 	menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr);
 	menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr);
@@ -1466,7 +1483,7 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 54:
+  case 56:
 
 
     {
     {
 	if (yyvsp[-2].id->stype == S_BOOLEAN || yyvsp[-2].id->stype == S_TRISTATE) {
 	if (yyvsp[-2].id->stype == S_BOOLEAN || yyvsp[-2].id->stype == S_TRISTATE) {
@@ -1479,7 +1496,7 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 55:
+  case 57:
 
 
     {
     {
 	current_entry->sym->flags |= SYMBOL_OPTIONAL;
 	current_entry->sym->flags |= SYMBOL_OPTIONAL;
@@ -1487,14 +1504,14 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 56:
+  case 58:
 
 
     {
     {
 	menu_add_prop(P_RESET, NULL, NULL, yyvsp[-1].expr);
 	menu_add_prop(P_RESET, NULL, NULL, yyvsp[-1].expr);
 ;}
 ;}
     break;
     break;
 
 
-  case 57:
+  case 59:
 
 
     {
     {
 	if (yyvsp[-3].id->stype == S_UNKNOWN) {
 	if (yyvsp[-3].id->stype == S_UNKNOWN) {
@@ -1506,7 +1523,7 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 60:
+  case 62:
 
 
     {
     {
 	printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
 	printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
@@ -1516,7 +1533,7 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 61:
+  case 63:
 
 
     {
     {
 	if (zconf_endtoken(yyvsp[0].id, T_IF, T_ENDIF)) {
 	if (zconf_endtoken(yyvsp[0].id, T_IF, T_ENDIF)) {
@@ -1526,7 +1543,7 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 67:
+  case 69:
 
 
     {
     {
 	menu_add_entry(NULL);
 	menu_add_entry(NULL);
@@ -1535,14 +1552,14 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 68:
+  case 70:
 
 
     {
     {
 	yyval.menu = menu_add_menu();
 	yyval.menu = menu_add_menu();
 ;}
 ;}
     break;
     break;
 
 
-  case 69:
+  case 71:
 
 
     {
     {
 	if (zconf_endtoken(yyvsp[0].id, T_MENU, T_ENDMENU)) {
 	if (zconf_endtoken(yyvsp[0].id, T_MENU, T_ENDMENU)) {
@@ -1552,7 +1569,7 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 75:
+  case 77:
 
 
     {
     {
 	printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string);
 	printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string);
@@ -1560,7 +1577,7 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 76:
+  case 78:
 
 
     {
     {
 	menu_add_entry(NULL);
 	menu_add_entry(NULL);
@@ -1569,14 +1586,14 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 77:
+  case 79:
 
 
     {
     {
 	menu_end_entry();
 	menu_end_entry();
 ;}
 ;}
     break;
     break;
 
 
-  case 78:
+  case 80:
 
 
     {
     {
 	printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
 	printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
@@ -1584,14 +1601,14 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 79:
+  case 81:
 
 
     {
     {
 	current_entry->sym->help = yyvsp[0].string;
 	current_entry->sym->help = yyvsp[0].string;
 ;}
 ;}
     break;
     break;
 
 
-  case 84:
+  case 86:
 
 
     {
     {
 	menu_add_dep(yyvsp[-1].expr);
 	menu_add_dep(yyvsp[-1].expr);
@@ -1599,7 +1616,7 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 85:
+  case 87:
 
 
     {
     {
 	menu_add_dep(yyvsp[-1].expr);
 	menu_add_dep(yyvsp[-1].expr);
@@ -1607,7 +1624,7 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 86:
+  case 88:
 
 
     {
     {
 	menu_add_dep(yyvsp[-1].expr);
 	menu_add_dep(yyvsp[-1].expr);
@@ -1615,79 +1632,79 @@ yyreduce:
 ;}
 ;}
     break;
     break;
 
 
-  case 88:
+  case 90:
 
 
     {
     {
 	menu_add_prompt(P_PROMPT, yyvsp[-1].string, yyvsp[0].expr);
 	menu_add_prompt(P_PROMPT, yyvsp[-1].string, yyvsp[0].expr);
 ;}
 ;}
     break;
     break;
 
 
-  case 91:
+  case 93:
 
 
     { yyval.id = yyvsp[-1].id; ;}
     { yyval.id = yyvsp[-1].id; ;}
     break;
     break;
 
 
-  case 92:
+  case 94:
 
 
     { yyval.id = yyvsp[-1].id; ;}
     { yyval.id = yyvsp[-1].id; ;}
     break;
     break;
 
 
-  case 93:
+  case 95:
 
 
     { yyval.id = yyvsp[-1].id; ;}
     { yyval.id = yyvsp[-1].id; ;}
     break;
     break;
 
 
-  case 96:
+  case 98:
 
 
     { yyval.expr = NULL; ;}
     { yyval.expr = NULL; ;}
     break;
     break;
 
 
-  case 97:
+  case 99:
 
 
     { yyval.expr = yyvsp[0].expr; ;}
     { yyval.expr = yyvsp[0].expr; ;}
     break;
     break;
 
 
-  case 98:
+  case 100:
 
 
     { yyval.expr = expr_alloc_symbol(yyvsp[0].symbol); ;}
     { yyval.expr = expr_alloc_symbol(yyvsp[0].symbol); ;}
     break;
     break;
 
 
-  case 99:
+  case 101:
 
 
     { yyval.expr = expr_alloc_comp(E_EQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;}
     { yyval.expr = expr_alloc_comp(E_EQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;}
     break;
     break;
 
 
-  case 100:
+  case 102:
 
 
     { yyval.expr = expr_alloc_comp(E_UNEQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;}
     { yyval.expr = expr_alloc_comp(E_UNEQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;}
     break;
     break;
 
 
-  case 101:
+  case 103:
 
 
     { yyval.expr = yyvsp[-1].expr; ;}
     { yyval.expr = yyvsp[-1].expr; ;}
     break;
     break;
 
 
-  case 102:
+  case 104:
 
 
     { yyval.expr = expr_alloc_one(E_NOT, yyvsp[0].expr); ;}
     { yyval.expr = expr_alloc_one(E_NOT, yyvsp[0].expr); ;}
     break;
     break;
 
 
-  case 103:
+  case 105:
 
 
     { yyval.expr = expr_alloc_two(E_OR, yyvsp[-2].expr, yyvsp[0].expr); ;}
     { yyval.expr = expr_alloc_two(E_OR, yyvsp[-2].expr, yyvsp[0].expr); ;}
     break;
     break;
 
 
-  case 104:
+  case 106:
 
 
     { yyval.expr = expr_alloc_two(E_AND, yyvsp[-2].expr, yyvsp[0].expr); ;}
     { yyval.expr = expr_alloc_two(E_AND, yyvsp[-2].expr, yyvsp[0].expr); ;}
     break;
     break;
 
 
-  case 105:
+  case 107:
 
 
     { yyval.symbol = sym_lookup(yyvsp[0].string, 0); free(yyvsp[0].string); ;}
     { yyval.symbol = sym_lookup(yyvsp[0].string, 0); free(yyvsp[0].string); ;}
     break;
     break;
 
 
-  case 106:
+  case 108:
 
 
     { yyval.symbol = sym_lookup(yyvsp[0].string, 1); free(yyvsp[0].string); ;}
     { yyval.symbol = sym_lookup(yyvsp[0].string, 1); free(yyvsp[0].string); ;}
     break;
     break;

+ 8 - 1
scripts/config/zconf.y

@@ -69,6 +69,7 @@ static struct menu *current_menu, *current_entry;
 %token <id>T_PROMPT
 %token <id>T_PROMPT
 %token <id>T_TYPE
 %token <id>T_TYPE
 %token <id>T_DEFAULT
 %token <id>T_DEFAULT
+%token <id>T_DESELECT
 %token <id>T_SELECT
 %token <id>T_SELECT
 %token <id>T_RANGE
 %token <id>T_RANGE
 %token <id>T_ON
 %token <id>T_ON
@@ -119,7 +120,7 @@ stmt_list:
 ;
 ;
 
 
 option_name:
 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:
 common_stmt:
@@ -204,6 +205,12 @@ config_option: T_DEFAULT expr if_expr T_EOL
 		$1->stype);
 		$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
 config_option: T_SELECT T_WORD if_expr T_EOL
 {
 {
 	menu_add_symbol(P_SELECT, sym_lookup($2, 0), $3);
 	menu_add_symbol(P_SELECT, sym_lookup($2, 0), $3);