diff options
Diffstat (limited to 'extra/config/zconf.l')
-rw-r--r-- | extra/config/zconf.l | 58 |
1 files changed, 46 insertions, 12 deletions
diff --git a/extra/config/zconf.l b/extra/config/zconf.l index a412bf411..55517b287 100644 --- a/extra/config/zconf.l +++ b/extra/config/zconf.l @@ -7,6 +7,7 @@ * Released under the terms of the GNU GPL v2.0. */ +#include <limits.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -14,7 +15,6 @@ #define LKC_DIRECT_LINK #include "lkc.h" -#include "zconf.tab.h" #define START_STRSIZE 16 @@ -96,6 +96,7 @@ n [A-Za-z0-9_] "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; @@ -105,11 +106,17 @@ n [A-Za-z0-9_] "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}+ { alloc_string(yytext, yyleng); zconflval.string = text; @@ -141,6 +148,8 @@ n [A-Za-z0-9_] zconflval.string = text; return T_WORD; } + #.* /* comment */ + \\\n current_file->lineno++; . <<EOF>> { BEGIN(INITIAL); @@ -151,29 +160,30 @@ n [A-Za-z0-9_] [^'"\\\n]+/\n { append_string(yytext, yyleng); zconflval.string = text; - return T_STRING; + return T_WORD_QUOTE; } [^'"\\\n]+ { append_string(yytext, yyleng); } \\.?/\n { - append_string(yytext+1, yyleng); + append_string(yytext + 1, yyleng - 1); zconflval.string = text; - return T_STRING; + return T_WORD_QUOTE; } \\.? { - append_string(yytext+1, yyleng); + append_string(yytext + 1, yyleng - 1); } \'|\" { if (str == yytext[0]) { BEGIN(PARAM); zconflval.string = text; - return T_STRING; + return T_WORD_QUOTE; } else append_string(yytext, 1); } \n { printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno()); + current_file->lineno++; BEGIN(INITIAL); return T_EOL; } @@ -204,9 +214,8 @@ n [A-Za-z0-9_] } append_string(" ", ts); } - } - \n/[^ \t\n] { + [ \t]*\n/[^ \t\n] { current_file->lineno++; zconf_endhelp(); return T_HELPTEXT; @@ -246,12 +255,37 @@ void zconf_starthelp(void) static void zconf_endhelp(void) { zconflval.string = text; - BEGIN(INITIAL); + BEGIN(INITIAL); +} + + +/* + * Try to open specified file with following names: + * ./name + * $(srctree)/name + * The latter is used when srctree is separate from objtree + * when compiling the kernel. + * Return NULL if file is not found. + */ +FILE *zconf_fopen(const char *name) +{ + char *env, fullname[PATH_MAX+1]; + FILE *f; + + f = fopen(name, "r"); + if (!f && name[0] != '/') { + env = getenv(SRCTREE); + if (env) { + sprintf(fullname, "%s/%s", env, name); + f = fopen(fullname, "r"); + } + } + return f; } void zconf_initscan(const char *name) { - yyin = fopen(name, "r"); + yyin = zconf_fopen(name); if (!yyin) { printf("can't find file %s\n", name); exit(1); @@ -272,7 +306,7 @@ void zconf_nextfile(const char *name) memset(buf, 0, sizeof(*buf)); current_buf->state = YY_CURRENT_BUFFER; - yyin = fopen(name, "r"); + yyin = zconf_fopen(name); if (!yyin) { printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name); exit(1); @@ -318,7 +352,7 @@ static struct buffer *zconf_endfile(void) int zconf_lineno(void) { if (current_buf) - return current_file->lineno; + return current_file->lineno - 1; else return 0; } |