[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
@ -114,7 +114,7 @@ gconf-objs := gconf.o kconfig_load.o zconf.tab.o
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
clean-files := lkc_defs.h qconf.moc .tmp_qtcheck \
|
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
|
# Needed for systems without gettext
|
||||||
KBUILD_HAVE_NLS := $(shell \
|
KBUILD_HAVE_NLS := $(shell \
|
||||||
@ -201,7 +201,7 @@ $(obj)/.tmp_gtkcheck:
|
|||||||
fi
|
fi
|
||||||
endif
|
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
|
$(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
|
# By default we use the _shipped versions, uncomment the following line if
|
||||||
# you are modifying the flex/bison src.
|
# you are modifying the flex/bison src.
|
||||||
# LKC_GENPARSER := 1
|
# LKC_GENPARSER := 1
|
||||||
@ -226,6 +226,7 @@ ifdef LKC_GENPARSER
|
|||||||
|
|
||||||
$(obj)/zconf.tab.c: $(src)/zconf.y
|
$(obj)/zconf.tab.c: $(src)/zconf.y
|
||||||
$(obj)/lex.zconf.c: $(src)/zconf.l
|
$(obj)/lex.zconf.c: $(src)/zconf.l
|
||||||
|
$(obj)/zconf.hash.c: $(src)/zconf.gperf
|
||||||
|
|
||||||
%.tab.c: %.y
|
%.tab.c: %.y
|
||||||
bison -l -b $* -p $(notdir $*) $<
|
bison -l -b $* -p $(notdir $*) $<
|
||||||
@ -235,4 +236,8 @@ lex.%.c: %.l
|
|||||||
flex -L -P$(notdir $*) -o$@ $<
|
flex -L -P$(notdir $*) -o$@ $<
|
||||||
cp $@ $@_shipped
|
cp $@ $@_shipped
|
||||||
|
|
||||||
|
%.hash.c: %.gperf
|
||||||
|
gperf < $< > $@
|
||||||
|
cp $@ $@_shipped
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -37,6 +37,16 @@ extern "C" {
|
|||||||
#define _(text) gettext(text)
|
#define _(text) gettext(text)
|
||||||
#define N_(text) (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);
|
int zconfparse(void);
|
||||||
void zconfdump(FILE *out);
|
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
|
#define START_STRSIZE 16
|
||||||
|
|
||||||
char *text;
|
static char *text;
|
||||||
static char *text_ptr;
|
|
||||||
static int text_size, text_asize;
|
static int text_size, text_asize;
|
||||||
|
|
||||||
struct buffer {
|
struct buffer {
|
||||||
@ -38,23 +37,22 @@ void new_string(void)
|
|||||||
{
|
{
|
||||||
text = malloc(START_STRSIZE);
|
text = malloc(START_STRSIZE);
|
||||||
text_asize = START_STRSIZE;
|
text_asize = START_STRSIZE;
|
||||||
text_ptr = text;
|
|
||||||
text_size = 0;
|
text_size = 0;
|
||||||
*text_ptr = 0;
|
*text = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void append_string(const char *str, int size)
|
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) {
|
||||||
|
new_size += START_STRSIZE - 1;
|
||||||
|
new_size &= -START_STRSIZE;
|
||||||
text = realloc(text, new_size);
|
text = realloc(text, new_size);
|
||||||
text_asize = new_size;
|
text_asize = new_size;
|
||||||
text_ptr = text + text_size;
|
|
||||||
}
|
}
|
||||||
memcpy(text_ptr, str, size);
|
memcpy(text + text_size, str, size);
|
||||||
text_ptr += size;
|
|
||||||
text_size += size;
|
text_size += size;
|
||||||
*text_ptr = 0;
|
text[text_size] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void alloc_string(const char *str, int size)
|
void alloc_string(const char *str, int size)
|
||||||
@ -88,36 +86,12 @@ n [A-Za-z0-9_]
|
|||||||
|
|
||||||
|
|
||||||
<COMMAND>{
|
<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}+ {
|
{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);
|
alloc_string(yytext, yyleng);
|
||||||
zconflval.string = text;
|
zconflval.string = text;
|
||||||
return T_WORD;
|
return T_WORD;
|
||||||
@ -134,8 +108,6 @@ n [A-Za-z0-9_]
|
|||||||
"!" return T_NOT;
|
"!" return T_NOT;
|
||||||
"=" return T_EQUAL;
|
"=" return T_EQUAL;
|
||||||
"!=" return T_UNEQUAL;
|
"!=" return T_UNEQUAL;
|
||||||
"if" return T_IF;
|
|
||||||
"on" return T_ON;
|
|
||||||
\"|\' {
|
\"|\' {
|
||||||
str = yytext[0];
|
str = yytext[0];
|
||||||
new_string();
|
new_string();
|
||||||
@ -144,6 +116,9 @@ n [A-Za-z0-9_]
|
|||||||
\n BEGIN(INITIAL); current_file->lineno++; return T_EOL;
|
\n BEGIN(INITIAL); current_file->lineno++; return T_EOL;
|
||||||
--- /* ignore */
|
--- /* ignore */
|
||||||
({n}|[-/.])+ {
|
({n}|[-/.])+ {
|
||||||
|
struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
|
||||||
|
if (id && id->flags & TF_PARAM)
|
||||||
|
return id->token;
|
||||||
alloc_string(yytext, yyleng);
|
alloc_string(yytext, yyleng);
|
||||||
zconflval.string = text;
|
zconflval.string = text;
|
||||||
return T_WORD;
|
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,
|
/* 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
|
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
|
||||||
@ -45,8 +45,7 @@
|
|||||||
/* Using locations. */
|
/* Using locations. */
|
||||||
#define YYLSP_NEEDED 0
|
#define YYLSP_NEEDED 0
|
||||||
|
|
||||||
/* If NAME_PREFIX is specified substitute the variables and functions
|
/* Substitute the variable and function names. */
|
||||||
names. */
|
|
||||||
#define yyparse zconfparse
|
#define yyparse zconfparse
|
||||||
#define yylex zconflex
|
#define yylex zconflex
|
||||||
#define yyerror zconferror
|
#define yyerror zconferror
|
||||||
@ -161,6 +160,11 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdbool.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(mask, fmt...) if (cdebug & (mask)) printf(fmt)
|
||||||
|
|
||||||
#define PRINTD 0x0001
|
#define PRINTD 0x0001
|
||||||
@ -202,7 +206,7 @@ typedef union YYSTYPE {
|
|||||||
struct expr *expr;
|
struct expr *expr;
|
||||||
struct menu *menu;
|
struct menu *menu;
|
||||||
} YYSTYPE;
|
} YYSTYPE;
|
||||||
/* Line 191 of yacc.c. */
|
/* Line 190 of yacc.c. */
|
||||||
|
|
||||||
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
|
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
|
||||||
# define YYSTYPE_IS_DECLARED 1
|
# define YYSTYPE_IS_DECLARED 1
|
||||||
@ -214,27 +218,26 @@ typedef union YYSTYPE {
|
|||||||
/* Copy the second part of user declarations. */
|
/* Copy the second part of user declarations. */
|
||||||
|
|
||||||
|
|
||||||
#define LKC_DIRECT_LINK
|
/* Line 213 of yacc.c. */
|
||||||
#include "lkc.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Line 214 of yacc.c. */
|
|
||||||
|
|
||||||
|
|
||||||
#if ! defined (yyoverflow) || YYERROR_VERBOSE
|
#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. */
|
/* The parser invokes alloca or malloc; define the necessary symbols. */
|
||||||
|
|
||||||
# if YYSTACK_USE_ALLOCA
|
# ifdef YYSTACK_USE_ALLOCA
|
||||||
# define YYSTACK_ALLOC alloca
|
# if YYSTACK_USE_ALLOCA
|
||||||
# else
|
# ifdef __GNUC__
|
||||||
# ifndef YYSTACK_USE_ALLOCA
|
# define YYSTACK_ALLOC __builtin_alloca
|
||||||
# if defined (alloca) || defined (_ALLOCA_H)
|
|
||||||
# define YYSTACK_ALLOC alloca
|
|
||||||
# else
|
# else
|
||||||
# ifdef __GNUC__
|
# define YYSTACK_ALLOC alloca
|
||||||
# define YYSTACK_ALLOC __builtin_alloca
|
|
||||||
# endif
|
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
@ -247,20 +250,20 @@ typedef union YYSTYPE {
|
|||||||
# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
|
# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
|
||||||
# define YYSIZE_T size_t
|
# define YYSIZE_T size_t
|
||||||
# endif
|
# endif
|
||||||
# define YYSTACK_ALLOC malloc
|
# define YYSTACK_ALLOC YYMALLOC
|
||||||
# define YYSTACK_FREE free
|
# define YYSTACK_FREE YYFREE
|
||||||
# endif
|
# endif
|
||||||
#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
|
#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
|
||||||
|
|
||||||
|
|
||||||
#if (! defined (yyoverflow) \
|
#if (! defined (yyoverflow) \
|
||||||
&& (! defined (__cplusplus) \
|
&& (! defined (__cplusplus) \
|
||||||
|| (YYSTYPE_IS_TRIVIAL)))
|
|| (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
|
||||||
|
|
||||||
/* A type that is properly aligned for any stack member. */
|
/* A type that is properly aligned for any stack member. */
|
||||||
union yyalloc
|
union yyalloc
|
||||||
{
|
{
|
||||||
short yyss;
|
short int yyss;
|
||||||
YYSTYPE yyvs;
|
YYSTYPE yyvs;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -270,13 +273,13 @@ union yyalloc
|
|||||||
/* The size of an array large to enough to hold all stacks, each with
|
/* The size of an array large to enough to hold all stacks, each with
|
||||||
N elements. */
|
N elements. */
|
||||||
# define YYSTACK_BYTES(N) \
|
# define YYSTACK_BYTES(N) \
|
||||||
((N) * (sizeof (short) + sizeof (YYSTYPE)) \
|
((N) * (sizeof (short int) + sizeof (YYSTYPE)) \
|
||||||
+ YYSTACK_GAP_MAXIMUM)
|
+ YYSTACK_GAP_MAXIMUM)
|
||||||
|
|
||||||
/* Copy COUNT objects from FROM to TO. The source and destination do
|
/* Copy COUNT objects from FROM to TO. The source and destination do
|
||||||
not overlap. */
|
not overlap. */
|
||||||
# ifndef YYCOPY
|
# ifndef YYCOPY
|
||||||
# if 1 < __GNUC__
|
# if defined (__GNUC__) && 1 < __GNUC__
|
||||||
# define YYCOPY(To, From, Count) \
|
# define YYCOPY(To, From, Count) \
|
||||||
__builtin_memcpy (To, From, (Count) * sizeof (*(From)))
|
__builtin_memcpy (To, From, (Count) * sizeof (*(From)))
|
||||||
# else
|
# else
|
||||||
@ -312,7 +315,7 @@ union yyalloc
|
|||||||
#if defined (__STDC__) || defined (__cplusplus)
|
#if defined (__STDC__) || defined (__cplusplus)
|
||||||
typedef signed char yysigned_char;
|
typedef signed char yysigned_char;
|
||||||
#else
|
#else
|
||||||
typedef short yysigned_char;
|
typedef short int yysigned_char;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* YYFINAL -- State number of the termination state. */
|
/* YYFINAL -- State number of the termination state. */
|
||||||
@ -374,7 +377,7 @@ static const unsigned char yytranslate[] =
|
|||||||
#if YYDEBUG
|
#if YYDEBUG
|
||||||
/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
|
/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
|
||||||
YYRHS. */
|
YYRHS. */
|
||||||
static const unsigned short yyprhs[] =
|
static const unsigned short int yyprhs[] =
|
||||||
{
|
{
|
||||||
0, 0, 3, 4, 7, 9, 11, 13, 17, 19,
|
0, 0, 3, 4, 7, 9, 11, 13, 17, 19,
|
||||||
21, 23, 26, 28, 30, 32, 34, 36, 38, 42,
|
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. */
|
/* 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,
|
0, 97, 97, 98, 101, 102, 103, 104, 105, 106,
|
||||||
104, 105, 109, 110, 111, 112, 113, 114, 120, 128,
|
107, 108, 112, 113, 114, 115, 116, 117, 123, 131,
|
||||||
134, 142, 152, 154, 155, 156, 157, 160, 166, 173,
|
137, 145, 155, 157, 158, 159, 160, 163, 169, 176,
|
||||||
179, 186, 192, 198, 204, 210, 216, 222, 230, 239,
|
182, 189, 195, 201, 207, 213, 219, 225, 233, 242,
|
||||||
245, 254, 255, 261, 263, 264, 265, 266, 269, 275,
|
248, 257, 258, 264, 266, 267, 268, 269, 272, 278,
|
||||||
281, 287, 293, 299, 301, 306, 315, 324, 325, 331,
|
284, 290, 296, 302, 304, 309, 318, 327, 328, 334,
|
||||||
333, 334, 335, 340, 347, 353, 362, 363, 369, 371,
|
336, 337, 338, 343, 350, 356, 365, 366, 372, 374,
|
||||||
372, 373, 374, 377, 383, 390, 397, 404, 410, 417,
|
375, 376, 377, 380, 386, 393, 400, 407, 413, 420,
|
||||||
418, 419, 422, 427, 432, 440, 442, 447, 448, 451,
|
421, 422, 425, 430, 435, 443, 445, 450, 451, 454,
|
||||||
452, 453, 457, 457, 459, 460, 463, 464, 465, 466,
|
455, 456, 460, 460, 462, 463, 466, 467, 468, 469,
|
||||||
467, 468, 469, 472, 473
|
470, 471, 472, 475, 476
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -448,29 +451,29 @@ static const unsigned short yyrline[] =
|
|||||||
First, the terminals, then, starting at YYNTOKENS, nonterminals. */
|
First, the terminals, then, starting at YYNTOKENS, nonterminals. */
|
||||||
static const char *const yytname[] =
|
static const char *const yytname[] =
|
||||||
{
|
{
|
||||||
"$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU",
|
"$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU",
|
||||||
"T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG",
|
"T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG",
|
||||||
"T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS",
|
"T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS",
|
||||||
"T_REQUIRES", "T_OPTIONAL", "T_PROMPT", "T_DEFAULT", "T_TRISTATE",
|
"T_REQUIRES", "T_OPTIONAL", "T_PROMPT", "T_DEFAULT", "T_TRISTATE",
|
||||||
"T_DEF_TRISTATE", "T_BOOLEAN", "T_DEF_BOOLEAN", "T_STRING", "T_INT",
|
"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_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_CLOSE_PAREN", "T_OPEN_PAREN", "T_ON", "T_SELECT", "T_RANGE", "T_OR",
|
||||||
"T_AND", "T_EQUAL", "T_NOT", "$accept", "input", "block",
|
"T_AND", "T_EQUAL", "T_NOT", "$accept", "input", "block", "common_block",
|
||||||
"common_block", "config_entry_start", "config_stmt",
|
"config_entry_start", "config_stmt", "menuconfig_entry_start",
|
||||||
"menuconfig_entry_start", "menuconfig_stmt", "config_option_list",
|
"menuconfig_stmt", "config_option_list", "config_option", "choice",
|
||||||
"config_option", "choice", "choice_entry", "choice_end", "choice_stmt",
|
"choice_entry", "choice_end", "choice_stmt", "choice_option_list",
|
||||||
"choice_option_list", "choice_option", "choice_block", "if", "if_end",
|
"choice_option", "choice_block", "if", "if_end", "if_stmt", "if_block",
|
||||||
"if_stmt", "if_block", "menu", "menu_entry", "menu_end", "menu_stmt",
|
"menu", "menu_entry", "menu_end", "menu_stmt", "menu_block", "source",
|
||||||
"menu_block", "source", "source_stmt", "comment", "comment_stmt",
|
"source_stmt", "comment", "comment_stmt", "help_start", "help",
|
||||||
"help_start", "help", "depends_list", "depends", "prompt_stmt_opt",
|
"depends_list", "depends", "prompt_stmt_opt", "prompt", "end",
|
||||||
"prompt", "end", "nl_or_eof", "if_expr", "expr", "symbol", 0
|
"nl_or_eof", "if_expr", "expr", "symbol", 0
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# ifdef YYPRINT
|
# ifdef YYPRINT
|
||||||
/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
|
/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
|
||||||
token YYLEX-NUM. */
|
token YYLEX-NUM. */
|
||||||
static const unsigned short yytoknum[] =
|
static const unsigned short int yytoknum[] =
|
||||||
{
|
{
|
||||||
0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
|
0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
|
||||||
265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
|
265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
|
||||||
@ -539,7 +542,7 @@ static const unsigned char yydefact[] =
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* YYDEFGOTO[NTERM-NUM]. */
|
/* YYDEFGOTO[NTERM-NUM]. */
|
||||||
static const short yydefgoto[] =
|
static const short int yydefgoto[] =
|
||||||
{
|
{
|
||||||
-1, 1, 17, 18, 19, 20, 21, 22, 52, 88,
|
-1, 1, 17, 18, 19, 20, 21, 22, 52, 88,
|
||||||
23, 24, 105, 25, 54, 98, 55, 26, 109, 27,
|
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
|
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
|
||||||
STATE-NUM. */
|
STATE-NUM. */
|
||||||
#define YYPACT_NINF -99
|
#define YYPACT_NINF -99
|
||||||
static const short yypact[] =
|
static const short int yypact[] =
|
||||||
{
|
{
|
||||||
-99, 48, -99, 38, 46, 46, -99, 46, -29, -99,
|
-99, 48, -99, 38, 46, 46, -99, 46, -29, -99,
|
||||||
46, -17, -3, -11, -99, -99, -99, -99, -99, -99,
|
46, -17, -3, -11, -99, -99, -99, -99, -99, -99,
|
||||||
@ -575,7 +578,7 @@ static const short yypact[] =
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* YYPGOTO[NTERM-NUM]. */
|
/* 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, 111, -99, -99, -99, -99, 178, -99,
|
||||||
-99, -99, -99, 91, -99, -99, -99, -99, -99, -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.
|
number is the opposite. If zero, do what YYDEFACT says.
|
||||||
If YYTABLE_NINF, syntax error. */
|
If YYTABLE_NINF, syntax error. */
|
||||||
#define YYTABLE_NINF -68
|
#define YYTABLE_NINF -68
|
||||||
static const short yytable[] =
|
static const short int yytable[] =
|
||||||
{
|
{
|
||||||
66, 67, 36, 42, 39, 40, 71, 41, 123, 124,
|
66, 67, 36, 42, 39, 40, 71, 41, 123, 124,
|
||||||
43, 44, 74, 75, 120, 154, 72, 46, 47, 69,
|
43, 44, 74, 75, 120, 154, 72, 46, 47, 69,
|
||||||
@ -687,7 +690,7 @@ static const unsigned char yystos[] =
|
|||||||
|
|
||||||
#define YYACCEPT goto yyacceptlab
|
#define YYACCEPT goto yyacceptlab
|
||||||
#define YYABORT goto yyabortlab
|
#define YYABORT goto yyabortlab
|
||||||
#define YYERROR goto yyerrlab1
|
#define YYERROR goto yyerrorlab
|
||||||
|
|
||||||
|
|
||||||
/* Like YYERROR except do call yyerror. This remains here temporarily
|
/* Like YYERROR except do call yyerror. This remains here temporarily
|
||||||
@ -715,20 +718,53 @@ do \
|
|||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
#define YYTERROR 1
|
#define YYTERROR 1
|
||||||
#define YYERRCODE 256
|
#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
|
#ifndef YYLLOC_DEFAULT
|
||||||
# define YYLLOC_DEFAULT(Current, Rhs, N) \
|
# define YYLLOC_DEFAULT(Current, Rhs, N) \
|
||||||
Current.first_line = Rhs[1].first_line; \
|
do \
|
||||||
Current.first_column = Rhs[1].first_column; \
|
if (N) \
|
||||||
Current.last_line = Rhs[N].last_line; \
|
{ \
|
||||||
Current.last_column = Rhs[N].last_column;
|
(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
|
#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. */
|
/* YYLEX -- calling `yylex' with the right arguments. */
|
||||||
|
|
||||||
#ifdef YYLEX_PARAM
|
#ifdef YYLEX_PARAM
|
||||||
@ -751,36 +787,30 @@ do { \
|
|||||||
YYFPRINTF Args; \
|
YYFPRINTF Args; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
# define YYDSYMPRINT(Args) \
|
# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
|
||||||
do { \
|
|
||||||
if (yydebug) \
|
|
||||||
yysymprint Args; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
# define YYDSYMPRINTF(Title, Token, Value, Location) \
|
|
||||||
do { \
|
do { \
|
||||||
if (yydebug) \
|
if (yydebug) \
|
||||||
{ \
|
{ \
|
||||||
YYFPRINTF (stderr, "%s ", Title); \
|
YYFPRINTF (stderr, "%s ", Title); \
|
||||||
yysymprint (stderr, \
|
yysymprint (stderr, \
|
||||||
Token, Value); \
|
Type, Value); \
|
||||||
YYFPRINTF (stderr, "\n"); \
|
YYFPRINTF (stderr, "\n"); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/*------------------------------------------------------------------.
|
/*------------------------------------------------------------------.
|
||||||
| yy_stack_print -- Print the state stack from its BOTTOM up to its |
|
| yy_stack_print -- Print the state stack from its BOTTOM up to its |
|
||||||
| TOP (cinluded). |
|
| TOP (included). |
|
||||||
`------------------------------------------------------------------*/
|
`------------------------------------------------------------------*/
|
||||||
|
|
||||||
#if defined (__STDC__) || defined (__cplusplus)
|
#if defined (__STDC__) || defined (__cplusplus)
|
||||||
static void
|
static void
|
||||||
yy_stack_print (short *bottom, short *top)
|
yy_stack_print (short int *bottom, short int *top)
|
||||||
#else
|
#else
|
||||||
static void
|
static void
|
||||||
yy_stack_print (bottom, top)
|
yy_stack_print (bottom, top)
|
||||||
short *bottom;
|
short int *bottom;
|
||||||
short *top;
|
short int *top;
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
YYFPRINTF (stderr, "Stack now");
|
YYFPRINTF (stderr, "Stack now");
|
||||||
@ -810,9 +840,9 @@ yy_reduce_print (yyrule)
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
int yyi;
|
int yyi;
|
||||||
unsigned int yylineno = yyrline[yyrule];
|
unsigned int yylno = yyrline[yyrule];
|
||||||
YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
|
YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
|
||||||
yyrule - 1, yylineno);
|
yyrule - 1, yylno);
|
||||||
/* Print the symbols being reduced, and their result. */
|
/* Print the symbols being reduced, and their result. */
|
||||||
for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
|
for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
|
||||||
YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
|
YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
|
||||||
@ -830,8 +860,7 @@ do { \
|
|||||||
int yydebug;
|
int yydebug;
|
||||||
#else /* !YYDEBUG */
|
#else /* !YYDEBUG */
|
||||||
# define YYDPRINTF(Args)
|
# define YYDPRINTF(Args)
|
||||||
# define YYDSYMPRINT(Args)
|
# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
|
||||||
# define YYDSYMPRINTF(Title, Token, Value, Location)
|
|
||||||
# define YY_STACK_PRINT(Bottom, Top)
|
# define YY_STACK_PRINT(Bottom, Top)
|
||||||
# define YY_REDUCE_PRINT(Rule)
|
# define YY_REDUCE_PRINT(Rule)
|
||||||
#endif /* !YYDEBUG */
|
#endif /* !YYDEBUG */
|
||||||
@ -849,10 +878,6 @@ int yydebug;
|
|||||||
SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
|
SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
|
||||||
evaluated with infinite-precision integer arithmetic. */
|
evaluated with infinite-precision integer arithmetic. */
|
||||||
|
|
||||||
#if YYMAXDEPTH == 0
|
|
||||||
# undef YYMAXDEPTH
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef YYMAXDEPTH
|
#ifndef YYMAXDEPTH
|
||||||
# define YYMAXDEPTH 10000
|
# define YYMAXDEPTH 10000
|
||||||
#endif
|
#endif
|
||||||
@ -934,15 +959,15 @@ yysymprint (yyoutput, yytype, yyvaluep)
|
|||||||
(void) yyvaluep;
|
(void) yyvaluep;
|
||||||
|
|
||||||
if (yytype < YYNTOKENS)
|
if (yytype < YYNTOKENS)
|
||||||
{
|
YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
|
||||||
YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
|
|
||||||
# ifdef YYPRINT
|
|
||||||
YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
|
|
||||||
# endif
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
|
YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
|
||||||
|
|
||||||
|
|
||||||
|
# ifdef YYPRINT
|
||||||
|
if (yytype < YYNTOKENS)
|
||||||
|
YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
|
||||||
|
# endif
|
||||||
switch (yytype)
|
switch (yytype)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
@ -958,10 +983,11 @@ yysymprint (yyoutput, yytype, yyvaluep)
|
|||||||
|
|
||||||
#if defined (__STDC__) || defined (__cplusplus)
|
#if defined (__STDC__) || defined (__cplusplus)
|
||||||
static void
|
static void
|
||||||
yydestruct (int yytype, YYSTYPE *yyvaluep)
|
yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
|
||||||
#else
|
#else
|
||||||
static void
|
static void
|
||||||
yydestruct (yytype, yyvaluep)
|
yydestruct (yymsg, yytype, yyvaluep)
|
||||||
|
const char *yymsg;
|
||||||
int yytype;
|
int yytype;
|
||||||
YYSTYPE *yyvaluep;
|
YYSTYPE *yyvaluep;
|
||||||
#endif
|
#endif
|
||||||
@ -969,6 +995,10 @@ yydestruct (yytype, yyvaluep)
|
|||||||
/* Pacify ``unused variable'' warnings. */
|
/* Pacify ``unused variable'' warnings. */
|
||||||
(void) yyvaluep;
|
(void) yyvaluep;
|
||||||
|
|
||||||
|
if (!yymsg)
|
||||||
|
yymsg = "Deleting";
|
||||||
|
YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
|
||||||
|
|
||||||
switch (yytype)
|
switch (yytype)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -996,10 +1026,10 @@ int yyparse ();
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* The lookahead symbol. */
|
/* The look-ahead symbol. */
|
||||||
int yychar;
|
int yychar;
|
||||||
|
|
||||||
/* The semantic value of the lookahead symbol. */
|
/* The semantic value of the look-ahead symbol. */
|
||||||
YYSTYPE yylval;
|
YYSTYPE yylval;
|
||||||
|
|
||||||
/* Number of syntax errors so far. */
|
/* Number of syntax errors so far. */
|
||||||
@ -1035,7 +1065,7 @@ yyparse ()
|
|||||||
int yyresult;
|
int yyresult;
|
||||||
/* Number of tokens to shift before error messages enabled. */
|
/* Number of tokens to shift before error messages enabled. */
|
||||||
int yyerrstatus;
|
int yyerrstatus;
|
||||||
/* Lookahead token as an internal (translated) token number. */
|
/* Look-ahead token as an internal (translated) token number. */
|
||||||
int yytoken = 0;
|
int yytoken = 0;
|
||||||
|
|
||||||
/* Three stacks and their tools:
|
/* Three stacks and their tools:
|
||||||
@ -1047,9 +1077,9 @@ yyparse ()
|
|||||||
to reallocate them elsewhere. */
|
to reallocate them elsewhere. */
|
||||||
|
|
||||||
/* The state stack. */
|
/* The state stack. */
|
||||||
short yyssa[YYINITDEPTH];
|
short int yyssa[YYINITDEPTH];
|
||||||
short *yyss = yyssa;
|
short int *yyss = yyssa;
|
||||||
register short *yyssp;
|
register short int *yyssp;
|
||||||
|
|
||||||
/* The semantic value stack. */
|
/* The semantic value stack. */
|
||||||
YYSTYPE yyvsa[YYINITDEPTH];
|
YYSTYPE yyvsa[YYINITDEPTH];
|
||||||
@ -1086,6 +1116,9 @@ yyparse ()
|
|||||||
yyssp = yyss;
|
yyssp = yyss;
|
||||||
yyvsp = yyvs;
|
yyvsp = yyvs;
|
||||||
|
|
||||||
|
|
||||||
|
yyvsp[0] = yylval;
|
||||||
|
|
||||||
goto yysetstate;
|
goto yysetstate;
|
||||||
|
|
||||||
/*------------------------------------------------------------.
|
/*------------------------------------------------------------.
|
||||||
@ -1111,7 +1144,7 @@ yyparse ()
|
|||||||
these so that the &'s don't force the real ones into
|
these so that the &'s don't force the real ones into
|
||||||
memory. */
|
memory. */
|
||||||
YYSTYPE *yyvs1 = yyvs;
|
YYSTYPE *yyvs1 = yyvs;
|
||||||
short *yyss1 = yyss;
|
short int *yyss1 = yyss;
|
||||||
|
|
||||||
|
|
||||||
/* Each stack pointer address is followed by the size of the
|
/* Each stack pointer address is followed by the size of the
|
||||||
@ -1139,7 +1172,7 @@ yyparse ()
|
|||||||
yystacksize = YYMAXDEPTH;
|
yystacksize = YYMAXDEPTH;
|
||||||
|
|
||||||
{
|
{
|
||||||
short *yyss1 = yyss;
|
short int *yyss1 = yyss;
|
||||||
union yyalloc *yyptr =
|
union yyalloc *yyptr =
|
||||||
(union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
|
(union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
|
||||||
if (! yyptr)
|
if (! yyptr)
|
||||||
@ -1175,18 +1208,18 @@ yyparse ()
|
|||||||
yybackup:
|
yybackup:
|
||||||
|
|
||||||
/* Do appropriate processing given the current state. */
|
/* 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: */
|
/* 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];
|
yyn = yypact[yystate];
|
||||||
if (yyn == YYPACT_NINF)
|
if (yyn == YYPACT_NINF)
|
||||||
goto yydefault;
|
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)
|
if (yychar == YYEMPTY)
|
||||||
{
|
{
|
||||||
YYDPRINTF ((stderr, "Reading a token: "));
|
YYDPRINTF ((stderr, "Reading a token: "));
|
||||||
@ -1201,7 +1234,7 @@ yybackup:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
yytoken = YYTRANSLATE (yychar);
|
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
|
/* If the proper action on seeing token YYTOKEN is to reduce or to
|
||||||
@ -1221,8 +1254,8 @@ yybackup:
|
|||||||
if (yyn == YYFINAL)
|
if (yyn == YYFINAL)
|
||||||
YYACCEPT;
|
YYACCEPT;
|
||||||
|
|
||||||
/* Shift the lookahead token. */
|
/* Shift the look-ahead token. */
|
||||||
YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken]));
|
YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
|
||||||
|
|
||||||
/* Discard the token being shifted unless it is eof. */
|
/* Discard the token being shifted unless it is eof. */
|
||||||
if (yychar != YYEOF)
|
if (yychar != YYEOF)
|
||||||
@ -1294,10 +1327,10 @@ yyreduce:
|
|||||||
case 18:
|
case 18:
|
||||||
|
|
||||||
{
|
{
|
||||||
struct symbol *sym = sym_lookup(yyvsp[-1].string, 0);
|
struct symbol *sym = sym_lookup((yyvsp[-1].string), 0);
|
||||||
sym->flags |= SYMBOL_OPTIONAL;
|
sym->flags |= SYMBOL_OPTIONAL;
|
||||||
menu_add_entry(sym);
|
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;
|
break;
|
||||||
|
|
||||||
@ -1312,10 +1345,10 @@ yyreduce:
|
|||||||
case 20:
|
case 20:
|
||||||
|
|
||||||
{
|
{
|
||||||
struct symbol *sym = sym_lookup(yyvsp[-1].string, 0);
|
struct symbol *sym = sym_lookup((yyvsp[-1].string), 0);
|
||||||
sym->flags |= SYMBOL_OPTIONAL;
|
sym->flags |= SYMBOL_OPTIONAL;
|
||||||
menu_add_entry(sym);
|
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;
|
break;
|
||||||
|
|
||||||
@ -1342,7 +1375,7 @@ yyreduce:
|
|||||||
case 28:
|
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);
|
menu_set_type(S_TRISTATE);
|
||||||
printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
|
printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
|
||||||
;}
|
;}
|
||||||
@ -1359,7 +1392,7 @@ yyreduce:
|
|||||||
case 30:
|
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);
|
menu_set_type(S_BOOLEAN);
|
||||||
printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
|
printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
|
||||||
;}
|
;}
|
||||||
@ -1392,7 +1425,7 @@ yyreduce:
|
|||||||
case 34:
|
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());
|
printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
|
||||||
;}
|
;}
|
||||||
break;
|
break;
|
||||||
@ -1400,7 +1433,7 @@ yyreduce:
|
|||||||
case 35:
|
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());
|
printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
|
||||||
;}
|
;}
|
||||||
break;
|
break;
|
||||||
@ -1408,7 +1441,7 @@ yyreduce:
|
|||||||
case 36:
|
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());
|
printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
|
||||||
;}
|
;}
|
||||||
break;
|
break;
|
||||||
@ -1416,7 +1449,7 @@ yyreduce:
|
|||||||
case 37:
|
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());
|
printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
|
||||||
;}
|
;}
|
||||||
break;
|
break;
|
||||||
@ -1443,7 +1476,7 @@ yyreduce:
|
|||||||
case 40:
|
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();
|
menu_end_menu();
|
||||||
printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
|
printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
|
||||||
}
|
}
|
||||||
@ -1461,7 +1494,7 @@ yyreduce:
|
|||||||
case 48:
|
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());
|
printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
|
||||||
;}
|
;}
|
||||||
break;
|
break;
|
||||||
@ -1493,7 +1526,7 @@ yyreduce:
|
|||||||
case 52:
|
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());
|
printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
|
||||||
;}
|
;}
|
||||||
break;
|
break;
|
||||||
@ -1503,7 +1536,7 @@ yyreduce:
|
|||||||
{
|
{
|
||||||
printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
|
printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
|
||||||
menu_add_entry(NULL);
|
menu_add_entry(NULL);
|
||||||
menu_add_dep(yyvsp[-1].expr);
|
menu_add_dep((yyvsp[-1].expr));
|
||||||
menu_end_entry();
|
menu_end_entry();
|
||||||
menu_add_menu();
|
menu_add_menu();
|
||||||
;}
|
;}
|
||||||
@ -1512,7 +1545,7 @@ yyreduce:
|
|||||||
case 56:
|
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();
|
menu_end_menu();
|
||||||
printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
|
printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
|
||||||
}
|
}
|
||||||
@ -1531,7 +1564,7 @@ yyreduce:
|
|||||||
|
|
||||||
{
|
{
|
||||||
menu_add_entry(NULL);
|
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());
|
printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
|
||||||
;}
|
;}
|
||||||
break;
|
break;
|
||||||
@ -1547,7 +1580,7 @@ yyreduce:
|
|||||||
case 65:
|
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();
|
menu_end_menu();
|
||||||
printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
|
printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
|
||||||
}
|
}
|
||||||
@ -1570,15 +1603,15 @@ yyreduce:
|
|||||||
case 73:
|
case 73:
|
||||||
|
|
||||||
{
|
{
|
||||||
yyval.string = yyvsp[-1].string;
|
(yyval.string) = (yyvsp[-1].string);
|
||||||
printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string);
|
printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
|
||||||
;}
|
;}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 74:
|
case 74:
|
||||||
|
|
||||||
{
|
{
|
||||||
zconf_nextfile(yyvsp[0].string);
|
zconf_nextfile((yyvsp[0].string));
|
||||||
;}
|
;}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1586,7 +1619,7 @@ yyreduce:
|
|||||||
|
|
||||||
{
|
{
|
||||||
menu_add_entry(NULL);
|
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());
|
printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
|
||||||
;}
|
;}
|
||||||
break;
|
break;
|
||||||
@ -1609,14 +1642,14 @@ yyreduce:
|
|||||||
case 78:
|
case 78:
|
||||||
|
|
||||||
{
|
{
|
||||||
current_entry->sym->help = yyvsp[0].string;
|
current_entry->sym->help = (yyvsp[0].string);
|
||||||
;}
|
;}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 82:
|
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());
|
printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
|
||||||
;}
|
;}
|
||||||
break;
|
break;
|
||||||
@ -1624,7 +1657,7 @@ yyreduce:
|
|||||||
case 83:
|
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());
|
printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno());
|
||||||
;}
|
;}
|
||||||
break;
|
break;
|
||||||
@ -1632,7 +1665,7 @@ yyreduce:
|
|||||||
case 84:
|
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());
|
printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno());
|
||||||
;}
|
;}
|
||||||
break;
|
break;
|
||||||
@ -1640,84 +1673,84 @@ yyreduce:
|
|||||||
case 86:
|
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;
|
break;
|
||||||
|
|
||||||
case 89:
|
case 89:
|
||||||
|
|
||||||
{ yyval.token = T_ENDMENU; ;}
|
{ (yyval.token) = T_ENDMENU; ;}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 90:
|
case 90:
|
||||||
|
|
||||||
{ yyval.token = T_ENDCHOICE; ;}
|
{ (yyval.token) = T_ENDCHOICE; ;}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 91:
|
case 91:
|
||||||
|
|
||||||
{ yyval.token = T_ENDIF; ;}
|
{ (yyval.token) = T_ENDIF; ;}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 94:
|
case 94:
|
||||||
|
|
||||||
{ yyval.expr = NULL; ;}
|
{ (yyval.expr) = NULL; ;}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 95:
|
case 95:
|
||||||
|
|
||||||
{ yyval.expr = yyvsp[0].expr; ;}
|
{ (yyval.expr) = (yyvsp[0].expr); ;}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 96:
|
case 96:
|
||||||
|
|
||||||
{ yyval.expr = expr_alloc_symbol(yyvsp[0].symbol); ;}
|
{ (yyval.expr) = expr_alloc_symbol((yyvsp[0].symbol)); ;}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 97:
|
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;
|
break;
|
||||||
|
|
||||||
case 98:
|
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;
|
break;
|
||||||
|
|
||||||
case 99:
|
case 99:
|
||||||
|
|
||||||
{ yyval.expr = yyvsp[-1].expr; ;}
|
{ (yyval.expr) = (yyvsp[-1].expr); ;}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 100:
|
case 100:
|
||||||
|
|
||||||
{ yyval.expr = expr_alloc_one(E_NOT, yyvsp[0].expr); ;}
|
{ (yyval.expr) = expr_alloc_one(E_NOT, (yyvsp[0].expr)); ;}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 101:
|
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;
|
break;
|
||||||
|
|
||||||
case 102:
|
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;
|
break;
|
||||||
|
|
||||||
case 103:
|
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;
|
break;
|
||||||
|
|
||||||
case 104:
|
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;
|
break;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Line 999 of yacc.c. */
|
/* Line 1037 of yacc.c. */
|
||||||
|
|
||||||
|
|
||||||
yyvsp -= yylen;
|
yyvsp -= yylen;
|
||||||
@ -1759,18 +1792,33 @@ yyerrlab:
|
|||||||
{
|
{
|
||||||
YYSIZE_T yysize = 0;
|
YYSIZE_T yysize = 0;
|
||||||
int yytype = YYTRANSLATE (yychar);
|
int yytype = YYTRANSLATE (yychar);
|
||||||
|
const char* yyprefix;
|
||||||
char *yymsg;
|
char *yymsg;
|
||||||
int yyx, yycount;
|
int yyx;
|
||||||
|
|
||||||
yycount = 0;
|
|
||||||
/* Start YYX at -YYN if negative to avoid negative indexes in
|
/* Start YYX at -YYN if negative to avoid negative indexes in
|
||||||
YYCHECK. */
|
YYCHECK. */
|
||||||
for (yyx = yyn < 0 ? -yyn : 0;
|
int yyxbegin = yyn < 0 ? -yyn : 0;
|
||||||
yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
|
|
||||||
|
/* 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)
|
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
|
||||||
yysize += yystrlen (yytname[yyx]) + 15, yycount++;
|
{
|
||||||
yysize += yystrlen ("syntax error, unexpected ") + 1;
|
yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]);
|
||||||
yysize += yystrlen (yytname[yytype]);
|
yycount += 1;
|
||||||
|
if (yycount == 5)
|
||||||
|
{
|
||||||
|
yysize = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
yysize += (sizeof ("syntax error, unexpected ")
|
||||||
|
+ yystrlen (yytname[yytype]));
|
||||||
yymsg = (char *) YYSTACK_ALLOC (yysize);
|
yymsg = (char *) YYSTACK_ALLOC (yysize);
|
||||||
if (yymsg != 0)
|
if (yymsg != 0)
|
||||||
{
|
{
|
||||||
@ -1779,16 +1827,13 @@ yyerrlab:
|
|||||||
|
|
||||||
if (yycount < 5)
|
if (yycount < 5)
|
||||||
{
|
{
|
||||||
yycount = 0;
|
yyprefix = ", expecting ";
|
||||||
for (yyx = yyn < 0 ? -yyn : 0;
|
for (yyx = yyxbegin; yyx < yyxend; ++yyx)
|
||||||
yyx < (int) (sizeof (yytname) / sizeof (char *));
|
|
||||||
yyx++)
|
|
||||||
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
|
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
|
||||||
{
|
{
|
||||||
const char *yyq = ! yycount ? ", expecting " : " or ";
|
yyp = yystpcpy (yyp, yyprefix);
|
||||||
yyp = yystpcpy (yyp, yyq);
|
|
||||||
yyp = yystpcpy (yyp, yytname[yyx]);
|
yyp = yystpcpy (yyp, yytname[yyx]);
|
||||||
yycount++;
|
yyprefix = " or ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
yyerror (yymsg);
|
yyerror (yymsg);
|
||||||
@ -1806,38 +1851,57 @@ yyerrlab:
|
|||||||
|
|
||||||
if (yyerrstatus == 3)
|
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. */
|
error, discard it. */
|
||||||
|
|
||||||
/* Return failure if at end of input. */
|
if (yychar <= YYEOF)
|
||||||
if (yychar == YYEOF)
|
|
||||||
{
|
{
|
||||||
/* Pop the error token. */
|
/* If at end of input, pop the error token,
|
||||||
YYPOPSTACK;
|
then the rest of the stack, then return failure. */
|
||||||
/* Pop the rest of the stack. */
|
if (yychar == YYEOF)
|
||||||
while (yyss < yyssp)
|
for (;;)
|
||||||
{
|
{
|
||||||
YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
|
|
||||||
yydestruct (yystos[*yyssp], yyvsp);
|
YYPOPSTACK;
|
||||||
YYPOPSTACK;
|
if (yyssp == yyss)
|
||||||
}
|
YYABORT;
|
||||||
YYABORT;
|
yydestruct ("Error: popping",
|
||||||
|
yystos[*yyssp], yyvsp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);
|
{
|
||||||
yydestruct (yytoken, &yylval);
|
yydestruct ("Error: discarding", yytoken, &yylval);
|
||||||
yychar = YYEMPTY;
|
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. */
|
token. */
|
||||||
goto yyerrlab1;
|
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:
|
yyerrlab1:
|
||||||
yyerrstatus = 3; /* Each real token shifted decrements this. */
|
yyerrstatus = 3; /* Each real token shifted decrements this. */
|
||||||
|
|
||||||
@ -1859,22 +1923,22 @@ yyerrlab1:
|
|||||||
if (yyssp == yyss)
|
if (yyssp == yyss)
|
||||||
YYABORT;
|
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);
|
YY_STACK_PRINT (yyss, yyssp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (yyn == YYFINAL)
|
if (yyn == YYFINAL)
|
||||||
YYACCEPT;
|
YYACCEPT;
|
||||||
|
|
||||||
YYDPRINTF ((stderr, "Shifting error token, "));
|
|
||||||
|
|
||||||
*++yyvsp = yylval;
|
*++yyvsp = yylval;
|
||||||
|
|
||||||
|
|
||||||
|
/* Shift the error token. */
|
||||||
|
YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
|
||||||
|
|
||||||
yystate = yyn;
|
yystate = yyn;
|
||||||
goto yynewstate;
|
goto yynewstate;
|
||||||
|
|
||||||
@ -1890,6 +1954,9 @@ yyacceptlab:
|
|||||||
| yyabortlab -- YYABORT comes here. |
|
| yyabortlab -- YYABORT comes here. |
|
||||||
`-----------------------------------*/
|
`-----------------------------------*/
|
||||||
yyabortlab:
|
yyabortlab:
|
||||||
|
yydestruct ("Error: discarding lookahead",
|
||||||
|
yytoken, &yylval);
|
||||||
|
yychar = YYEMPTY;
|
||||||
yyresult = 1;
|
yyresult = 1;
|
||||||
goto yyreturn;
|
goto yyreturn;
|
||||||
|
|
||||||
|
@ -11,6 +11,11 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdbool.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(mask, fmt...) if (cdebug & (mask)) printf(fmt)
|
||||||
|
|
||||||
#define PRINTD 0x0001
|
#define PRINTD 0x0001
|
||||||
@ -88,10 +93,6 @@ static struct menu *current_menu, *current_entry;
|
|||||||
%type <expr> if_expr
|
%type <expr> if_expr
|
||||||
%type <token> end
|
%type <token> end
|
||||||
|
|
||||||
%{
|
|
||||||
#define LKC_DIRECT_LINK
|
|
||||||
#include "lkc.h"
|
|
||||||
%}
|
|
||||||
%%
|
%%
|
||||||
input: /* empty */
|
input: /* empty */
|
||||||
| input block
|
| input block
|
||||||
|
Loading…
Reference in New Issue
Block a user