Browse Source

add patch to Kconfig

Add following patch
https://lkml.org/lkml/2010/7/19/178

This allows to select for symbol as module and
for special predefined values on int/string/hex symbols.
Waldemar Brodkorb 9 years ago
parent
commit
f82981b971

+ 2 - 2
adk/config/Makefile

@@ -78,7 +78,7 @@ lkc_defs.h: lkc_proto.h
 # The following requires flex/bison
 # The following requires flex/bison
 # By default we use the _shipped versions, uncomment the
 # By default we use the _shipped versions, uncomment the
 # following line if you are modifying the flex/bison src.
 # following line if you are modifying the flex/bison src.
-#LKC_GENPARSER:=	1
+# LKC_GENPARSER:=	1
 
 
 ifdef LKC_GENPARSER
 ifdef LKC_GENPARSER
 
 
@@ -86,7 +86,7 @@ ifdef LKC_GENPARSER
 	bison -t -d -v -b $* -p $(notdir $*) $<
 	bison -t -d -v -b $* -p $(notdir $*) $<
 
 
 %.hash.c: %.gperf
 %.hash.c: %.gperf
-	gperf < $< > $@
+	gperf -t --output-file zconf.hash.c -a -C -E -g -k '1,3,$$' -p -t zconf.gperf
 
 
 lex.%.c: %.l
 lex.%.c: %.l
 	flex -P$(notdir $*) -o$@ $<
 	flex -P$(notdir $*) -o$@ $<

+ 9 - 0
adk/config/expr.h

@@ -54,6 +54,13 @@ struct expr_value {
 	tristate tri;
 	tristate tri;
 };
 };
 
 
+struct expr_select_value {
+	struct expr *expr;
+	tristate tri;
+	struct expr *value;
+	struct expr_select_value *next;
+};
+
 struct symbol_value {
 struct symbol_value {
 	void *val;
 	void *val;
 	tristate tri;
 	tristate tri;
@@ -83,6 +90,7 @@ struct symbol {
 	struct property *prop;
 	struct property *prop;
 	struct expr_value dir_dep;
 	struct expr_value dir_dep;
 	struct expr_value rev_dep;
 	struct expr_value rev_dep;
+	struct expr_select_value *val_dep;
 };
 };
 
 
 #define for_all_symbols(i, sym) for (i = 0; i < SYMBOL_HASHSIZE; 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 < SYMBOL_HASHSIZE; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
@@ -151,6 +159,7 @@ struct property {
 	                            * P_PROMPT, P_DEFAULT, P_MENU, P_COMMENT */
 	                            * P_PROMPT, P_DEFAULT, P_MENU, P_COMMENT */
 	struct file *file;         /* what file was this property defined */
 	struct file *file;         /* what file was this property defined */
 	int lineno;                /* what lineno was this property defined */
 	int lineno;                /* what lineno was this property defined */
+	struct expr *value;	   /* the optional P_SELECT value */
 };
 };
 
 
 #define for_all_properties(sym, st, tok) \
 #define for_all_properties(sym, st, tok) \

+ 4 - 3
adk/config/Kconfig-language.txt → adk/config/kconfig-language.txt

@@ -95,14 +95,15 @@ applicable everywhere (see syntax).
 	bool "foo"
 	bool "foo"
 	default y
 	default y
 
 
-- reverse dependencies: "select" <symbol> ["if" <expr>]
+- reverse dependencies: "select" <symbol> [<expr>] ["if" <expr>]
   While normal dependencies reduce the upper limit of a symbol (see
   While normal dependencies reduce the upper limit of a symbol (see
   below), reverse dependencies can be used to force a lower limit of
   below), reverse dependencies can be used to force a lower limit of
   another symbol. The value of the current menu symbol is used as the
   another symbol. The value of the current menu symbol is used as the
   minimal value <symbol> can be set to. If <symbol> is selected multiple
   minimal value <symbol> can be set to. If <symbol> is selected multiple
   times, the limit is set to the largest selection.
   times, the limit is set to the largest selection.
-  Reverse dependencies can only be used with boolean or tristate
-  symbols.
+  Reverse dependencies without the optional <expr> can only be used with
+  boolean or tristate symbols. If the optional <expr> is supplied,
+  the <symbol> will be set to that value if possible.
   Note:
   Note:
 	select should be used with care. select will force
 	select should be used with care. select will force
 	a symbol to a value without visiting the dependencies.
 	a symbol to a value without visiting the dependencies.

+ 104 - 33
adk/config/lex.zconf.c_shipped

@@ -1,5 +1,6 @@
+#line 2 "lex.zconf.c"
 
 
-#line 3 "scripts/kconfig/lex.zconf.c"
+#line 4 "lex.zconf.c"
 
 
 #define  YY_INT_ALIGNED short int
 #define  YY_INT_ALIGNED short int
 
 
@@ -160,7 +161,15 @@ typedef unsigned int flex_uint32_t;
 
 
 /* Size of default input buffer. */
 /* Size of default input buffer. */
 #ifndef YY_BUF_SIZE
 #ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
 #define YY_BUF_SIZE 16384
 #define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
 #endif
 #endif
 
 
 /* The state buf must be large enough to hold one state per character in the main buffer.
 /* The state buf must be large enough to hold one state per character in the main buffer.
@@ -764,8 +773,10 @@ int zconf_flex_debug = 0;
 #define YY_MORE_ADJ 0
 #define YY_MORE_ADJ 0
 #define YY_RESTORE_YY_MORE_OFFSET
 #define YY_RESTORE_YY_MORE_OFFSET
 char *zconftext;
 char *zconftext;
+#line 1 "zconf.l"
 #define YY_NO_INPUT 1
 #define YY_NO_INPUT 1
 
 
+#line 6 "zconf.l"
 /*
 /*
  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
  * Released under the terms of the GNU GPL v2.0.
  * Released under the terms of the GNU GPL v2.0.
@@ -777,7 +788,6 @@ char *zconftext;
 #include <string.h>
 #include <string.h>
 #include <unistd.h>
 #include <unistd.h>
 
 
-#define LKC_DIRECT_LINK
 #include "lkc.h"
 #include "lkc.h"
 
 
 #define START_STRSIZE	16
 #define START_STRSIZE	16
@@ -791,8 +801,8 @@ static char *text;
 static int text_size, text_asize;
 static int text_size, text_asize;
 
 
 struct buffer {
 struct buffer {
-        struct buffer *parent;
-        YY_BUFFER_STATE state;
+	struct buffer *parent;
+	YY_BUFFER_STATE state;
 };
 };
 
 
 struct buffer *current_buf;
 struct buffer *current_buf;
@@ -802,15 +812,15 @@ static int last_ts, first_ts;
 static void zconf_endhelp(void);
 static void zconf_endhelp(void);
 static void zconf_endfile(void);
 static void zconf_endfile(void);
 
 
-void new_string(void)
+static void new_string(void)
 {
 {
-	text = malloc(START_STRSIZE);
+	text = xmalloc(START_STRSIZE);
 	text_asize = START_STRSIZE;
 	text_asize = START_STRSIZE;
 	text_size = 0;
 	text_size = 0;
 	*text = 0;
 	*text = 0;
 }
 }
 
 
-void append_string(const char *str, int size)
+static void append_string(const char *str, int size)
 {
 {
 	int new_size = text_size + size + 1;
 	int new_size = text_size + size + 1;
 	if (new_size > text_asize) {
 	if (new_size > text_asize) {
@@ -824,12 +834,13 @@ void append_string(const char *str, int size)
 	text[text_size] = 0;
 	text[text_size] = 0;
 }
 }
 
 
-void alloc_string(const char *str, int size)
+static void alloc_string(const char *str, int size)
 {
 {
-	text = malloc(size + 1);
+	text = xmalloc(size + 1);
 	memcpy(text, str, size);
 	memcpy(text, str, size);
 	text[size] = 0;
 	text[size] = 0;
 }
 }
+#line 844 "lex.zconf.c"
 
 
 #define INITIAL 0
 #define INITIAL 0
 #define COMMAND 1
 #define COMMAND 1
@@ -914,7 +925,12 @@ static int input (void );
 
 
 /* Amount of stuff to slurp up with each read. */
 /* Amount of stuff to slurp up with each read. */
 #ifndef YY_READ_BUF_SIZE
 #ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
 #define YY_READ_BUF_SIZE 8192
 #define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
 #endif
 #endif
 
 
 /* Copy whatever the last rule matched to the standard output. */
 /* Copy whatever the last rule matched to the standard output. */
@@ -922,7 +938,7 @@ static int input (void );
 /* This used to be an fputs(), but since the string might contain NUL's,
 /* This used to be an fputs(), but since the string might contain NUL's,
  * we now use fwrite().
  * we now use fwrite().
  */
  */
-#define ECHO fwrite( zconftext, zconfleng, 1, zconfout )
+#define ECHO do { if (fwrite( zconftext, zconfleng, 1, zconfout )) {} } while (0)
 #endif
 #endif
 
 
 /* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
 /* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
@@ -999,9 +1015,13 @@ YY_DECL
 	register char *yy_cp, *yy_bp;
 	register char *yy_cp, *yy_bp;
 	register int yy_act;
 	register int yy_act;
     
     
+#line 73 "zconf.l"
+
 	int str = 0;
 	int str = 0;
 	int ts, i;
 	int ts, i;
 
 
+#line 1024 "lex.zconf.c"
+
 	if ( !(yy_init) )
 	if ( !(yy_init) )
 		{
 		{
 		(yy_init) = 1;
 		(yy_init) = 1;
@@ -1058,9 +1078,11 @@ do_action:	/* This label is used only to access EOF actions. */
 	{ /* beginning of action switch */
 	{ /* beginning of action switch */
 case 1:
 case 1:
 /* rule 1 can match eol */
 /* rule 1 can match eol */
+#line 78 "zconf.l"
 case 2:
 case 2:
 /* rule 2 can match eol */
 /* rule 2 can match eol */
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 78 "zconf.l"
 {
 {
 	current_file->lineno++;
 	current_file->lineno++;
 	return T_EOL;
 	return T_EOL;
@@ -1068,16 +1090,19 @@ YY_RULE_SETUP
 	YY_BREAK
 	YY_BREAK
 case 3:
 case 3:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 82 "zconf.l"
 
 
 	YY_BREAK
 	YY_BREAK
 case 4:
 case 4:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 85 "zconf.l"
 {
 {
 	BEGIN(COMMAND);
 	BEGIN(COMMAND);
 }
 }
 	YY_BREAK
 	YY_BREAK
 case 5:
 case 5:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 89 "zconf.l"
 {
 {
 	unput(zconftext[0]);
 	unput(zconftext[0]);
 	BEGIN(COMMAND);
 	BEGIN(COMMAND);
@@ -1086,8 +1111,9 @@ YY_RULE_SETUP
 
 
 case 6:
 case 6:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 96 "zconf.l"
 {
 {
-		struct kconf_id *id = kconf_id_lookup(zconftext, zconfleng);
+		const struct kconf_id *id = kconf_id_lookup(zconftext, zconfleng);
 		BEGIN(PARAM);
 		BEGIN(PARAM);
 		current_pos.file = current_file;
 		current_pos.file = current_file;
 		current_pos.lineno = current_file->lineno;
 		current_pos.lineno = current_file->lineno;
@@ -1102,11 +1128,13 @@ YY_RULE_SETUP
 	YY_BREAK
 	YY_BREAK
 case 7:
 case 7:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 109 "zconf.l"
 
 
 	YY_BREAK
 	YY_BREAK
 case 8:
 case 8:
 /* rule 8 can match eol */
 /* rule 8 can match eol */
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 110 "zconf.l"
 {
 {
 		BEGIN(INITIAL);
 		BEGIN(INITIAL);
 		current_file->lineno++;
 		current_file->lineno++;
@@ -1114,36 +1142,45 @@ YY_RULE_SETUP
 	}
 	}
 	YY_BREAK
 	YY_BREAK
 
 
+
 case 9:
 case 9:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 118 "zconf.l"
 return T_AND;
 return T_AND;
 	YY_BREAK
 	YY_BREAK
 case 10:
 case 10:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 119 "zconf.l"
 return T_OR;
 return T_OR;
 	YY_BREAK
 	YY_BREAK
 case 11:
 case 11:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 120 "zconf.l"
 return T_OPEN_PAREN;
 return T_OPEN_PAREN;
 	YY_BREAK
 	YY_BREAK
 case 12:
 case 12:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 121 "zconf.l"
 return T_CLOSE_PAREN;
 return T_CLOSE_PAREN;
 	YY_BREAK
 	YY_BREAK
 case 13:
 case 13:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 122 "zconf.l"
 return T_NOT;
 return T_NOT;
 	YY_BREAK
 	YY_BREAK
 case 14:
 case 14:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 123 "zconf.l"
 return T_EQUAL;
 return T_EQUAL;
 	YY_BREAK
 	YY_BREAK
 case 15:
 case 15:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 124 "zconf.l"
 return T_UNEQUAL;
 return T_UNEQUAL;
 	YY_BREAK
 	YY_BREAK
 case 16:
 case 16:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 125 "zconf.l"
 {
 {
 		str = zconftext[0];
 		str = zconftext[0];
 		new_string();
 		new_string();
@@ -1153,16 +1190,19 @@ YY_RULE_SETUP
 case 17:
 case 17:
 /* rule 17 can match eol */
 /* rule 17 can match eol */
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 130 "zconf.l"
 BEGIN(INITIAL); current_file->lineno++; return T_EOL;
 BEGIN(INITIAL); current_file->lineno++; return T_EOL;
 	YY_BREAK
 	YY_BREAK
 case 18:
 case 18:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 131 "zconf.l"
 /* ignore */
 /* ignore */
 	YY_BREAK
 	YY_BREAK
 case 19:
 case 19:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 132 "zconf.l"
 {
 {
-		struct kconf_id *id = kconf_id_lookup(zconftext, zconfleng);
+		const struct kconf_id *id = kconf_id_lookup(zconftext, zconfleng);
 		if (id && id->flags & TF_PARAM) {
 		if (id && id->flags & TF_PARAM) {
 			zconflval.id = id;
 			zconflval.id = id;
 			return id->token;
 			return id->token;
@@ -1174,29 +1214,35 @@ YY_RULE_SETUP
 	YY_BREAK
 	YY_BREAK
 case 20:
 case 20:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 142 "zconf.l"
 /* comment */
 /* comment */
 	YY_BREAK
 	YY_BREAK
 case 21:
 case 21:
 /* rule 21 can match eol */
 /* rule 21 can match eol */
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 143 "zconf.l"
 current_file->lineno++;
 current_file->lineno++;
 	YY_BREAK
 	YY_BREAK
 case 22:
 case 22:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 144 "zconf.l"
 
 
 	YY_BREAK
 	YY_BREAK
 case YY_STATE_EOF(PARAM):
 case YY_STATE_EOF(PARAM):
+#line 145 "zconf.l"
 {
 {
 		BEGIN(INITIAL);
 		BEGIN(INITIAL);
 	}
 	}
 	YY_BREAK
 	YY_BREAK
 
 
+
 case 23:
 case 23:
 /* rule 23 can match eol */
 /* rule 23 can match eol */
 *yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
 *yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
 (yy_c_buf_p) = yy_cp -= 1;
 (yy_c_buf_p) = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up zconftext again */
 YY_DO_BEFORE_ACTION; /* set up zconftext again */
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 151 "zconf.l"
 {
 {
 		append_string(zconftext, zconfleng);
 		append_string(zconftext, zconfleng);
 		zconflval.string = text;
 		zconflval.string = text;
@@ -1205,6 +1251,7 @@ YY_RULE_SETUP
 	YY_BREAK
 	YY_BREAK
 case 24:
 case 24:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 156 "zconf.l"
 {
 {
 		append_string(zconftext, zconfleng);
 		append_string(zconftext, zconfleng);
 	}
 	}
@@ -1215,6 +1262,7 @@ case 25:
 (yy_c_buf_p) = yy_cp -= 1;
 (yy_c_buf_p) = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up zconftext again */
 YY_DO_BEFORE_ACTION; /* set up zconftext again */
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 159 "zconf.l"
 {
 {
 		append_string(zconftext + 1, zconfleng - 1);
 		append_string(zconftext + 1, zconfleng - 1);
 		zconflval.string = text;
 		zconflval.string = text;
@@ -1223,12 +1271,14 @@ YY_RULE_SETUP
 	YY_BREAK
 	YY_BREAK
 case 26:
 case 26:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 164 "zconf.l"
 {
 {
 		append_string(zconftext + 1, zconfleng - 1);
 		append_string(zconftext + 1, zconfleng - 1);
 	}
 	}
 	YY_BREAK
 	YY_BREAK
 case 27:
 case 27:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 167 "zconf.l"
 {
 {
 		if (str == zconftext[0]) {
 		if (str == zconftext[0]) {
 			BEGIN(PARAM);
 			BEGIN(PARAM);
@@ -1241,6 +1291,7 @@ YY_RULE_SETUP
 case 28:
 case 28:
 /* rule 28 can match eol */
 /* rule 28 can match eol */
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 175 "zconf.l"
 {
 {
 		printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno());
 		printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno());
 		current_file->lineno++;
 		current_file->lineno++;
@@ -1249,13 +1300,16 @@ YY_RULE_SETUP
 	}
 	}
 	YY_BREAK
 	YY_BREAK
 case YY_STATE_EOF(STRING):
 case YY_STATE_EOF(STRING):
+#line 181 "zconf.l"
 {
 {
 		BEGIN(INITIAL);
 		BEGIN(INITIAL);
 	}
 	}
 	YY_BREAK
 	YY_BREAK
 
 
+
 case 29:
 case 29:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 187 "zconf.l"
 {
 {
 		ts = 0;
 		ts = 0;
 		for (i = 0; i < zconfleng; i++) {
 		for (i = 0; i < zconfleng; i++) {
@@ -1285,6 +1339,7 @@ case 30:
 (yy_c_buf_p) = yy_cp -= 1;
 (yy_c_buf_p) = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up zconftext again */
 YY_DO_BEFORE_ACTION; /* set up zconftext again */
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 209 "zconf.l"
 {
 {
 		current_file->lineno++;
 		current_file->lineno++;
 		zconf_endhelp();
 		zconf_endhelp();
@@ -1294,6 +1349,7 @@ YY_RULE_SETUP
 case 31:
 case 31:
 /* rule 31 can match eol */
 /* rule 31 can match eol */
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 214 "zconf.l"
 {
 {
 		current_file->lineno++;
 		current_file->lineno++;
 		append_string("\n", 1);
 		append_string("\n", 1);
@@ -1301,6 +1357,7 @@ YY_RULE_SETUP
 	YY_BREAK
 	YY_BREAK
 case 32:
 case 32:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 218 "zconf.l"
 {
 {
 		while (zconfleng) {
 		while (zconfleng) {
 			if ((zconftext[zconfleng-1] != ' ') && (zconftext[zconfleng-1] != '\t'))
 			if ((zconftext[zconfleng-1] != ' ') && (zconftext[zconfleng-1] != '\t'))
@@ -1313,6 +1370,7 @@ YY_RULE_SETUP
 	}
 	}
 	YY_BREAK
 	YY_BREAK
 case YY_STATE_EOF(HELP):
 case YY_STATE_EOF(HELP):
+#line 228 "zconf.l"
 {
 {
 		zconf_endhelp();
 		zconf_endhelp();
 		return T_HELPTEXT;
 		return T_HELPTEXT;
@@ -1321,6 +1379,7 @@ case YY_STATE_EOF(HELP):
 
 
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(COMMAND):
 case YY_STATE_EOF(COMMAND):
+#line 234 "zconf.l"
 {
 {
 	if (current_file) {
 	if (current_file) {
 		zconf_endfile();
 		zconf_endfile();
@@ -1332,8 +1391,10 @@ case YY_STATE_EOF(COMMAND):
 	YY_BREAK
 	YY_BREAK
 case 33:
 case 33:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 243 "zconf.l"
 YY_FATAL_ERROR( "flex scanner jammed" );
 YY_FATAL_ERROR( "flex scanner jammed" );
 	YY_BREAK
 	YY_BREAK
+#line 1398 "lex.zconf.c"
 
 
 	case YY_END_OF_BUFFER:
 	case YY_END_OF_BUFFER:
 		{
 		{
@@ -2060,8 +2121,8 @@ YY_BUFFER_STATE zconf_scan_string (yyconst char * yystr )
 
 
 /** Setup the input buffer state to scan the given bytes. The next call to zconflex() will
 /** Setup the input buffer state to scan the given bytes. The next call to zconflex() will
  * scan from a @e copy of @a bytes.
  * scan from a @e copy of @a bytes.
- * @param bytes the byte buffer to scan
- * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
  * 
  * 
  * @return the newly allocated buffer state object.
  * @return the newly allocated buffer state object.
  */
  */
@@ -2300,6 +2361,9 @@ void zconffree (void * ptr )
 
 
 #define YYTABLES_NAME "yytables"
 #define YYTABLES_NAME "yytables"
 
 
+#line 243 "zconf.l"
+
+
 void zconf_starthelp(void)
 void zconf_starthelp(void)
 {
 {
 	new_string();
 	new_string();
@@ -2313,6 +2377,7 @@ static void zconf_endhelp(void)
 	BEGIN(INITIAL);
 	BEGIN(INITIAL);
 }
 }
 
 
+
 /*
 /*
  * Try to open specified file with following names:
  * Try to open specified file with following names:
  * ./name
  * ./name
@@ -2345,42 +2410,50 @@ void zconf_initscan(const char *name)
 		exit(1);
 		exit(1);
 	}
 	}
 
 
-	current_buf = malloc(sizeof(*current_buf));
+	current_buf = xmalloc(sizeof(*current_buf));
 	memset(current_buf, 0, sizeof(*current_buf));
 	memset(current_buf, 0, sizeof(*current_buf));
 
 
 	current_file = file_lookup(name);
 	current_file = file_lookup(name);
 	current_file->lineno = 1;
 	current_file->lineno = 1;
-	current_file->flags = FILE_BUSY;
 }
 }
 
 
 void zconf_nextfile(const char *name)
 void zconf_nextfile(const char *name)
 {
 {
+	struct file *iter;
 	struct file *file = file_lookup(name);
 	struct file *file = file_lookup(name);
-	struct buffer *buf = malloc(sizeof(*buf));
+	struct buffer *buf = xmalloc(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(name);
+	zconfin = zconf_fopen(file->name);
 	if (!zconfin) {
 	if (!zconfin) {
-		printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name);
+		printf("%s:%d: can't open file \"%s\"\n",
+		    zconf_curname(), zconf_lineno(), file->name);
 		exit(1);
 		exit(1);
 	}
 	}
 	zconf_switch_to_buffer(zconf_create_buffer(zconfin,YY_BUF_SIZE));
 	zconf_switch_to_buffer(zconf_create_buffer(zconfin,YY_BUF_SIZE));
 	buf->parent = current_buf;
 	buf->parent = current_buf;
 	current_buf = buf;
 	current_buf = buf;
 
 
-	if (file->flags & FILE_BUSY) {
-		printf("%s:%d: do not source '%s' from itself\n",
-		       zconf_curname(), zconf_lineno(), name);
-		exit(1);
-	}
-	if (file->flags & FILE_SCANNED) {
-		printf("%s:%d: file '%s' is already sourced from '%s'\n",
-		       zconf_curname(), zconf_lineno(), name,
-		       file->parent->name);
-		exit(1);
+	for (iter = current_file->parent; iter; iter = iter->parent ) {
+		if (!strcmp(current_file->name,iter->name) ) {
+			printf("%s:%d: recursive inclusion detected. "
+			       "Inclusion path:\n  current file : '%s'\n",
+			       zconf_curname(), zconf_lineno(),
+			       zconf_curname());
+			iter = current_file->parent;
+			while (iter && \
+			       strcmp(iter->name,current_file->name)) {
+				printf("  included from: '%s:%d'\n",
+				       iter->name, iter->lineno-1);
+				iter = iter->parent;
+			}
+			if (iter)
+				printf("  included from: '%s:%d'\n",
+				       iter->name, iter->lineno+1);
+			exit(1);
+		}
 	}
 	}
-	file->flags |= FILE_BUSY;
 	file->lineno = 1;
 	file->lineno = 1;
 	file->parent = current_file;
 	file->parent = current_file;
 	current_file = file;
 	current_file = file;
@@ -2390,8 +2463,6 @@ static void zconf_endfile(void)
 {
 {
 	struct buffer *parent;
 	struct buffer *parent;
 
 
-	current_file->flags |= FILE_SCANNED;
-	current_file->flags &= ~FILE_BUSY;
 	current_file = current_file->parent;
 	current_file = current_file->parent;
 
 
 	parent = current_buf->parent;
 	parent = current_buf->parent;
@@ -2409,7 +2480,7 @@ int zconf_lineno(void)
 	return current_pos.lineno;
 	return current_pos.lineno;
 }
 }
 
 
-char *zconf_curname(void)
+const char *zconf_curname(void)
 {
 {
 	return current_pos.file ? current_pos.file->name : "<none>";
 	return current_pos.file ? current_pos.file->name : "<none>";
 }
 }

+ 1 - 0
adk/config/lkc.h

@@ -117,6 +117,7 @@ struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *e
 struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep);
 struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep);
 void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
 void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
 void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
 void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
+void menu_add_select(struct symbol *sym, struct expr *value, struct expr *dep);
 void menu_add_option(int token, char *arg);
 void menu_add_option(int token, char *arg);
 void menu_finalize(struct menu *parent);
 void menu_finalize(struct menu *parent);
 void menu_set_type(int type);
 void menu_set_type(int type);

+ 61 - 9
adk/config/menu.c

@@ -196,6 +196,14 @@ void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep)
 	menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep);
 	menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep);
 }
 }
 
 
+void menu_add_select(struct symbol *sym, struct expr *value, struct expr *dep)
+{
+	struct property *p;
+
+	p = menu_add_prop(P_SELECT, NULL, expr_alloc_symbol(sym), dep);
+	p->value = value;
+}
+
 void menu_add_option(int token, char *arg)
 void menu_add_option(int token, char *arg)
 {
 {
 	switch (token) {
 	switch (token) {
@@ -257,13 +265,22 @@ static void sym_check_prop(struct symbol *sym)
 				prop_warn(prop,
 				prop_warn(prop,
 				    "config symbol '%s' uses select, but is "
 				    "config symbol '%s' uses select, but is "
 				    "not boolean or tristate", sym->name);
 				    "not boolean or tristate", sym->name);
-			else if (sym2->type != S_UNKNOWN &&
+			else if (prop->value == NULL &&
+			  	 sym2->type != S_UNKNOWN &&
 				 sym2->type != S_BOOLEAN &&
 				 sym2->type != S_BOOLEAN &&
 				 sym2->type != S_TRISTATE)
 				 sym2->type != S_TRISTATE)
 				prop_warn(prop,
 				prop_warn(prop,
-				    "'%s' has wrong type. 'select' only "
-				    "accept arguments of boolean and "
-				    "tristate type", sym2->name);
+				    "'%s' has wrong type. 'select' without a "
+				    "value only accepts arguments of boolean "
+				    "and tristate type", sym2->name);
+			else if (prop->value != NULL &&
+				 (sym2->type == S_INT ||
+				  sym2->type == S_HEX ||
+				  sym2->type == S_STRING) &&
+				 prop->value->type != E_SYMBOL)
+				prop_warn(prop,
+				    "select value for config symbol '%s'"
+				    " must be a single symbol", sym2->name);
 			break;
 			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)
@@ -279,6 +296,25 @@ static void sym_check_prop(struct symbol *sym)
 	}
 	}
 }
 }
 
 
+static void finalize_select(struct symbol *sym, struct property *prop,
+		struct expr *dep)
+{
+	struct symbol *es = prop_get_symbol(prop);
+	struct expr_select_value *esv;
+
+	if (prop->value) {
+		esv = malloc(sizeof *esv);
+		esv->expr = expr_alloc_and(expr_alloc_symbol(sym),
+				expr_copy(dep));
+		esv->value = prop->value;
+		esv->next = es->val_dep;
+		es->val_dep = esv;
+	} else {
+		es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr,
+			expr_alloc_and(expr_alloc_symbol(sym), expr_copy(dep)));
+	}
+}
+
 void menu_finalize(struct menu *parent)
 void menu_finalize(struct menu *parent)
 {
 {
 	struct menu *menu, *last_menu;
 	struct menu *menu, *last_menu;
@@ -329,11 +365,8 @@ void menu_finalize(struct menu *parent)
 				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);
 				prop->visible.expr = dep;
 				prop->visible.expr = dep;
-				if (prop->type == P_SELECT) {
-					struct symbol *es = prop_get_symbol(prop);
-					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_SELECT)
+					finalize_select(menu->sym, prop, dep);
 			}
 			}
 		}
 		}
 		for (menu = parent->list; menu; menu = menu->next)
 		for (menu = parent->list; menu; menu = menu->next)
@@ -437,9 +470,15 @@ void menu_finalize(struct menu *parent)
 	}
 	}
 
 
 	if (sym && !sym_is_optional(sym) && parent->prompt) {
 	if (sym && !sym_is_optional(sym) && parent->prompt) {
+		struct expr_select_value *esv;
+
 		sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr,
 		sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr,
 				expr_alloc_and(parent->prompt->visible.expr,
 				expr_alloc_and(parent->prompt->visible.expr,
 					expr_alloc_symbol(&symbol_mod)));
 					expr_alloc_symbol(&symbol_mod)));
+		for (esv = sym->val_dep; esv; esv = esv->next)
+			esv->expr = expr_alloc_or(esv->expr,
+				expr_alloc_and(parent->prompt->visible.expr,
+					expr_alloc_symbol(&symbol_mod)));
 	}
 	}
 }
 }
 
 
@@ -620,6 +659,7 @@ void get_symbol_str(struct gstr *r, struct symbol *sym,
 {
 {
 	bool hit;
 	bool hit;
 	struct property *prop;
 	struct property *prop;
+	struct expr_select_value *esv;
 
 
 	if (sym && sym->name) {
 	if (sym && sym->name) {
 		str_printf(r, "Symbol: %s [=%s]\n", sym->name,
 		str_printf(r, "Symbol: %s [=%s]\n", sym->name,
@@ -656,6 +696,11 @@ void get_symbol_str(struct gstr *r, struct symbol *sym,
 		} else
 		} else
 			str_printf(r, " && ");
 			str_printf(r, " && ");
 		expr_gstr_print(prop->expr, r);
 		expr_gstr_print(prop->expr, r);
+		if (prop->value) {
+			str_printf(r, " (value=");
+			expr_gstr_print(prop->value, r);
+			str_printf(r, ")");
+		}
 	}
 	}
 	if (hit)
 	if (hit)
 		str_append(r, "\n");
 		str_append(r, "\n");
@@ -664,6 +709,13 @@ void get_symbol_str(struct gstr *r, struct symbol *sym,
 		expr_gstr_print(sym->rev_dep.expr, r);
 		expr_gstr_print(sym->rev_dep.expr, r);
 		str_append(r, "\n");
 		str_append(r, "\n");
 	}
 	}
+	for (esv = sym->val_dep; esv; esv = esv->next) {
+		str_append(r, "  Selected by: ");
+		expr_gstr_print(esv->expr, r);
+		str_append(r, " with value: ");
+		expr_gstr_print(esv->value, r);
+		str_append(r, "\n");
+	}
 	str_append(r, "\n\n");
 	str_append(r, "\n\n");
 }
 }
 
 

+ 73 - 15
adk/config/symbol.c

@@ -190,6 +190,7 @@ static void sym_calc_visibility(struct symbol *sym)
 {
 {
 	struct property *prop;
 	struct property *prop;
 	tristate tri;
 	tristate tri;
+	struct expr_select_value *esv;
 
 
 	/* any prompt visible? */
 	/* any prompt visible? */
 	tri = no;
 	tri = no;
@@ -222,6 +223,15 @@ static void sym_calc_visibility(struct symbol *sym)
 		sym->rev_dep.tri = tri;
 		sym->rev_dep.tri = tri;
 		sym_set_changed(sym);
 		sym_set_changed(sym);
 	}
 	}
+	for (esv = sym->val_dep; esv; esv = esv->next) {
+		tri = expr_calc_value(esv->expr);
+		if (tri == mod && sym_get_type(sym) == S_BOOLEAN)
+			tri = yes;
+		if (esv->tri != tri) {
+			esv->tri = tri;
+			sym_set_changed(sym);
+		}
+	}
 }
 }
 
 
 /*
 /*
@@ -307,6 +317,8 @@ void sym_calc_value(struct symbol *sym)
 	struct symbol_value newval, oldval;
 	struct symbol_value newval, oldval;
 	struct property *prop;
 	struct property *prop;
 	struct expr *e;
 	struct expr *e;
+	struct expr_select_value *esv;
+	int got_sel_val;
 
 
 	if (!sym)
 	if (!sym)
 		return;
 		return;
@@ -368,6 +380,9 @@ void sym_calc_value(struct symbol *sym)
 			}
 			}
 			if (sym->rev_dep.tri != no)
 			if (sym->rev_dep.tri != no)
 				sym->flags |= SYMBOL_WRITE;
 				sym->flags |= SYMBOL_WRITE;
+			for (esv = sym->val_dep; esv; esv = esv->next)
+				if (esv->tri != no)
+					sym->flags |= SYMBOL_WRITE;
 			if (!sym_is_choice(sym)) {
 			if (!sym_is_choice(sym)) {
 				prop = sym_get_default_prop(sym);
 				prop = sym_get_default_prop(sym);
 				if (prop) {
 				if (prop) {
@@ -377,19 +392,34 @@ void sym_calc_value(struct symbol *sym)
 				}
 				}
 			}
 			}
 		calc_newval:
 		calc_newval:
-			if (sym->dir_dep.tri == no && sym->rev_dep.tri != no) {
-				struct expr *e;
-				e = expr_simplify_unmet_dep(sym->rev_dep.expr,
-				    sym->dir_dep.expr);
-				fprintf(stderr, "warning: (");
-				expr_fprint(e, stderr);
-				fprintf(stderr, ") selects %s which has unmet direct dependencies (",
-					sym->name);
-				expr_fprint(sym->dir_dep.expr, stderr);
-				fprintf(stderr, ")\n");
-				expr_free(e);
+			if (sym->dir_dep.tri == no) {
+				if (sym->rev_dep.tri != no) {
+					fprintf(stderr, "warning: (");
+					expr_fprint(sym->rev_dep.expr, stderr);
+					fprintf(stderr, ") selects %s which has unmet direct dependencies (",
+						sym->name);
+					expr_fprint(sym->dir_dep.expr, stderr);
+					fprintf(stderr, ")\n");
+				}
+				for (esv = sym->val_dep; esv; esv = esv->next) {
+					if ((esv->tri != no) &&
+					    (expr_calc_value(esv->value) != no)) {
+						fprintf(stderr, "warning: (");
+						expr_fprint(esv->expr, stderr);
+						fprintf(stderr, ") selects %s (with value ",
+							sym->name);
+						expr_fprint(esv->value, stderr);
+						fprintf(stderr, ") which has unmet direct dependencies (");
+						expr_fprint(sym->dir_dep.expr, stderr);
+						fprintf(stderr, ")\n");
+					}
+				}
 			}
 			}
-			newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri);
+ 			newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri);
+			for (esv = sym->val_dep; esv; esv = esv->next)
+				if (esv->tri != no)
+					newval.tri = EXPR_OR(newval.tri,
+						expr_calc_value(esv->value));
 		}
 		}
 		if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN)
 		if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN)
 			newval.tri = yes;
 			newval.tri = yes;
@@ -404,6 +434,23 @@ void sym_calc_value(struct symbol *sym)
 				break;
 				break;
 			}
 			}
 		}
 		}
+		got_sel_val = 0;
+		for (esv = sym->val_dep; esv; esv = esv->next) {
+			if (esv->tri != no) {
+				struct symbol *ss = esv->value->left.sym;
+
+				if (got_sel_val) {
+					/* warn of more than one value selected */
+				} else {
+					sym->flags |= SYMBOL_WRITE;
+					sym_calc_value(ss);
+					newval.val = ss->curr.val;
+					got_sel_val = 1;
+				}
+			}
+		}
+		if (got_sel_val)
+			break;
 		prop = sym_get_default_prop(sym);
 		prop = sym_get_default_prop(sym);
 		if (prop) {
 		if (prop) {
 			struct symbol *ds = prop_get_symbol(prop);
 			struct symbol *ds = prop_get_symbol(prop);
@@ -486,6 +533,8 @@ void sym_set_all_changed(void)
 bool sym_tristate_within_range(struct symbol *sym, tristate val)
 bool sym_tristate_within_range(struct symbol *sym, tristate val)
 {
 {
 	int type = sym_get_type(sym);
 	int type = sym_get_type(sym);
+	struct expr_select_value *esv;
+	tristate tri;
 
 
 	if (sym->visible == no)
 	if (sym->visible == no)
 		return false;
 		return false;
@@ -495,11 +544,14 @@ bool sym_tristate_within_range(struct symbol *sym, tristate val)
 
 
 	if (type == S_BOOLEAN && val == mod)
 	if (type == S_BOOLEAN && val == mod)
 		return false;
 		return false;
-	if (sym->visible <= sym->rev_dep.tri)
+	tri = sym->rev_dep.tri;
+	for (esv = sym->val_dep; esv; esv = esv->next)
+		tri = EXPR_OR(tri, esv->tri);
+	if (sym->visible <= tri)
 		return false;
 		return false;
 	if (sym_is_choice_value(sym) && sym->visible == yes)
 	if (sym_is_choice_value(sym) && sym->visible == yes)
 		return val == yes;
 		return val == yes;
-	return val >= sym->rev_dep.tri && val <= sym->visible;
+	return val >= tri && val <= sym->visible;
 }
 }
 
 
 bool sym_set_tristate_value(struct symbol *sym, tristate val)
 bool sym_set_tristate_value(struct symbol *sym, tristate val)
@@ -795,7 +847,13 @@ const char *sym_get_string_value(struct symbol *sym)
 
 
 bool sym_is_changable(struct symbol *sym)
 bool sym_is_changable(struct symbol *sym)
 {
 {
-	return sym->visible > sym->rev_dep.tri;
+	tristate tri = sym->rev_dep.tri;
+	struct expr_select_value *esv;
+
+	for (esv = sym->val_dep; esv; esv = esv->next)
+		tri = EXPR_OR(tri, esv->tri);
+
+	return sym->visible > tri;
 }
 }
 
 
 static unsigned strhash(const char *s)
 static unsigned strhash(const char *s)

+ 148 - 155
adk/config/zconf.hash.c_shipped

@@ -1,5 +1,5 @@
-/* ANSI-C code produced by gperf version 3.0.4 */
-/* Command-line: gperf -t --output-file scripts/kconfig/zconf.hash.c_shipped -a -C -E -g -k '1,3,$' -p -t scripts/kconfig/zconf.gperf  */
+/* ANSI-C code produced by gperf version 3.0.3 */
+/* Command-line: gperf -t --output-file zconf.hash.c -a -C -E -g -k 1,3, -p -t zconf.gperf  */
 
 
 #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
 #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
       && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
       && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
@@ -28,11 +28,11 @@
 #error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
 #error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
 #endif
 #endif
 
 
-#line 10 "scripts/kconfig/zconf.gperf"
+#line 10 "zconf.gperf"
 struct kconf_id;
 struct kconf_id;
 
 
 static const struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len);
 static const struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len);
-/* maximum key range = 71, duplicates = 0 */
+/* maximum key range = 50, duplicates = 0 */
 
 
 #ifdef __GNUC__
 #ifdef __GNUC__
 __inline
 __inline
@@ -46,32 +46,32 @@ kconf_id_hash (register const char *str, register unsigned int len)
 {
 {
   static const unsigned char asso_values[] =
   static const unsigned char asso_values[] =
     {
     {
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73,  5, 25, 25,
-       0,  0,  0,  5,  0,  0, 73, 73,  5,  0,
-      10,  5, 45, 73, 20, 20,  0, 15, 15, 73,
-      20,  5, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 10, 40,  5,
+       0,  0,  5, 52,  0, 20, 52, 52, 10, 20,
+       5,  0, 35, 52,  0, 30,  0, 15,  0, 52,
+      15, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+      52, 52, 52, 52, 52, 52
     };
     };
   register int hval = len;
   register int hval = len;
 
 
@@ -85,85 +85,85 @@ kconf_id_hash (register const char *str, register unsigned int len)
         hval += asso_values[(unsigned char)str[0]];
         hval += asso_values[(unsigned char)str[0]];
         break;
         break;
     }
     }
-  return hval + asso_values[(unsigned char)str[len - 1]];
+  return hval;
 }
 }
 
 
 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_str2[sizeof("on")];
+    char kconf_id_strings_str3[sizeof("env")];
     char kconf_id_strings_str5[sizeof("endif")];
     char kconf_id_strings_str5[sizeof("endif")];
-    char kconf_id_strings_str7[sizeof("default")];
-    char kconf_id_strings_str8[sizeof("tristate")];
+    char kconf_id_strings_str6[sizeof("option")];
+    char kconf_id_strings_str7[sizeof("endmenu")];
+    char kconf_id_strings_str8[sizeof("optional")];
     char kconf_id_strings_str9[sizeof("endchoice")];
     char kconf_id_strings_str9[sizeof("endchoice")];
-    char kconf_id_strings_str12[sizeof("def_tristate")];
+    char kconf_id_strings_str10[sizeof("range")];
+    char kconf_id_strings_str11[sizeof("choice")];
+    char kconf_id_strings_str12[sizeof("default")];
     char kconf_id_strings_str13[sizeof("def_bool")];
     char kconf_id_strings_str13[sizeof("def_bool")];
-    char kconf_id_strings_str14[sizeof("defconfig_list")];
-    char kconf_id_strings_str17[sizeof("on")];
-    char kconf_id_strings_str18[sizeof("optional")];
-    char kconf_id_strings_str21[sizeof("option")];
-    char kconf_id_strings_str22[sizeof("endmenu")];
-    char kconf_id_strings_str23[sizeof("mainmenu")];
-    char kconf_id_strings_str25[sizeof("menuconfig")];
+    char kconf_id_strings_str14[sizeof("help")];
+    char kconf_id_strings_str16[sizeof("config")];
+    char kconf_id_strings_str17[sizeof("def_tristate")];
+    char kconf_id_strings_str18[sizeof("hex")];
+    char kconf_id_strings_str19[sizeof("defconfig_list")];
+    char kconf_id_strings_str22[sizeof("if")];
+    char kconf_id_strings_str23[sizeof("int")];
     char kconf_id_strings_str27[sizeof("modules")];
     char kconf_id_strings_str27[sizeof("modules")];
-    char kconf_id_strings_str28[sizeof("allnoconfig_y")];
+    char kconf_id_strings_str28[sizeof("tristate")];
     char kconf_id_strings_str29[sizeof("menu")];
     char kconf_id_strings_str29[sizeof("menu")];
-    char kconf_id_strings_str31[sizeof("select")];
     char kconf_id_strings_str32[sizeof("comment")];
     char kconf_id_strings_str32[sizeof("comment")];
-    char kconf_id_strings_str33[sizeof("env")];
-    char kconf_id_strings_str35[sizeof("range")];
-    char kconf_id_strings_str36[sizeof("choice")];
-    char kconf_id_strings_str39[sizeof("bool")];
-    char kconf_id_strings_str41[sizeof("source")];
-    char kconf_id_strings_str42[sizeof("visible")];
-    char kconf_id_strings_str43[sizeof("hex")];
-    char kconf_id_strings_str46[sizeof("config")];
+    char kconf_id_strings_str33[sizeof("allnoconfig_y")];
+    char kconf_id_strings_str35[sizeof("menuconfig")];
+    char kconf_id_strings_str36[sizeof("string")];
+    char kconf_id_strings_str37[sizeof("visible")];
+    char kconf_id_strings_str41[sizeof("prompt")];
+    char kconf_id_strings_str42[sizeof("depends")];
+    char kconf_id_strings_str44[sizeof("bool")];
+    char kconf_id_strings_str46[sizeof("select")];
     char kconf_id_strings_str47[sizeof("boolean")];
     char kconf_id_strings_str47[sizeof("boolean")];
-    char kconf_id_strings_str51[sizeof("string")];
-    char kconf_id_strings_str54[sizeof("help")];
-    char kconf_id_strings_str56[sizeof("prompt")];
-    char kconf_id_strings_str72[sizeof("depends")];
+    char kconf_id_strings_str48[sizeof("mainmenu")];
+    char kconf_id_strings_str51[sizeof("source")];
   };
   };
 static const struct kconf_id_strings_t kconf_id_strings_contents =
 static const struct kconf_id_strings_t kconf_id_strings_contents =
   {
   {
-    "if",
-    "int",
+    "on",
+    "env",
     "endif",
     "endif",
-    "default",
-    "tristate",
+    "option",
+    "endmenu",
+    "optional",
     "endchoice",
     "endchoice",
-    "def_tristate",
+    "range",
+    "choice",
+    "default",
     "def_bool",
     "def_bool",
+    "help",
+    "config",
+    "def_tristate",
+    "hex",
     "defconfig_list",
     "defconfig_list",
-    "on",
-    "optional",
-    "option",
-    "endmenu",
-    "mainmenu",
-    "menuconfig",
+    "if",
+    "int",
     "modules",
     "modules",
-    "allnoconfig_y",
+    "tristate",
     "menu",
     "menu",
-    "select",
     "comment",
     "comment",
-    "env",
-    "range",
-    "choice",
-    "bool",
-    "source",
-    "visible",
-    "hex",
-    "config",
-    "boolean",
+    "allnoconfig_y",
+    "menuconfig",
     "string",
     "string",
-    "help",
+    "visible",
     "prompt",
     "prompt",
-    "depends"
+    "depends",
+    "bool",
+    "select",
+    "boolean",
+    "mainmenu",
+    "source"
   };
   };
 #define kconf_id_strings ((const char *) &kconf_id_strings_contents)
 #define kconf_id_strings ((const char *) &kconf_id_strings_contents)
 #ifdef __GNUC__
 #ifdef __GNUC__
 __inline
 __inline
-#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
+#ifdef __GNUC_STDC_INLINE__
 __attribute__ ((__gnu_inline__))
 __attribute__ ((__gnu_inline__))
 #endif
 #endif
 #endif
 #endif
@@ -176,95 +176,88 @@ kconf_id_lookup (register const char *str, register unsigned int len)
       MIN_WORD_LENGTH = 2,
       MIN_WORD_LENGTH = 2,
       MAX_WORD_LENGTH = 14,
       MAX_WORD_LENGTH = 14,
       MIN_HASH_VALUE = 2,
       MIN_HASH_VALUE = 2,
-      MAX_HASH_VALUE = 72
+      MAX_HASH_VALUE = 51
     };
     };
 
 
   static const struct kconf_id wordlist[] =
   static const struct kconf_id wordlist[] =
     {
     {
       {-1}, {-1},
       {-1}, {-1},
-#line 25 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2,		T_IF,		TF_COMMAND|TF_PARAM},
-#line 36 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str3,		T_TYPE,		TF_COMMAND, S_INT},
+#line 43 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2,		T_ON,		TF_PARAM},
+#line 46 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str3,		T_OPT_ENV,	TF_OPTION},
       {-1},
       {-1},
-#line 26 "scripts/kconfig/zconf.gperf"
+#line 26 "zconf.gperf"
       {(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_str5,		T_ENDIF,	TF_COMMAND},
-      {-1},
-#line 29 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7,	T_DEFAULT,	TF_COMMAND, S_UNKNOWN},
-#line 31 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8,	T_TYPE,		TF_COMMAND, S_TRISTATE},
-#line 20 "scripts/kconfig/zconf.gperf"
+#line 42 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str6,		T_OPTION,	TF_COMMAND},
+#line 17 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7,	T_ENDMENU,	TF_COMMAND},
+#line 28 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8,	T_OPTIONAL,	TF_COMMAND},
+#line 20 "zconf.gperf"
       {(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_str9,	T_ENDCHOICE,	TF_COMMAND},
-      {-1}, {-1},
-#line 32 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12,	T_DEFAULT,	TF_COMMAND, S_TRISTATE},
-#line 35 "scripts/kconfig/zconf.gperf"
+#line 40 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str10,		T_RANGE,	TF_COMMAND},
+#line 19 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str11,		T_CHOICE,	TF_COMMAND},
+#line 29 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12,	T_DEFAULT,	TF_COMMAND, S_UNKNOWN},
+#line 35 "zconf.gperf"
       {(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_str13,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN},
-#line 45 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14,	T_OPT_DEFCONFIG_LIST,TF_OPTION},
-      {-1}, {-1},
-#line 43 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17,		T_ON,		TF_PARAM},
-#line 28 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18,	T_OPTIONAL,	TF_COMMAND},
-      {-1}, {-1},
-#line 42 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21,		T_OPTION,	TF_COMMAND},
-#line 17 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22,	T_ENDMENU,	TF_COMMAND},
-#line 15 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23,	T_MAINMENU,	TF_COMMAND},
-      {-1},
-#line 23 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str25,	T_MENUCONFIG,	TF_COMMAND},
+#line 24 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14,		T_HELP,		TF_COMMAND},
       {-1},
       {-1},
-#line 44 "scripts/kconfig/zconf.gperf"
+#line 22 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str16,		T_CONFIG,	TF_COMMAND},
+#line 32 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17,	T_DEFAULT,	TF_COMMAND, S_TRISTATE},
+#line 37 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18,		T_TYPE,		TF_COMMAND, S_HEX},
+#line 45 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str19,	T_OPT_DEFCONFIG_LIST,TF_OPTION},
+      {-1}, {-1},
+#line 25 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22,		T_IF,		TF_COMMAND|TF_PARAM},
+#line 36 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23,		T_TYPE,		TF_COMMAND, S_INT},
+      {-1}, {-1}, {-1},
+#line 44 "zconf.gperf"
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27,	T_OPT_MODULES,	TF_OPTION},
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27,	T_OPT_MODULES,	TF_OPTION},
-#line 47 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28,	T_OPT_ALLNOCONFIG_Y,TF_OPTION},
-#line 16 "scripts/kconfig/zconf.gperf"
+#line 31 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28,	T_TYPE,		TF_COMMAND, S_TRISTATE},
+#line 16 "zconf.gperf"
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str29,		T_MENU,		TF_COMMAND},
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str29,		T_MENU,		TF_COMMAND},
-      {-1},
-#line 39 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31,		T_SELECT,	TF_COMMAND},
-#line 21 "scripts/kconfig/zconf.gperf"
+      {-1}, {-1},
+#line 21 "zconf.gperf"
       {(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},
-#line 46 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33,		T_OPT_ENV,	TF_OPTION},
+#line 47 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33,	T_OPT_ALLNOCONFIG_Y,TF_OPTION},
       {-1},
       {-1},
-#line 40 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str35,		T_RANGE,	TF_COMMAND},
-#line 19 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str36,		T_CHOICE,	TF_COMMAND},
-      {-1}, {-1},
-#line 33 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str39,		T_TYPE,		TF_COMMAND, S_BOOLEAN},
+#line 23 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str35,	T_MENUCONFIG,	TF_COMMAND},
+#line 38 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str36,		T_TYPE,		TF_COMMAND, S_STRING},
+#line 41 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str37,	T_VISIBLE,	TF_COMMAND},
+      {-1}, {-1}, {-1},
+#line 30 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41,		T_PROMPT,	TF_COMMAND},
+#line 27 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str42,	T_DEPENDS,	TF_COMMAND},
       {-1},
       {-1},
-#line 18 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41,		T_SOURCE,	TF_COMMAND},
-#line 41 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str42,	T_VISIBLE,	TF_COMMAND},
-#line 37 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str43,		T_TYPE,		TF_COMMAND, S_HEX},
-      {-1}, {-1},
-#line 22 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46,		T_CONFIG,	TF_COMMAND},
-#line 34 "scripts/kconfig/zconf.gperf"
+#line 33 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str44,		T_TYPE,		TF_COMMAND, S_BOOLEAN},
+      {-1},
+#line 39 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46,		T_SELECT,	TF_COMMAND},
+#line 34 "zconf.gperf"
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str47,	T_TYPE,		TF_COMMAND, S_BOOLEAN},
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str47,	T_TYPE,		TF_COMMAND, S_BOOLEAN},
-      {-1}, {-1}, {-1},
-#line 38 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str51,		T_TYPE,		TF_COMMAND, S_STRING},
+#line 15 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str48,	T_MAINMENU,	TF_COMMAND},
       {-1}, {-1},
       {-1}, {-1},
-#line 24 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str54,		T_HELP,		TF_COMMAND},
-      {-1},
-#line 30 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str56,		T_PROMPT,	TF_COMMAND},
-      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
-      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
-#line 27 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str72,	T_DEPENDS,	TF_COMMAND}
+#line 18 "zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str51,		T_SOURCE,	TF_COMMAND}
     };
     };
 
 
   if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
   if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
@@ -285,5 +278,5 @@ kconf_id_lookup (register const char *str, register unsigned int len)
     }
     }
   return 0;
   return 0;
 }
 }
-#line 48 "scripts/kconfig/zconf.gperf"
+#line 48 "zconf.gperf"
 
 

File diff suppressed because it is too large
+ 338 - 194
adk/config/zconf.tab.c_shipped


+ 39 - 68
adk/config/zconf.tab.h_shipped

@@ -1,24 +1,21 @@
-/* A Bison parser, made by GNU Bison 2.3.  */
+/* A Bison parser, made by GNU Bison 2.5.  */
 
 
-/* Skeleton interface for Bison's Yacc-like parsers in C
-
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-   Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
+/* Bison interface for Yacc-like parsers in C
+   
+      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+   
+   This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+   
    This program is distributed in the hope that it will be useful,
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    GNU General Public License for more details.
-
+   
    You should have received a copy of the GNU General Public License
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
 /* As a special exception, you may create a larger work that contains
 /* As a special exception, you may create a larger work that contains
    part or all of the Bison parser skeleton and distribute that work
    part or all of the Bison parser skeleton and distribute that work
@@ -29,10 +26,11 @@
    special exception, which will cause the skeleton and the resulting
    special exception, which will cause the skeleton and the resulting
    Bison output files to be licensed under the GNU General Public
    Bison output files to be licensed under the GNU General Public
    License without this special exception.
    License without this special exception.
-
+   
    This special exception was added by the Free Software Foundation in
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
    version 2.2 of Bison.  */
 
 
+
 /* Tokens.  */
 /* Tokens.  */
 #ifndef YYTOKENTYPE
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
 # define YYTOKENTYPE
@@ -59,75 +57,48 @@
      T_DEFAULT = 275,
      T_DEFAULT = 275,
      T_SELECT = 276,
      T_SELECT = 276,
      T_RANGE = 277,
      T_RANGE = 277,
-     T_OPTION = 278,
-     T_ON = 279,
-     T_WORD = 280,
-     T_WORD_QUOTE = 281,
-     T_UNEQUAL = 282,
-     T_CLOSE_PAREN = 283,
-     T_OPEN_PAREN = 284,
-     T_EOL = 285,
-     T_OR = 286,
-     T_AND = 287,
-     T_EQUAL = 288,
-     T_NOT = 289
+     T_VISIBLE = 278,
+     T_OPTION = 279,
+     T_ON = 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
    };
    };
 #endif
 #endif
-/* Tokens.  */
-#define T_MAINMENU 258
-#define T_MENU 259
-#define T_ENDMENU 260
-#define T_SOURCE 261
-#define T_CHOICE 262
-#define T_ENDCHOICE 263
-#define T_COMMENT 264
-#define T_CONFIG 265
-#define T_MENUCONFIG 266
-#define T_HELP 267
-#define T_HELPTEXT 268
-#define T_IF 269
-#define T_ENDIF 270
-#define T_DEPENDS 271
-#define T_OPTIONAL 272
-#define T_PROMPT 273
-#define T_TYPE 274
-#define T_DEFAULT 275
-#define T_SELECT 276
-#define T_RANGE 277
-#define T_OPTION 278
-#define T_ON 279
-#define T_WORD 280
-#define T_WORD_QUOTE 281
-#define T_UNEQUAL 282
-#define T_CLOSE_PAREN 283
-#define T_OPEN_PAREN 284
-#define T_EOL 285
-#define T_OR 286
-#define T_AND 287
-#define T_EQUAL 288
-#define T_NOT 289
-
 
 
 
 
 
 
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
 typedef union YYSTYPE
-#line 44 "zconf.y"
 {
 {
+
+/* Line 2068 of yacc.c  */
+#line 37 "zconf.y"
+
 	char *string;
 	char *string;
 	struct file *file;
 	struct file *file;
 	struct symbol *symbol;
 	struct symbol *symbol;
 	struct expr *expr;
 	struct expr *expr;
 	struct menu *menu;
 	struct menu *menu;
-	struct kconf_id *id;
-}
-/* Line 1489 of yacc.c.  */
-#line 126 "zconf.tab.h"
-	YYSTYPE;
+	const struct kconf_id *id;
+
+
+
+/* Line 2068 of yacc.c  */
+#line 96 "zconf.tab.h"
+} YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
 #endif
 #endif
 
 
 extern YYSTYPE zconflval;
 extern YYSTYPE zconflval;
 
 
+

+ 16 - 1
adk/config/zconf.y

@@ -207,10 +207,16 @@ config_option: T_DEFAULT expr if_expr T_EOL
 
 
 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_select(sym_lookup($2, 0), NULL, $3);
 	printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
 	printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
 };
 };
 
 
+config_option: T_SELECT T_WORD expr if_expr T_EOL
+{
+	menu_add_select(sym_lookup($2, 0), $3, $4);
+	printd(DEBUG_PARSE, "%s:%d:select with value\n", zconf_curname(), zconf_lineno());
+};
+
 config_option: T_RANGE symbol symbol if_expr T_EOL
 config_option: T_RANGE symbol symbol if_expr T_EOL
 {
 {
 	menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
 	menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
@@ -653,6 +659,15 @@ static void print_symbol(FILE *out, struct menu *menu)
 		case P_SELECT:
 		case P_SELECT:
 			fputs( "  select ", out);
 			fputs( "  select ", out);
 			expr_fprint(prop->expr, out);
 			expr_fprint(prop->expr, out);
+			if (prop->value) {
+				fputs(" (value=", out);
+				expr_fprint(prop->value, out);
+				fputc(')', out);
+			}
+			if (!expr_is_yes(prop->visible.expr)) {
+				fputs(" if ", out);
+				expr_fprint(prop->visible.expr, out);
+			}
 			fputc('\n', out);
 			fputc('\n', out);
 			break;
 			break;
 		case P_RANGE:
 		case P_RANGE:

+ 2 - 0
target/appliances/mpd

@@ -56,6 +56,8 @@ config ADK_APPLIANCE_MPD
 	select ADK_KERNEL_INPUT_KEYBOARD
 	select ADK_KERNEL_INPUT_KEYBOARD
 	select ADK_KERNEL_INPUT_MOUSE
 	select ADK_KERNEL_INPUT_MOUSE
 	select ADK_KERNEL_INPUT_EVDEV
 	select ADK_KERNEL_INPUT_EVDEV
+	select ADK_RUNTIME_HOSTNAME mpdbox
+	select ADK_KERNEL_USB_STORAGE m
 	help
 	help
 	  Create a small music player daemon appliance.
 	  Create a small music player daemon appliance.
 
 

Some files were not shown because too many files changed in this diff