forked from mirrors/linux
		
	[PATCH] kconfig: use gperf for kconfig keywords
Use gperf to generate a hash for the kconfig keywords. This greatly reduces the size of the generated scanner and makes it easier to extend kconfig. Signed-off-by: Roman Zippel <zippel@linux-m68k.org> Cc: Sam Ravnborg <sam@ravnborg.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
		
							parent
							
								
									491d711035
								
							
						
					
					
						commit
						7a88488bbc
					
				
					 8 changed files with 732 additions and 1777 deletions
				
			
		| 
						 | 
				
			
			@ -114,7 +114,7 @@ gconf-objs	:= gconf.o kconfig_load.o zconf.tab.o
 | 
			
		|||
endif
 | 
			
		||||
 | 
			
		||||
clean-files	:= lkc_defs.h qconf.moc .tmp_qtcheck \
 | 
			
		||||
		   .tmp_gtkcheck zconf.tab.c lex.zconf.c
 | 
			
		||||
		   .tmp_gtkcheck zconf.tab.c lex.zconf.c zconf.hash.c
 | 
			
		||||
 | 
			
		||||
# Needed for systems without gettext
 | 
			
		||||
KBUILD_HAVE_NLS := $(shell \
 | 
			
		||||
| 
						 | 
				
			
			@ -201,7 +201,7 @@ $(obj)/.tmp_gtkcheck:
 | 
			
		|||
	fi
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
$(obj)/zconf.tab.o: $(obj)/lex.zconf.c
 | 
			
		||||
$(obj)/zconf.tab.o: $(obj)/lex.zconf.c $(obj)/zconf.hash.c
 | 
			
		||||
 | 
			
		||||
$(obj)/kconfig_load.o: $(obj)/lkc_defs.h
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -217,7 +217,7 @@ $(obj)/lkc_defs.h: $(src)/lkc_proto.h
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
###
 | 
			
		||||
# The following requires flex/bison
 | 
			
		||||
# The following requires flex/bison/gperf
 | 
			
		||||
# By default we use the _shipped versions, uncomment the following line if
 | 
			
		||||
# you are modifying the flex/bison src.
 | 
			
		||||
# LKC_GENPARSER := 1
 | 
			
		||||
| 
						 | 
				
			
			@ -226,6 +226,7 @@ ifdef LKC_GENPARSER
 | 
			
		|||
 | 
			
		||||
$(obj)/zconf.tab.c: $(src)/zconf.y
 | 
			
		||||
$(obj)/lex.zconf.c: $(src)/zconf.l
 | 
			
		||||
$(obj)/zconf.hash.c: $(src)/zconf.gperf
 | 
			
		||||
 | 
			
		||||
%.tab.c: %.y
 | 
			
		||||
	bison -l -b $* -p $(notdir $*) $<
 | 
			
		||||
| 
						 | 
				
			
			@ -235,4 +236,8 @@ lex.%.c: %.l
 | 
			
		|||
	flex -L -P$(notdir $*) -o$@ $<
 | 
			
		||||
	cp $@ $@_shipped
 | 
			
		||||
 | 
			
		||||
%.hash.c: %.gperf
 | 
			
		||||
	gperf < $< > $@
 | 
			
		||||
	cp $@ $@_shipped
 | 
			
		||||
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -37,6 +37,16 @@ extern "C" {
 | 
			
		|||
#define _(text) gettext(text)
 | 
			
		||||
#define N_(text) (text)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define TF_COMMAND	0x0001
 | 
			
		||||
#define TF_PARAM	0x0002
 | 
			
		||||
 | 
			
		||||
struct kconf_id {
 | 
			
		||||
	int name;
 | 
			
		||||
	int token;
 | 
			
		||||
	unsigned int flags;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int zconfparse(void);
 | 
			
		||||
void zconfdump(FILE *out);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										43
									
								
								scripts/kconfig/zconf.gperf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								scripts/kconfig/zconf.gperf
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,43 @@
 | 
			
		|||
%language=ANSI-C
 | 
			
		||||
%define hash-function-name kconf_id_hash
 | 
			
		||||
%define lookup-function-name kconf_id_lookup
 | 
			
		||||
%define string-pool-name kconf_id_strings
 | 
			
		||||
%compare-strncmp
 | 
			
		||||
%enum
 | 
			
		||||
%pic
 | 
			
		||||
%struct-type
 | 
			
		||||
 | 
			
		||||
struct kconf_id;
 | 
			
		||||
 | 
			
		||||
%%
 | 
			
		||||
mainmenu,	T_MAINMENU,	TF_COMMAND
 | 
			
		||||
menu,		T_MENU,		TF_COMMAND
 | 
			
		||||
endmenu,	T_ENDMENU,	TF_COMMAND
 | 
			
		||||
source,		T_SOURCE,	TF_COMMAND
 | 
			
		||||
choice,		T_CHOICE,	TF_COMMAND
 | 
			
		||||
endchoice,	T_ENDCHOICE,	TF_COMMAND
 | 
			
		||||
comment,	T_COMMENT,	TF_COMMAND
 | 
			
		||||
config,		T_CONFIG,	TF_COMMAND
 | 
			
		||||
menuconfig,	T_MENUCONFIG,	TF_COMMAND
 | 
			
		||||
help,		T_HELP,		TF_COMMAND
 | 
			
		||||
if,		T_IF,		TF_COMMAND|TF_PARAM
 | 
			
		||||
endif,		T_ENDIF,	TF_COMMAND
 | 
			
		||||
depends,	T_DEPENDS,	TF_COMMAND
 | 
			
		||||
requires,	T_REQUIRES,	TF_COMMAND
 | 
			
		||||
optional,	T_OPTIONAL,	TF_COMMAND
 | 
			
		||||
default,	T_DEFAULT,	TF_COMMAND
 | 
			
		||||
prompt,		T_PROMPT,	TF_COMMAND
 | 
			
		||||
tristate,	T_TRISTATE,	TF_COMMAND
 | 
			
		||||
def_tristate,	T_DEF_TRISTATE,	TF_COMMAND
 | 
			
		||||
bool,		T_BOOLEAN,	TF_COMMAND
 | 
			
		||||
boolean,	T_BOOLEAN,	TF_COMMAND
 | 
			
		||||
def_bool,	T_DEF_BOOLEAN,	TF_COMMAND
 | 
			
		||||
def_boolean,	T_DEF_BOOLEAN,	TF_COMMAND
 | 
			
		||||
int,		T_INT,		TF_COMMAND
 | 
			
		||||
hex,		T_HEX,		TF_COMMAND
 | 
			
		||||
string,		T_STRING,	TF_COMMAND
 | 
			
		||||
select,		T_SELECT,	TF_COMMAND
 | 
			
		||||
enable,		T_SELECT,	TF_COMMAND
 | 
			
		||||
range,		T_RANGE,	TF_COMMAND
 | 
			
		||||
on,		T_ON,		TF_PARAM
 | 
			
		||||
%%
 | 
			
		||||
							
								
								
									
										231
									
								
								scripts/kconfig/zconf.hash.c_shipped
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										231
									
								
								scripts/kconfig/zconf.hash.c_shipped
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,231 @@
 | 
			
		|||
/* ANSI-C code produced by gperf version 3.0.1 */
 | 
			
		||||
/* Command-line: gperf  */
 | 
			
		||||
/* Computed positions: -k'1,3' */
 | 
			
		||||
 | 
			
		||||
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
 | 
			
		||||
      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
 | 
			
		||||
      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
 | 
			
		||||
      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
 | 
			
		||||
      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
 | 
			
		||||
      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
 | 
			
		||||
      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
 | 
			
		||||
      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
 | 
			
		||||
      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
 | 
			
		||||
      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
 | 
			
		||||
      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
 | 
			
		||||
      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
 | 
			
		||||
      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
 | 
			
		||||
      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
 | 
			
		||||
      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
 | 
			
		||||
      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
 | 
			
		||||
      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
 | 
			
		||||
      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
 | 
			
		||||
      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
 | 
			
		||||
      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
 | 
			
		||||
      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
 | 
			
		||||
      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
 | 
			
		||||
      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
 | 
			
		||||
/* The character set is not based on ISO-646.  */
 | 
			
		||||
#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
struct kconf_id;
 | 
			
		||||
/* maximum key range = 45, duplicates = 0 */
 | 
			
		||||
 | 
			
		||||
#ifdef __GNUC__
 | 
			
		||||
__inline
 | 
			
		||||
#else
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
inline
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
static unsigned int
 | 
			
		||||
kconf_id_hash (register const char *str, register unsigned int len)
 | 
			
		||||
{
 | 
			
		||||
  static unsigned char asso_values[] =
 | 
			
		||||
    {
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 25, 10, 15,
 | 
			
		||||
       0,  0,  5, 47,  0,  0, 47, 47,  0, 10,
 | 
			
		||||
       0, 20, 20, 20,  5,  0,  0, 20, 47, 47,
 | 
			
		||||
      20, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
			
		||||
      47, 47, 47, 47, 47, 47
 | 
			
		||||
    };
 | 
			
		||||
  register int hval = len;
 | 
			
		||||
 | 
			
		||||
  switch (hval)
 | 
			
		||||
    {
 | 
			
		||||
      default:
 | 
			
		||||
        hval += asso_values[(unsigned char)str[2]];
 | 
			
		||||
      /*FALLTHROUGH*/
 | 
			
		||||
      case 2:
 | 
			
		||||
      case 1:
 | 
			
		||||
        hval += asso_values[(unsigned char)str[0]];
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
  return hval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct kconf_id_strings_t
 | 
			
		||||
  {
 | 
			
		||||
    char kconf_id_strings_str2[sizeof("if")];
 | 
			
		||||
    char kconf_id_strings_str3[sizeof("int")];
 | 
			
		||||
    char kconf_id_strings_str4[sizeof("help")];
 | 
			
		||||
    char kconf_id_strings_str5[sizeof("endif")];
 | 
			
		||||
    char kconf_id_strings_str6[sizeof("select")];
 | 
			
		||||
    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_str11[sizeof("string")];
 | 
			
		||||
    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_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_str26[sizeof("source")];
 | 
			
		||||
    char kconf_id_strings_str27[sizeof("depends")];
 | 
			
		||||
    char kconf_id_strings_str28[sizeof("optional")];
 | 
			
		||||
    char kconf_id_strings_str31[sizeof("enable")];
 | 
			
		||||
    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_str37[sizeof("boolean")];
 | 
			
		||||
    char kconf_id_strings_str41[sizeof("choice")];
 | 
			
		||||
    char kconf_id_strings_str46[sizeof("prompt")];
 | 
			
		||||
  };
 | 
			
		||||
static struct kconf_id_strings_t kconf_id_strings_contents =
 | 
			
		||||
  {
 | 
			
		||||
    "if",
 | 
			
		||||
    "int",
 | 
			
		||||
    "help",
 | 
			
		||||
    "endif",
 | 
			
		||||
    "select",
 | 
			
		||||
    "endmenu",
 | 
			
		||||
    "tristate",
 | 
			
		||||
    "endchoice",
 | 
			
		||||
    "range",
 | 
			
		||||
    "string",
 | 
			
		||||
    "default",
 | 
			
		||||
    "def_bool",
 | 
			
		||||
    "menu",
 | 
			
		||||
    "def_boolean",
 | 
			
		||||
    "def_tristate",
 | 
			
		||||
    "mainmenu",
 | 
			
		||||
    "menuconfig",
 | 
			
		||||
    "config",
 | 
			
		||||
    "on",
 | 
			
		||||
    "hex",
 | 
			
		||||
    "source",
 | 
			
		||||
    "depends",
 | 
			
		||||
    "optional",
 | 
			
		||||
    "enable",
 | 
			
		||||
    "comment",
 | 
			
		||||
    "requires",
 | 
			
		||||
    "bool",
 | 
			
		||||
    "boolean",
 | 
			
		||||
    "choice",
 | 
			
		||||
    "prompt"
 | 
			
		||||
  };
 | 
			
		||||
#define kconf_id_strings ((const char *) &kconf_id_strings_contents)
 | 
			
		||||
#ifdef __GNUC__
 | 
			
		||||
__inline
 | 
			
		||||
#endif
 | 
			
		||||
struct kconf_id *
 | 
			
		||||
kconf_id_lookup (register const char *str, register unsigned int len)
 | 
			
		||||
{
 | 
			
		||||
  enum
 | 
			
		||||
    {
 | 
			
		||||
      TOTAL_KEYWORDS = 30,
 | 
			
		||||
      MIN_WORD_LENGTH = 2,
 | 
			
		||||
      MAX_WORD_LENGTH = 12,
 | 
			
		||||
      MIN_HASH_VALUE = 2,
 | 
			
		||||
      MAX_HASH_VALUE = 46
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
  static struct kconf_id wordlist[] =
 | 
			
		||||
    {
 | 
			
		||||
      {-1}, {-1},
 | 
			
		||||
      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2,		T_IF,		TF_COMMAND|TF_PARAM},
 | 
			
		||||
      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str3,		T_INT,		TF_COMMAND},
 | 
			
		||||
      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str4,		T_HELP,		TF_COMMAND},
 | 
			
		||||
      {(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_TRISTATE,	TF_COMMAND},
 | 
			
		||||
      {(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_str11,		T_STRING,	TF_COMMAND},
 | 
			
		||||
      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12,	T_DEFAULT,	TF_COMMAND},
 | 
			
		||||
      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13,	T_DEF_BOOLEAN,	TF_COMMAND},
 | 
			
		||||
      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14,		T_MENU,		TF_COMMAND},
 | 
			
		||||
      {-1},
 | 
			
		||||
      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str16,	T_DEF_BOOLEAN,	TF_COMMAND},
 | 
			
		||||
      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17,	T_DEF_TRISTATE,	TF_COMMAND},
 | 
			
		||||
      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18,	T_MAINMENU,	TF_COMMAND},
 | 
			
		||||
      {-1},
 | 
			
		||||
      {(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_HEX,		TF_COMMAND},
 | 
			
		||||
      {-1}, {-1},
 | 
			
		||||
      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str26,		T_SOURCE,	TF_COMMAND},
 | 
			
		||||
      {(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},
 | 
			
		||||
      {-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_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_BOOLEAN,	TF_COMMAND},
 | 
			
		||||
      {-1}, {-1},
 | 
			
		||||
      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str37,	T_BOOLEAN,	TF_COMMAND},
 | 
			
		||||
      {-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}
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
 | 
			
		||||
    {
 | 
			
		||||
      register int key = kconf_id_hash (str, len);
 | 
			
		||||
 | 
			
		||||
      if (key <= MAX_HASH_VALUE && key >= 0)
 | 
			
		||||
        {
 | 
			
		||||
          register int o = wordlist[key].name;
 | 
			
		||||
          if (o >= 0)
 | 
			
		||||
            {
 | 
			
		||||
              register const char *s = o + kconf_id_strings;
 | 
			
		||||
 | 
			
		||||
              if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
 | 
			
		||||
                return &wordlist[key];
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -18,8 +18,7 @@
 | 
			
		|||
 | 
			
		||||
#define START_STRSIZE	16
 | 
			
		||||
 | 
			
		||||
char *text;
 | 
			
		||||
static char *text_ptr;
 | 
			
		||||
static char *text;
 | 
			
		||||
static int text_size, text_asize;
 | 
			
		||||
 | 
			
		||||
struct buffer {
 | 
			
		||||
| 
						 | 
				
			
			@ -38,23 +37,22 @@ void new_string(void)
 | 
			
		|||
{
 | 
			
		||||
	text = malloc(START_STRSIZE);
 | 
			
		||||
	text_asize = START_STRSIZE;
 | 
			
		||||
	text_ptr = text;
 | 
			
		||||
	text_size = 0;
 | 
			
		||||
	*text_ptr = 0;
 | 
			
		||||
	*text = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void append_string(const char *str, int size)
 | 
			
		||||
{
 | 
			
		||||
	int new_size = text_size + size + 1;
 | 
			
		||||
	if (new_size > text_asize) {
 | 
			
		||||
		new_size += START_STRSIZE - 1;
 | 
			
		||||
		new_size &= -START_STRSIZE;
 | 
			
		||||
		text = realloc(text, new_size);
 | 
			
		||||
		text_asize = new_size;
 | 
			
		||||
		text_ptr = text + text_size;
 | 
			
		||||
	}
 | 
			
		||||
	memcpy(text_ptr, str, size);
 | 
			
		||||
	text_ptr += size;
 | 
			
		||||
	memcpy(text + text_size, str, size);
 | 
			
		||||
	text_size += size;
 | 
			
		||||
	*text_ptr = 0;
 | 
			
		||||
	text[text_size] = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void alloc_string(const char *str, int size)
 | 
			
		||||
| 
						 | 
				
			
			@ -88,36 +86,12 @@ n	[A-Za-z0-9_]
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
<COMMAND>{
 | 
			
		||||
	"mainmenu"		BEGIN(PARAM); return T_MAINMENU;
 | 
			
		||||
	"menu"			BEGIN(PARAM); return T_MENU;
 | 
			
		||||
	"endmenu"		BEGIN(PARAM); return T_ENDMENU;
 | 
			
		||||
	"source"		BEGIN(PARAM); return T_SOURCE;
 | 
			
		||||
	"choice"		BEGIN(PARAM); return T_CHOICE;
 | 
			
		||||
	"endchoice"		BEGIN(PARAM); return T_ENDCHOICE;
 | 
			
		||||
	"comment"		BEGIN(PARAM); return T_COMMENT;
 | 
			
		||||
	"config"		BEGIN(PARAM); return T_CONFIG;
 | 
			
		||||
	"menuconfig"		BEGIN(PARAM); return T_MENUCONFIG;
 | 
			
		||||
	"help"			BEGIN(PARAM); return T_HELP;
 | 
			
		||||
	"if"			BEGIN(PARAM); return T_IF;
 | 
			
		||||
	"endif"			BEGIN(PARAM); return T_ENDIF;
 | 
			
		||||
	"depends"		BEGIN(PARAM); return T_DEPENDS;
 | 
			
		||||
	"requires"		BEGIN(PARAM); return T_REQUIRES;
 | 
			
		||||
	"optional"		BEGIN(PARAM); return T_OPTIONAL;
 | 
			
		||||
	"default"		BEGIN(PARAM); return T_DEFAULT;
 | 
			
		||||
	"prompt"		BEGIN(PARAM); return T_PROMPT;
 | 
			
		||||
	"tristate"		BEGIN(PARAM); return T_TRISTATE;
 | 
			
		||||
	"def_tristate"		BEGIN(PARAM); return T_DEF_TRISTATE;
 | 
			
		||||
	"bool"			BEGIN(PARAM); return T_BOOLEAN;
 | 
			
		||||
	"boolean"		BEGIN(PARAM); return T_BOOLEAN;
 | 
			
		||||
	"def_bool"		BEGIN(PARAM); return T_DEF_BOOLEAN;
 | 
			
		||||
	"def_boolean"		BEGIN(PARAM); return T_DEF_BOOLEAN;
 | 
			
		||||
	"int"			BEGIN(PARAM); return T_INT;
 | 
			
		||||
	"hex"			BEGIN(PARAM); return T_HEX;
 | 
			
		||||
	"string"		BEGIN(PARAM); return T_STRING;
 | 
			
		||||
	"select"		BEGIN(PARAM); return T_SELECT;
 | 
			
		||||
	"enable"		BEGIN(PARAM); return T_SELECT;
 | 
			
		||||
	"range"			BEGIN(PARAM); return T_RANGE;
 | 
			
		||||
	{n}+	{
 | 
			
		||||
		struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
 | 
			
		||||
		if (id && id->flags & TF_COMMAND) {
 | 
			
		||||
			BEGIN(PARAM);
 | 
			
		||||
			return id->token;
 | 
			
		||||
		}
 | 
			
		||||
		alloc_string(yytext, yyleng);
 | 
			
		||||
		zconflval.string = text;
 | 
			
		||||
		return T_WORD;
 | 
			
		||||
| 
						 | 
				
			
			@ -134,8 +108,6 @@ n	[A-Za-z0-9_]
 | 
			
		|||
	"!"	return T_NOT;
 | 
			
		||||
	"="	return T_EQUAL;
 | 
			
		||||
	"!="	return T_UNEQUAL;
 | 
			
		||||
	"if"	return T_IF;
 | 
			
		||||
	"on"	return T_ON;
 | 
			
		||||
	\"|\'	{
 | 
			
		||||
		str = yytext[0];
 | 
			
		||||
		new_string();
 | 
			
		||||
| 
						 | 
				
			
			@ -144,6 +116,9 @@ n	[A-Za-z0-9_]
 | 
			
		|||
	\n	BEGIN(INITIAL); current_file->lineno++; return T_EOL;
 | 
			
		||||
	---	/* ignore */
 | 
			
		||||
	({n}|[-/.])+	{
 | 
			
		||||
		struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
 | 
			
		||||
		if (id && id->flags & TF_PARAM)
 | 
			
		||||
			return id->token;
 | 
			
		||||
		alloc_string(yytext, yyleng);
 | 
			
		||||
		zconflval.string = text;
 | 
			
		||||
		return T_WORD;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
/* A Bison parser, made by GNU Bison 1.875a.  */
 | 
			
		||||
/* A Bison parser, made by GNU Bison 2.0.  */
 | 
			
		||||
 | 
			
		||||
/* Skeleton parser for Yacc-like parsing with Bison,
 | 
			
		||||
   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
 | 
			
		||||
   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 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
 | 
			
		||||
| 
						 | 
				
			
			@ -45,8 +45,7 @@
 | 
			
		|||
/* Using locations.  */
 | 
			
		||||
#define YYLSP_NEEDED 0
 | 
			
		||||
 | 
			
		||||
/* If NAME_PREFIX is specified substitute the variables and functions
 | 
			
		||||
   names.  */
 | 
			
		||||
/* Substitute the variable and function names.  */
 | 
			
		||||
#define yyparse zconfparse
 | 
			
		||||
#define yylex   zconflex
 | 
			
		||||
#define yyerror zconferror
 | 
			
		||||
| 
						 | 
				
			
			@ -161,6 +160,11 @@
 | 
			
		|||
#include <string.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
 | 
			
		||||
#define LKC_DIRECT_LINK
 | 
			
		||||
#include "lkc.h"
 | 
			
		||||
 | 
			
		||||
#include "zconf.hash.c"
 | 
			
		||||
 | 
			
		||||
#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
 | 
			
		||||
 | 
			
		||||
#define PRINTD		0x0001
 | 
			
		||||
| 
						 | 
				
			
			@ -202,7 +206,7 @@ typedef union YYSTYPE {
 | 
			
		|||
	struct expr *expr;
 | 
			
		||||
	struct menu *menu;
 | 
			
		||||
} YYSTYPE;
 | 
			
		||||
/* Line 191 of yacc.c.  */
 | 
			
		||||
/* Line 190 of yacc.c.  */
 | 
			
		||||
 | 
			
		||||
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
 | 
			
		||||
# define YYSTYPE_IS_DECLARED 1
 | 
			
		||||
| 
						 | 
				
			
			@ -214,27 +218,26 @@ typedef union YYSTYPE {
 | 
			
		|||
/* Copy the second part of user declarations.  */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define LKC_DIRECT_LINK
 | 
			
		||||
#include "lkc.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Line 214 of yacc.c.  */
 | 
			
		||||
/* Line 213 of yacc.c.  */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if ! defined (yyoverflow) || YYERROR_VERBOSE
 | 
			
		||||
 | 
			
		||||
# ifndef YYFREE
 | 
			
		||||
#  define YYFREE free
 | 
			
		||||
# endif
 | 
			
		||||
# ifndef YYMALLOC
 | 
			
		||||
#  define YYMALLOC malloc
 | 
			
		||||
# endif
 | 
			
		||||
 | 
			
		||||
/* The parser invokes alloca or malloc; define the necessary symbols.  */
 | 
			
		||||
 | 
			
		||||
# ifdef YYSTACK_USE_ALLOCA
 | 
			
		||||
#  if YYSTACK_USE_ALLOCA
 | 
			
		||||
#  define YYSTACK_ALLOC alloca
 | 
			
		||||
# else
 | 
			
		||||
#  ifndef YYSTACK_USE_ALLOCA
 | 
			
		||||
#   if defined (alloca) || defined (_ALLOCA_H)
 | 
			
		||||
#    define YYSTACK_ALLOC alloca
 | 
			
		||||
#   else
 | 
			
		||||
#   ifdef __GNUC__
 | 
			
		||||
#    define YYSTACK_ALLOC __builtin_alloca
 | 
			
		||||
#    endif
 | 
			
		||||
#   else
 | 
			
		||||
#    define YYSTACK_ALLOC alloca
 | 
			
		||||
#   endif
 | 
			
		||||
#  endif
 | 
			
		||||
# endif
 | 
			
		||||
| 
						 | 
				
			
			@ -247,20 +250,20 @@ typedef union YYSTYPE {
 | 
			
		|||
#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
 | 
			
		||||
#   define YYSIZE_T size_t
 | 
			
		||||
#  endif
 | 
			
		||||
#  define YYSTACK_ALLOC malloc
 | 
			
		||||
#  define YYSTACK_FREE free
 | 
			
		||||
#  define YYSTACK_ALLOC YYMALLOC
 | 
			
		||||
#  define YYSTACK_FREE YYFREE
 | 
			
		||||
# endif
 | 
			
		||||
#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if (! defined (yyoverflow) \
 | 
			
		||||
     && (! defined (__cplusplus) \
 | 
			
		||||
	 || (YYSTYPE_IS_TRIVIAL)))
 | 
			
		||||
	 || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
 | 
			
		||||
 | 
			
		||||
/* A type that is properly aligned for any stack member.  */
 | 
			
		||||
union yyalloc
 | 
			
		||||
{
 | 
			
		||||
  short yyss;
 | 
			
		||||
  short int yyss;
 | 
			
		||||
  YYSTYPE yyvs;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -270,13 +273,13 @@ union yyalloc
 | 
			
		|||
/* The size of an array large to enough to hold all stacks, each with
 | 
			
		||||
   N elements.  */
 | 
			
		||||
# define YYSTACK_BYTES(N) \
 | 
			
		||||
     ((N) * (sizeof (short) + sizeof (YYSTYPE))				\
 | 
			
		||||
     ((N) * (sizeof (short int) + sizeof (YYSTYPE))			\
 | 
			
		||||
      + YYSTACK_GAP_MAXIMUM)
 | 
			
		||||
 | 
			
		||||
/* Copy COUNT objects from FROM to TO.  The source and destination do
 | 
			
		||||
   not overlap.  */
 | 
			
		||||
# ifndef YYCOPY
 | 
			
		||||
#  if 1 < __GNUC__
 | 
			
		||||
#  if defined (__GNUC__) && 1 < __GNUC__
 | 
			
		||||
#   define YYCOPY(To, From, Count) \
 | 
			
		||||
      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
 | 
			
		||||
#  else
 | 
			
		||||
| 
						 | 
				
			
			@ -312,7 +315,7 @@ union yyalloc
 | 
			
		|||
#if defined (__STDC__) || defined (__cplusplus)
 | 
			
		||||
   typedef signed char yysigned_char;
 | 
			
		||||
#else
 | 
			
		||||
   typedef short yysigned_char;
 | 
			
		||||
   typedef short int yysigned_char;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* YYFINAL -- State number of the termination state. */
 | 
			
		||||
| 
						 | 
				
			
			@ -374,7 +377,7 @@ static const unsigned char yytranslate[] =
 | 
			
		|||
#if YYDEBUG
 | 
			
		||||
/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
 | 
			
		||||
   YYRHS.  */
 | 
			
		||||
static const unsigned short yyprhs[] =
 | 
			
		||||
static const unsigned short int yyprhs[] =
 | 
			
		||||
{
 | 
			
		||||
       0,     0,     3,     4,     7,     9,    11,    13,    17,    19,
 | 
			
		||||
      21,    23,    26,    28,    30,    32,    34,    36,    38,    42,
 | 
			
		||||
| 
						 | 
				
			
			@ -427,19 +430,19 @@ static const yysigned_char yyrhs[] =
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 | 
			
		||||
static const unsigned short yyrline[] =
 | 
			
		||||
static const unsigned short int yyrline[] =
 | 
			
		||||
{
 | 
			
		||||
       0,    94,    94,    95,    98,    99,   100,   101,   102,   103,
 | 
			
		||||
     104,   105,   109,   110,   111,   112,   113,   114,   120,   128,
 | 
			
		||||
     134,   142,   152,   154,   155,   156,   157,   160,   166,   173,
 | 
			
		||||
     179,   186,   192,   198,   204,   210,   216,   222,   230,   239,
 | 
			
		||||
     245,   254,   255,   261,   263,   264,   265,   266,   269,   275,
 | 
			
		||||
     281,   287,   293,   299,   301,   306,   315,   324,   325,   331,
 | 
			
		||||
     333,   334,   335,   340,   347,   353,   362,   363,   369,   371,
 | 
			
		||||
     372,   373,   374,   377,   383,   390,   397,   404,   410,   417,
 | 
			
		||||
     418,   419,   422,   427,   432,   440,   442,   447,   448,   451,
 | 
			
		||||
     452,   453,   457,   457,   459,   460,   463,   464,   465,   466,
 | 
			
		||||
     467,   468,   469,   472,   473
 | 
			
		||||
       0,    97,    97,    98,   101,   102,   103,   104,   105,   106,
 | 
			
		||||
     107,   108,   112,   113,   114,   115,   116,   117,   123,   131,
 | 
			
		||||
     137,   145,   155,   157,   158,   159,   160,   163,   169,   176,
 | 
			
		||||
     182,   189,   195,   201,   207,   213,   219,   225,   233,   242,
 | 
			
		||||
     248,   257,   258,   264,   266,   267,   268,   269,   272,   278,
 | 
			
		||||
     284,   290,   296,   302,   304,   309,   318,   327,   328,   334,
 | 
			
		||||
     336,   337,   338,   343,   350,   356,   365,   366,   372,   374,
 | 
			
		||||
     375,   376,   377,   380,   386,   393,   400,   407,   413,   420,
 | 
			
		||||
     421,   422,   425,   430,   435,   443,   445,   450,   451,   454,
 | 
			
		||||
     455,   456,   460,   460,   462,   463,   466,   467,   468,   469,
 | 
			
		||||
     470,   471,   472,   475,   476
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -455,22 +458,22 @@ static const char *const yytname[] =
 | 
			
		|||
  "T_DEF_TRISTATE", "T_BOOLEAN", "T_DEF_BOOLEAN", "T_STRING", "T_INT",
 | 
			
		||||
  "T_HEX", "T_WORD", "T_WORD_QUOTE", "T_UNEQUAL", "T_EOF", "T_EOL",
 | 
			
		||||
  "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_ON", "T_SELECT", "T_RANGE", "T_OR",
 | 
			
		||||
  "T_AND", "T_EQUAL", "T_NOT", "$accept", "input", "block", 
 | 
			
		||||
  "common_block", "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", "if_end", 
 | 
			
		||||
  "if_stmt", "if_block", "menu", "menu_entry", "menu_end", "menu_stmt", 
 | 
			
		||||
  "menu_block", "source", "source_stmt", "comment", "comment_stmt", 
 | 
			
		||||
  "help_start", "help", "depends_list", "depends", "prompt_stmt_opt", 
 | 
			
		||||
  "prompt", "end", "nl_or_eof", "if_expr", "expr", "symbol", 0
 | 
			
		||||
  "T_AND", "T_EQUAL", "T_NOT", "$accept", "input", "block", "common_block",
 | 
			
		||||
  "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", "if_end", "if_stmt", "if_block",
 | 
			
		||||
  "menu", "menu_entry", "menu_end", "menu_stmt", "menu_block", "source",
 | 
			
		||||
  "source_stmt", "comment", "comment_stmt", "help_start", "help",
 | 
			
		||||
  "depends_list", "depends", "prompt_stmt_opt", "prompt", "end",
 | 
			
		||||
  "nl_or_eof", "if_expr", "expr", "symbol", 0
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
# ifdef YYPRINT
 | 
			
		||||
/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
 | 
			
		||||
   token YYLEX-NUM.  */
 | 
			
		||||
static const unsigned short yytoknum[] =
 | 
			
		||||
static const unsigned short int yytoknum[] =
 | 
			
		||||
{
 | 
			
		||||
       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
 | 
			
		||||
     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
 | 
			
		||||
| 
						 | 
				
			
			@ -539,7 +542,7 @@ static const unsigned char yydefact[] =
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
/* YYDEFGOTO[NTERM-NUM]. */
 | 
			
		||||
static const short yydefgoto[] =
 | 
			
		||||
static const short int yydefgoto[] =
 | 
			
		||||
{
 | 
			
		||||
      -1,     1,    17,    18,    19,    20,    21,    22,    52,    88,
 | 
			
		||||
      23,    24,   105,    25,    54,    98,    55,    26,   109,    27,
 | 
			
		||||
| 
						 | 
				
			
			@ -551,7 +554,7 @@ static const short yydefgoto[] =
 | 
			
		|||
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
 | 
			
		||||
   STATE-NUM.  */
 | 
			
		||||
#define YYPACT_NINF -99
 | 
			
		||||
static const short yypact[] =
 | 
			
		||||
static const short int yypact[] =
 | 
			
		||||
{
 | 
			
		||||
     -99,    48,   -99,    38,    46,    46,   -99,    46,   -29,   -99,
 | 
			
		||||
      46,   -17,    -3,   -11,   -99,   -99,   -99,   -99,   -99,   -99,
 | 
			
		||||
| 
						 | 
				
			
			@ -575,7 +578,7 @@ static const short yypact[] =
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
/* YYPGOTO[NTERM-NUM].  */
 | 
			
		||||
static const short yypgoto[] =
 | 
			
		||||
static const short int yypgoto[] =
 | 
			
		||||
{
 | 
			
		||||
     -99,   -99,   -99,   111,   -99,   -99,   -99,   -99,   178,   -99,
 | 
			
		||||
     -99,   -99,   -99,    91,   -99,   -99,   -99,   -99,   -99,   -99,
 | 
			
		||||
| 
						 | 
				
			
			@ -589,7 +592,7 @@ static const short yypgoto[] =
 | 
			
		|||
   number is the opposite.  If zero, do what YYDEFACT says.
 | 
			
		||||
   If YYTABLE_NINF, syntax error.  */
 | 
			
		||||
#define YYTABLE_NINF -68
 | 
			
		||||
static const short yytable[] =
 | 
			
		||||
static const short int yytable[] =
 | 
			
		||||
{
 | 
			
		||||
      66,    67,    36,    42,    39,    40,    71,    41,   123,   124,
 | 
			
		||||
      43,    44,    74,    75,   120,   154,    72,    46,    47,    69,
 | 
			
		||||
| 
						 | 
				
			
			@ -687,7 +690,7 @@ static const unsigned char yystos[] =
 | 
			
		|||
 | 
			
		||||
#define YYACCEPT	goto yyacceptlab
 | 
			
		||||
#define YYABORT		goto yyabortlab
 | 
			
		||||
#define YYERROR		goto yyerrlab1
 | 
			
		||||
#define YYERROR		goto yyerrorlab
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Like YYERROR except do call yyerror.  This remains here temporarily
 | 
			
		||||
| 
						 | 
				
			
			@ -715,20 +718,53 @@ do								\
 | 
			
		|||
    }								\
 | 
			
		||||
while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define YYTERROR	1
 | 
			
		||||
#define YYERRCODE	256
 | 
			
		||||
 | 
			
		||||
/* YYLLOC_DEFAULT -- Compute the default location (before the actions
 | 
			
		||||
   are run).  */
 | 
			
		||||
 | 
			
		||||
/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
 | 
			
		||||
   If N is 0, then set CURRENT to the empty location which ends
 | 
			
		||||
   the previous symbol: RHS[0] (always defined).  */
 | 
			
		||||
 | 
			
		||||
#define YYRHSLOC(Rhs, K) ((Rhs)[K])
 | 
			
		||||
#ifndef YYLLOC_DEFAULT
 | 
			
		||||
# define YYLLOC_DEFAULT(Current, Rhs, N)				\
 | 
			
		||||
  Current.first_line   = Rhs[1].first_line;      \
 | 
			
		||||
  Current.first_column = Rhs[1].first_column;    \
 | 
			
		||||
  Current.last_line    = Rhs[N].last_line;       \
 | 
			
		||||
  Current.last_column  = Rhs[N].last_column;
 | 
			
		||||
    do									\
 | 
			
		||||
      if (N)								\
 | 
			
		||||
	{								\
 | 
			
		||||
	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
 | 
			
		||||
	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
 | 
			
		||||
	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
 | 
			
		||||
	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
 | 
			
		||||
	}								\
 | 
			
		||||
      else								\
 | 
			
		||||
	{								\
 | 
			
		||||
	  (Current).first_line   = (Current).last_line   =		\
 | 
			
		||||
	    YYRHSLOC (Rhs, 0).last_line;				\
 | 
			
		||||
	  (Current).first_column = (Current).last_column =		\
 | 
			
		||||
	    YYRHSLOC (Rhs, 0).last_column;				\
 | 
			
		||||
	}								\
 | 
			
		||||
    while (0)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* YY_LOCATION_PRINT -- Print the location on the stream.
 | 
			
		||||
   This macro was not mandated originally: define only if we know
 | 
			
		||||
   we won't break user code: when these are the locations we know.  */
 | 
			
		||||
 | 
			
		||||
#ifndef YY_LOCATION_PRINT
 | 
			
		||||
# if YYLTYPE_IS_TRIVIAL
 | 
			
		||||
#  define YY_LOCATION_PRINT(File, Loc)			\
 | 
			
		||||
     fprintf (File, "%d.%d-%d.%d",			\
 | 
			
		||||
              (Loc).first_line, (Loc).first_column,	\
 | 
			
		||||
              (Loc).last_line,  (Loc).last_column)
 | 
			
		||||
# else
 | 
			
		||||
#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
 | 
			
		||||
# endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* YYLEX -- calling `yylex' with the right arguments.  */
 | 
			
		||||
 | 
			
		||||
#ifdef YYLEX_PARAM
 | 
			
		||||
| 
						 | 
				
			
			@ -751,36 +787,30 @@ do {						\
 | 
			
		|||
    YYFPRINTF Args;				\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
# define YYDSYMPRINT(Args)			\
 | 
			
		||||
do {						\
 | 
			
		||||
  if (yydebug)					\
 | 
			
		||||
    yysymprint Args;				\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
# define YYDSYMPRINTF(Title, Token, Value, Location)		\
 | 
			
		||||
# define YY_SYMBOL_PRINT(Title, Type, Value, Location)		\
 | 
			
		||||
do {								\
 | 
			
		||||
  if (yydebug)							\
 | 
			
		||||
    {								\
 | 
			
		||||
      YYFPRINTF (stderr, "%s ", Title);				\
 | 
			
		||||
      yysymprint (stderr, 					\
 | 
			
		||||
                  Token, Value);	\
 | 
			
		||||
                  Type, Value);	\
 | 
			
		||||
      YYFPRINTF (stderr, "\n");					\
 | 
			
		||||
    }								\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
/*------------------------------------------------------------------.
 | 
			
		||||
| yy_stack_print -- Print the state stack from its BOTTOM up to its |
 | 
			
		||||
| TOP (cinluded).                                                   |
 | 
			
		||||
| TOP (included).                                                   |
 | 
			
		||||
`------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#if defined (__STDC__) || defined (__cplusplus)
 | 
			
		||||
static void
 | 
			
		||||
yy_stack_print (short *bottom, short *top)
 | 
			
		||||
yy_stack_print (short int *bottom, short int *top)
 | 
			
		||||
#else
 | 
			
		||||
static void
 | 
			
		||||
yy_stack_print (bottom, top)
 | 
			
		||||
    short *bottom;
 | 
			
		||||
    short *top;
 | 
			
		||||
    short int *bottom;
 | 
			
		||||
    short int *top;
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
  YYFPRINTF (stderr, "Stack now");
 | 
			
		||||
| 
						 | 
				
			
			@ -810,9 +840,9 @@ yy_reduce_print (yyrule)
 | 
			
		|||
#endif
 | 
			
		||||
{
 | 
			
		||||
  int yyi;
 | 
			
		||||
  unsigned int yylineno = yyrline[yyrule];
 | 
			
		||||
  unsigned int yylno = yyrline[yyrule];
 | 
			
		||||
  YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
 | 
			
		||||
             yyrule - 1, yylineno);
 | 
			
		||||
             yyrule - 1, yylno);
 | 
			
		||||
  /* Print the symbols being reduced, and their result.  */
 | 
			
		||||
  for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
 | 
			
		||||
    YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
 | 
			
		||||
| 
						 | 
				
			
			@ -830,8 +860,7 @@ do {					\
 | 
			
		|||
int yydebug;
 | 
			
		||||
#else /* !YYDEBUG */
 | 
			
		||||
# define YYDPRINTF(Args)
 | 
			
		||||
# define YYDSYMPRINT(Args)
 | 
			
		||||
# define YYDSYMPRINTF(Title, Token, Value, Location)
 | 
			
		||||
# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
 | 
			
		||||
# define YY_STACK_PRINT(Bottom, Top)
 | 
			
		||||
# define YY_REDUCE_PRINT(Rule)
 | 
			
		||||
#endif /* !YYDEBUG */
 | 
			
		||||
| 
						 | 
				
			
			@ -849,10 +878,6 @@ int yydebug;
 | 
			
		|||
   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
 | 
			
		||||
   evaluated with infinite-precision integer arithmetic.  */
 | 
			
		||||
 | 
			
		||||
#if YYMAXDEPTH == 0
 | 
			
		||||
# undef YYMAXDEPTH
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef YYMAXDEPTH
 | 
			
		||||
# define YYMAXDEPTH 10000
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -934,15 +959,15 @@ yysymprint (yyoutput, yytype, yyvaluep)
 | 
			
		|||
  (void) yyvaluep;
 | 
			
		||||
 | 
			
		||||
  if (yytype < YYNTOKENS)
 | 
			
		||||
    {
 | 
			
		||||
    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
 | 
			
		||||
# ifdef YYPRINT
 | 
			
		||||
      YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
 | 
			
		||||
# endif
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# ifdef YYPRINT
 | 
			
		||||
  if (yytype < YYNTOKENS)
 | 
			
		||||
    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
 | 
			
		||||
# endif
 | 
			
		||||
  switch (yytype)
 | 
			
		||||
    {
 | 
			
		||||
      default:
 | 
			
		||||
| 
						 | 
				
			
			@ -958,10 +983,11 @@ yysymprint (yyoutput, yytype, yyvaluep)
 | 
			
		|||
 | 
			
		||||
#if defined (__STDC__) || defined (__cplusplus)
 | 
			
		||||
static void
 | 
			
		||||
yydestruct (int yytype, YYSTYPE *yyvaluep)
 | 
			
		||||
yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
 | 
			
		||||
#else
 | 
			
		||||
static void
 | 
			
		||||
yydestruct (yytype, yyvaluep)
 | 
			
		||||
yydestruct (yymsg, yytype, yyvaluep)
 | 
			
		||||
    const char *yymsg;
 | 
			
		||||
    int yytype;
 | 
			
		||||
    YYSTYPE *yyvaluep;
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -969,6 +995,10 @@ yydestruct (yytype, yyvaluep)
 | 
			
		|||
  /* Pacify ``unused variable'' warnings.  */
 | 
			
		||||
  (void) yyvaluep;
 | 
			
		||||
 | 
			
		||||
  if (!yymsg)
 | 
			
		||||
    yymsg = "Deleting";
 | 
			
		||||
  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
 | 
			
		||||
 | 
			
		||||
  switch (yytype)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -996,10 +1026,10 @@ int yyparse ();
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* The lookahead symbol.  */
 | 
			
		||||
/* The look-ahead symbol.  */
 | 
			
		||||
int yychar;
 | 
			
		||||
 | 
			
		||||
/* The semantic value of the lookahead symbol.  */
 | 
			
		||||
/* The semantic value of the look-ahead symbol.  */
 | 
			
		||||
YYSTYPE yylval;
 | 
			
		||||
 | 
			
		||||
/* Number of syntax errors so far.  */
 | 
			
		||||
| 
						 | 
				
			
			@ -1035,7 +1065,7 @@ yyparse ()
 | 
			
		|||
  int yyresult;
 | 
			
		||||
  /* Number of tokens to shift before error messages enabled.  */
 | 
			
		||||
  int yyerrstatus;
 | 
			
		||||
  /* Lookahead token as an internal (translated) token number.  */
 | 
			
		||||
  /* Look-ahead token as an internal (translated) token number.  */
 | 
			
		||||
  int yytoken = 0;
 | 
			
		||||
 | 
			
		||||
  /* Three stacks and their tools:
 | 
			
		||||
| 
						 | 
				
			
			@ -1047,9 +1077,9 @@ yyparse ()
 | 
			
		|||
     to reallocate them elsewhere.  */
 | 
			
		||||
 | 
			
		||||
  /* The state stack.  */
 | 
			
		||||
  short	yyssa[YYINITDEPTH];
 | 
			
		||||
  short *yyss = yyssa;
 | 
			
		||||
  register short *yyssp;
 | 
			
		||||
  short int yyssa[YYINITDEPTH];
 | 
			
		||||
  short int *yyss = yyssa;
 | 
			
		||||
  register short int *yyssp;
 | 
			
		||||
 | 
			
		||||
  /* The semantic value stack.  */
 | 
			
		||||
  YYSTYPE yyvsa[YYINITDEPTH];
 | 
			
		||||
| 
						 | 
				
			
			@ -1086,6 +1116,9 @@ yyparse ()
 | 
			
		|||
  yyssp = yyss;
 | 
			
		||||
  yyvsp = yyvs;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  yyvsp[0] = yylval;
 | 
			
		||||
 | 
			
		||||
  goto yysetstate;
 | 
			
		||||
 | 
			
		||||
/*------------------------------------------------------------.
 | 
			
		||||
| 
						 | 
				
			
			@ -1111,7 +1144,7 @@ yyparse ()
 | 
			
		|||
	   these so that the &'s don't force the real ones into
 | 
			
		||||
	   memory.  */
 | 
			
		||||
	YYSTYPE *yyvs1 = yyvs;
 | 
			
		||||
	short *yyss1 = yyss;
 | 
			
		||||
	short int *yyss1 = yyss;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/* Each stack pointer address is followed by the size of the
 | 
			
		||||
| 
						 | 
				
			
			@ -1139,7 +1172,7 @@ yyparse ()
 | 
			
		|||
	yystacksize = YYMAXDEPTH;
 | 
			
		||||
 | 
			
		||||
      {
 | 
			
		||||
	short *yyss1 = yyss;
 | 
			
		||||
	short int *yyss1 = yyss;
 | 
			
		||||
	union yyalloc *yyptr =
 | 
			
		||||
	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
 | 
			
		||||
	if (! yyptr)
 | 
			
		||||
| 
						 | 
				
			
			@ -1175,18 +1208,18 @@ yyparse ()
 | 
			
		|||
yybackup:
 | 
			
		||||
 | 
			
		||||
/* Do appropriate processing given the current state.  */
 | 
			
		||||
/* Read a lookahead token if we need one and don't already have one.  */
 | 
			
		||||
/* Read a look-ahead token if we need one and don't already have one.  */
 | 
			
		||||
/* yyresume: */
 | 
			
		||||
 | 
			
		||||
  /* First try to decide what to do without reference to lookahead token.  */
 | 
			
		||||
  /* First try to decide what to do without reference to look-ahead token.  */
 | 
			
		||||
 | 
			
		||||
  yyn = yypact[yystate];
 | 
			
		||||
  if (yyn == YYPACT_NINF)
 | 
			
		||||
    goto yydefault;
 | 
			
		||||
 | 
			
		||||
  /* Not known => get a lookahead token if don't already have one.  */
 | 
			
		||||
  /* Not known => get a look-ahead token if don't already have one.  */
 | 
			
		||||
 | 
			
		||||
  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
 | 
			
		||||
  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
 | 
			
		||||
  if (yychar == YYEMPTY)
 | 
			
		||||
    {
 | 
			
		||||
      YYDPRINTF ((stderr, "Reading a token: "));
 | 
			
		||||
| 
						 | 
				
			
			@ -1201,7 +1234,7 @@ yybackup:
 | 
			
		|||
  else
 | 
			
		||||
    {
 | 
			
		||||
      yytoken = YYTRANSLATE (yychar);
 | 
			
		||||
      YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc);
 | 
			
		||||
      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* If the proper action on seeing token YYTOKEN is to reduce or to
 | 
			
		||||
| 
						 | 
				
			
			@ -1221,8 +1254,8 @@ yybackup:
 | 
			
		|||
  if (yyn == YYFINAL)
 | 
			
		||||
    YYACCEPT;
 | 
			
		||||
 | 
			
		||||
  /* Shift the lookahead token.  */
 | 
			
		||||
  YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken]));
 | 
			
		||||
  /* Shift the look-ahead token.  */
 | 
			
		||||
  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
 | 
			
		||||
 | 
			
		||||
  /* Discard the token being shifted unless it is eof.  */
 | 
			
		||||
  if (yychar != YYEOF)
 | 
			
		||||
| 
						 | 
				
			
			@ -1294,10 +1327,10 @@ yyreduce:
 | 
			
		|||
  case 18:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	struct symbol *sym = sym_lookup(yyvsp[-1].string, 0);
 | 
			
		||||
	struct symbol *sym = sym_lookup((yyvsp[-1].string), 0);
 | 
			
		||||
	sym->flags |= SYMBOL_OPTIONAL;
 | 
			
		||||
	menu_add_entry(sym);
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string);
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
 | 
			
		||||
;}
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1312,10 +1345,10 @@ yyreduce:
 | 
			
		|||
  case 20:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	struct symbol *sym = sym_lookup(yyvsp[-1].string, 0);
 | 
			
		||||
	struct symbol *sym = sym_lookup((yyvsp[-1].string), 0);
 | 
			
		||||
	sym->flags |= SYMBOL_OPTIONAL;
 | 
			
		||||
	menu_add_entry(sym);
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string);
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
 | 
			
		||||
;}
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1342,7 +1375,7 @@ yyreduce:
 | 
			
		|||
  case 28:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr);
 | 
			
		||||
	menu_add_expr(P_DEFAULT, (yyvsp[-2].expr), (yyvsp[-1].expr));
 | 
			
		||||
	menu_set_type(S_TRISTATE);
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
 | 
			
		||||
;}
 | 
			
		||||
| 
						 | 
				
			
			@ -1359,7 +1392,7 @@ yyreduce:
 | 
			
		|||
  case 30:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr);
 | 
			
		||||
	menu_add_expr(P_DEFAULT, (yyvsp[-2].expr), (yyvsp[-1].expr));
 | 
			
		||||
	menu_set_type(S_BOOLEAN);
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
 | 
			
		||||
;}
 | 
			
		||||
| 
						 | 
				
			
			@ -1392,7 +1425,7 @@ yyreduce:
 | 
			
		|||
  case 34:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr);
 | 
			
		||||
	menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr));
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
 | 
			
		||||
;}
 | 
			
		||||
    break;
 | 
			
		||||
| 
						 | 
				
			
			@ -1400,7 +1433,7 @@ yyreduce:
 | 
			
		|||
  case 35:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr);
 | 
			
		||||
	menu_add_expr(P_DEFAULT, (yyvsp[-2].expr), (yyvsp[-1].expr));
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
 | 
			
		||||
;}
 | 
			
		||||
    break;
 | 
			
		||||
| 
						 | 
				
			
			@ -1408,7 +1441,7 @@ yyreduce:
 | 
			
		|||
  case 36:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	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));
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
 | 
			
		||||
;}
 | 
			
		||||
    break;
 | 
			
		||||
| 
						 | 
				
			
			@ -1416,7 +1449,7 @@ yyreduce:
 | 
			
		|||
  case 37:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	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));
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
 | 
			
		||||
;}
 | 
			
		||||
    break;
 | 
			
		||||
| 
						 | 
				
			
			@ -1443,7 +1476,7 @@ yyreduce:
 | 
			
		|||
  case 40:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	if (zconf_endtoken(yyvsp[0].token, T_CHOICE, T_ENDCHOICE)) {
 | 
			
		||||
	if (zconf_endtoken((yyvsp[0].token), T_CHOICE, T_ENDCHOICE)) {
 | 
			
		||||
		menu_end_menu();
 | 
			
		||||
		printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -1461,7 +1494,7 @@ yyreduce:
 | 
			
		|||
  case 48:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr);
 | 
			
		||||
	menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr));
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
 | 
			
		||||
;}
 | 
			
		||||
    break;
 | 
			
		||||
| 
						 | 
				
			
			@ -1493,7 +1526,7 @@ yyreduce:
 | 
			
		|||
  case 52:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	menu_add_symbol(P_DEFAULT, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr);
 | 
			
		||||
	menu_add_symbol(P_DEFAULT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr));
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
 | 
			
		||||
;}
 | 
			
		||||
    break;
 | 
			
		||||
| 
						 | 
				
			
			@ -1503,7 +1536,7 @@ yyreduce:
 | 
			
		|||
    {
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
 | 
			
		||||
	menu_add_entry(NULL);
 | 
			
		||||
	menu_add_dep(yyvsp[-1].expr);
 | 
			
		||||
	menu_add_dep((yyvsp[-1].expr));
 | 
			
		||||
	menu_end_entry();
 | 
			
		||||
	menu_add_menu();
 | 
			
		||||
;}
 | 
			
		||||
| 
						 | 
				
			
			@ -1512,7 +1545,7 @@ yyreduce:
 | 
			
		|||
  case 56:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	if (zconf_endtoken(yyvsp[0].token, T_IF, T_ENDIF)) {
 | 
			
		||||
	if (zconf_endtoken((yyvsp[0].token), T_IF, T_ENDIF)) {
 | 
			
		||||
		menu_end_menu();
 | 
			
		||||
		printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -1531,7 +1564,7 @@ yyreduce:
 | 
			
		|||
 | 
			
		||||
    {
 | 
			
		||||
	menu_add_entry(NULL);
 | 
			
		||||
	menu_add_prompt(P_MENU, yyvsp[-1].string, NULL);
 | 
			
		||||
	menu_add_prompt(P_MENU, (yyvsp[-1].string), NULL);
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
 | 
			
		||||
;}
 | 
			
		||||
    break;
 | 
			
		||||
| 
						 | 
				
			
			@ -1547,7 +1580,7 @@ yyreduce:
 | 
			
		|||
  case 65:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	if (zconf_endtoken(yyvsp[0].token, T_MENU, T_ENDMENU)) {
 | 
			
		||||
	if (zconf_endtoken((yyvsp[0].token), T_MENU, T_ENDMENU)) {
 | 
			
		||||
		menu_end_menu();
 | 
			
		||||
		printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -1570,15 +1603,15 @@ yyreduce:
 | 
			
		|||
  case 73:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	yyval.string = yyvsp[-1].string;
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string);
 | 
			
		||||
	(yyval.string) = (yyvsp[-1].string);
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
 | 
			
		||||
;}
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
  case 74:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	zconf_nextfile(yyvsp[0].string);
 | 
			
		||||
	zconf_nextfile((yyvsp[0].string));
 | 
			
		||||
;}
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1586,7 +1619,7 @@ yyreduce:
 | 
			
		|||
 | 
			
		||||
    {
 | 
			
		||||
	menu_add_entry(NULL);
 | 
			
		||||
	menu_add_prompt(P_COMMENT, yyvsp[-1].string, NULL);
 | 
			
		||||
	menu_add_prompt(P_COMMENT, (yyvsp[-1].string), NULL);
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
 | 
			
		||||
;}
 | 
			
		||||
    break;
 | 
			
		||||
| 
						 | 
				
			
			@ -1609,14 +1642,14 @@ yyreduce:
 | 
			
		|||
  case 78:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	current_entry->sym->help = yyvsp[0].string;
 | 
			
		||||
	current_entry->sym->help = (yyvsp[0].string);
 | 
			
		||||
;}
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
  case 82:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	menu_add_dep(yyvsp[-1].expr);
 | 
			
		||||
	menu_add_dep((yyvsp[-1].expr));
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
 | 
			
		||||
;}
 | 
			
		||||
    break;
 | 
			
		||||
| 
						 | 
				
			
			@ -1624,7 +1657,7 @@ yyreduce:
 | 
			
		|||
  case 83:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	menu_add_dep(yyvsp[-1].expr);
 | 
			
		||||
	menu_add_dep((yyvsp[-1].expr));
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno());
 | 
			
		||||
;}
 | 
			
		||||
    break;
 | 
			
		||||
| 
						 | 
				
			
			@ -1632,7 +1665,7 @@ yyreduce:
 | 
			
		|||
  case 84:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	menu_add_dep(yyvsp[-1].expr);
 | 
			
		||||
	menu_add_dep((yyvsp[-1].expr));
 | 
			
		||||
	printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno());
 | 
			
		||||
;}
 | 
			
		||||
    break;
 | 
			
		||||
| 
						 | 
				
			
			@ -1640,84 +1673,84 @@ yyreduce:
 | 
			
		|||
  case 86:
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	menu_add_prompt(P_PROMPT, yyvsp[-1].string, yyvsp[0].expr);
 | 
			
		||||
	menu_add_prompt(P_PROMPT, (yyvsp[-1].string), (yyvsp[0].expr));
 | 
			
		||||
;}
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
  case 89:
 | 
			
		||||
 | 
			
		||||
    { yyval.token = T_ENDMENU; ;}
 | 
			
		||||
    { (yyval.token) = T_ENDMENU; ;}
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
  case 90:
 | 
			
		||||
 | 
			
		||||
    { yyval.token = T_ENDCHOICE; ;}
 | 
			
		||||
    { (yyval.token) = T_ENDCHOICE; ;}
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
  case 91:
 | 
			
		||||
 | 
			
		||||
    { yyval.token = T_ENDIF; ;}
 | 
			
		||||
    { (yyval.token) = T_ENDIF; ;}
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
  case 94:
 | 
			
		||||
 | 
			
		||||
    { yyval.expr = NULL; ;}
 | 
			
		||||
    { (yyval.expr) = NULL; ;}
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
  case 95:
 | 
			
		||||
 | 
			
		||||
    { yyval.expr = yyvsp[0].expr; ;}
 | 
			
		||||
    { (yyval.expr) = (yyvsp[0].expr); ;}
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
  case 96:
 | 
			
		||||
 | 
			
		||||
    { yyval.expr = expr_alloc_symbol(yyvsp[0].symbol); ;}
 | 
			
		||||
    { (yyval.expr) = expr_alloc_symbol((yyvsp[0].symbol)); ;}
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
  case 97:
 | 
			
		||||
 | 
			
		||||
    { 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;
 | 
			
		||||
 | 
			
		||||
  case 98:
 | 
			
		||||
 | 
			
		||||
    { 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;
 | 
			
		||||
 | 
			
		||||
  case 99:
 | 
			
		||||
 | 
			
		||||
    { yyval.expr = yyvsp[-1].expr; ;}
 | 
			
		||||
    { (yyval.expr) = (yyvsp[-1].expr); ;}
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
  case 100:
 | 
			
		||||
 | 
			
		||||
    { yyval.expr = expr_alloc_one(E_NOT, yyvsp[0].expr); ;}
 | 
			
		||||
    { (yyval.expr) = expr_alloc_one(E_NOT, (yyvsp[0].expr)); ;}
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
  case 101:
 | 
			
		||||
 | 
			
		||||
    { 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;
 | 
			
		||||
 | 
			
		||||
  case 102:
 | 
			
		||||
 | 
			
		||||
    { 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;
 | 
			
		||||
 | 
			
		||||
  case 103:
 | 
			
		||||
 | 
			
		||||
    { 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;
 | 
			
		||||
 | 
			
		||||
  case 104:
 | 
			
		||||
 | 
			
		||||
    { 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;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
/* Line 999 of yacc.c.  */
 | 
			
		||||
/* Line 1037 of yacc.c.  */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  yyvsp -= yylen;
 | 
			
		||||
| 
						 | 
				
			
			@ -1759,18 +1792,33 @@ yyerrlab:
 | 
			
		|||
	{
 | 
			
		||||
	  YYSIZE_T yysize = 0;
 | 
			
		||||
	  int yytype = YYTRANSLATE (yychar);
 | 
			
		||||
	  const char* yyprefix;
 | 
			
		||||
	  char *yymsg;
 | 
			
		||||
	  int yyx, yycount;
 | 
			
		||||
	  int yyx;
 | 
			
		||||
 | 
			
		||||
	  yycount = 0;
 | 
			
		||||
	  /* Start YYX at -YYN if negative to avoid negative indexes in
 | 
			
		||||
	     YYCHECK.  */
 | 
			
		||||
	  for (yyx = yyn < 0 ? -yyn : 0;
 | 
			
		||||
	       yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
 | 
			
		||||
	  int yyxbegin = yyn < 0 ? -yyn : 0;
 | 
			
		||||
 | 
			
		||||
	  /* Stay within bounds of both yycheck and yytname.  */
 | 
			
		||||
	  int yychecklim = YYLAST - yyn;
 | 
			
		||||
	  int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
 | 
			
		||||
	  int yycount = 0;
 | 
			
		||||
 | 
			
		||||
	  yyprefix = ", expecting ";
 | 
			
		||||
	  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
 | 
			
		||||
	    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
 | 
			
		||||
	      yysize += yystrlen (yytname[yyx]) + 15, yycount++;
 | 
			
		||||
	  yysize += yystrlen ("syntax error, unexpected ") + 1;
 | 
			
		||||
	  yysize += yystrlen (yytname[yytype]);
 | 
			
		||||
	      {
 | 
			
		||||
		yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]);
 | 
			
		||||
		yycount += 1;
 | 
			
		||||
		if (yycount == 5)
 | 
			
		||||
		  {
 | 
			
		||||
		    yysize = 0;
 | 
			
		||||
		    break;
 | 
			
		||||
		  }
 | 
			
		||||
	      }
 | 
			
		||||
	  yysize += (sizeof ("syntax error, unexpected ")
 | 
			
		||||
		     + yystrlen (yytname[yytype]));
 | 
			
		||||
	  yymsg = (char *) YYSTACK_ALLOC (yysize);
 | 
			
		||||
	  if (yymsg != 0)
 | 
			
		||||
	    {
 | 
			
		||||
| 
						 | 
				
			
			@ -1779,16 +1827,13 @@ yyerrlab:
 | 
			
		|||
 | 
			
		||||
	      if (yycount < 5)
 | 
			
		||||
		{
 | 
			
		||||
		  yycount = 0;
 | 
			
		||||
		  for (yyx = yyn < 0 ? -yyn : 0;
 | 
			
		||||
		       yyx < (int) (sizeof (yytname) / sizeof (char *));
 | 
			
		||||
		       yyx++)
 | 
			
		||||
		  yyprefix = ", expecting ";
 | 
			
		||||
		  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
 | 
			
		||||
		    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
 | 
			
		||||
		      {
 | 
			
		||||
			const char *yyq = ! yycount ? ", expecting " : " or ";
 | 
			
		||||
			yyp = yystpcpy (yyp, yyq);
 | 
			
		||||
			yyp = yystpcpy (yyp, yyprefix);
 | 
			
		||||
			yyp = yystpcpy (yyp, yytname[yyx]);
 | 
			
		||||
			yycount++;
 | 
			
		||||
			yyprefix = " or ";
 | 
			
		||||
		      }
 | 
			
		||||
		}
 | 
			
		||||
	      yyerror (yymsg);
 | 
			
		||||
| 
						 | 
				
			
			@ -1806,38 +1851,57 @@ yyerrlab:
 | 
			
		|||
 | 
			
		||||
  if (yyerrstatus == 3)
 | 
			
		||||
    {
 | 
			
		||||
      /* If just tried and failed to reuse lookahead token after an
 | 
			
		||||
      /* If just tried and failed to reuse look-ahead token after an
 | 
			
		||||
	 error, discard it.  */
 | 
			
		||||
 | 
			
		||||
      /* Return failure if at end of input.  */
 | 
			
		||||
      if (yychar <= YYEOF)
 | 
			
		||||
        {
 | 
			
		||||
          /* If at end of input, pop the error token,
 | 
			
		||||
	     then the rest of the stack, then return failure.  */
 | 
			
		||||
	  if (yychar == YYEOF)
 | 
			
		||||
	     for (;;)
 | 
			
		||||
	       {
 | 
			
		||||
	  /* Pop the error token.  */
 | 
			
		||||
 | 
			
		||||
		 YYPOPSTACK;
 | 
			
		||||
	  /* Pop the rest of the stack.  */
 | 
			
		||||
	  while (yyss < yyssp)
 | 
			
		||||
	    {
 | 
			
		||||
	      YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
 | 
			
		||||
	      yydestruct (yystos[*yyssp], yyvsp);
 | 
			
		||||
	      YYPOPSTACK;
 | 
			
		||||
	    }
 | 
			
		||||
		 if (yyssp == yyss)
 | 
			
		||||
		   YYABORT;
 | 
			
		||||
		 yydestruct ("Error: popping",
 | 
			
		||||
                             yystos[*yyssp], yyvsp);
 | 
			
		||||
	       }
 | 
			
		||||
 | 
			
		||||
      YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);
 | 
			
		||||
      yydestruct (yytoken, &yylval);
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
	{
 | 
			
		||||
	  yydestruct ("Error: discarding", yytoken, &yylval);
 | 
			
		||||
	  yychar = YYEMPTY;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Else will try to reuse lookahead token after shifting the error
 | 
			
		||||
  /* Else will try to reuse look-ahead token after shifting the error
 | 
			
		||||
     token.  */
 | 
			
		||||
  goto yyerrlab1;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------.
 | 
			
		||||
| yyerrlab1 -- error raised explicitly by an action.  |
 | 
			
		||||
`----------------------------------------------------*/
 | 
			
		||||
/*---------------------------------------------------.
 | 
			
		||||
| yyerrorlab -- error raised explicitly by YYERROR.  |
 | 
			
		||||
`---------------------------------------------------*/
 | 
			
		||||
yyerrorlab:
 | 
			
		||||
 | 
			
		||||
#ifdef __GNUC__
 | 
			
		||||
  /* Pacify GCC when the user code never invokes YYERROR and the label
 | 
			
		||||
     yyerrorlab therefore never appears in user code.  */
 | 
			
		||||
  if (0)
 | 
			
		||||
     goto yyerrorlab;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
yyvsp -= yylen;
 | 
			
		||||
  yyssp -= yylen;
 | 
			
		||||
  yystate = *yyssp;
 | 
			
		||||
  goto yyerrlab1;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-------------------------------------------------------------.
 | 
			
		||||
| yyerrlab1 -- common code for both syntax error and YYERROR.  |
 | 
			
		||||
`-------------------------------------------------------------*/
 | 
			
		||||
yyerrlab1:
 | 
			
		||||
  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1859,22 +1923,22 @@ yyerrlab1:
 | 
			
		|||
      if (yyssp == yyss)
 | 
			
		||||
	YYABORT;
 | 
			
		||||
 | 
			
		||||
      YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
 | 
			
		||||
      yydestruct (yystos[yystate], yyvsp);
 | 
			
		||||
      yyvsp--;
 | 
			
		||||
      yystate = *--yyssp;
 | 
			
		||||
 | 
			
		||||
      yydestruct ("Error: popping", yystos[yystate], yyvsp);
 | 
			
		||||
      YYPOPSTACK;
 | 
			
		||||
      yystate = *yyssp;
 | 
			
		||||
      YY_STACK_PRINT (yyss, yyssp);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (yyn == YYFINAL)
 | 
			
		||||
    YYACCEPT;
 | 
			
		||||
 | 
			
		||||
  YYDPRINTF ((stderr, "Shifting error token, "));
 | 
			
		||||
 | 
			
		||||
  *++yyvsp = yylval;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  /* Shift the error token. */
 | 
			
		||||
  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
 | 
			
		||||
 | 
			
		||||
  yystate = yyn;
 | 
			
		||||
  goto yynewstate;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1890,6 +1954,9 @@ yyacceptlab:
 | 
			
		|||
| yyabortlab -- YYABORT comes here.  |
 | 
			
		||||
`-----------------------------------*/
 | 
			
		||||
yyabortlab:
 | 
			
		||||
  yydestruct ("Error: discarding lookahead",
 | 
			
		||||
              yytoken, &yylval);
 | 
			
		||||
  yychar = YYEMPTY;
 | 
			
		||||
  yyresult = 1;
 | 
			
		||||
  goto yyreturn;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,6 +11,11 @@
 | 
			
		|||
#include <string.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
 | 
			
		||||
#define LKC_DIRECT_LINK
 | 
			
		||||
#include "lkc.h"
 | 
			
		||||
 | 
			
		||||
#include "zconf.hash.c"
 | 
			
		||||
 | 
			
		||||
#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
 | 
			
		||||
 | 
			
		||||
#define PRINTD		0x0001
 | 
			
		||||
| 
						 | 
				
			
			@ -88,10 +93,6 @@ static struct menu *current_menu, *current_entry;
 | 
			
		|||
%type <expr> if_expr
 | 
			
		||||
%type <token> end
 | 
			
		||||
 | 
			
		||||
%{
 | 
			
		||||
#define LKC_DIRECT_LINK
 | 
			
		||||
#include "lkc.h"
 | 
			
		||||
%}
 | 
			
		||||
%%
 | 
			
		||||
input:	  /* empty */
 | 
			
		||||
	| input block
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue