-rw-r--r-- | scripts/kconfig/zconf.l | 72 |
1 files changed, 54 insertions, 18 deletions
diff --git a/scripts/kconfig/zconf.l b/scripts/kconfig/zconf.l index 6d81e5e..1471630 100644 --- a/scripts/kconfig/zconf.l +++ b/scripts/kconfig/zconf.l @@ -1,25 +1,25 @@ -%option backup nostdinit noyywrap full ecs +%option backup nostdinit noyywrap never-interactive full ecs %option 8bit backup nodefault perf-report perf-report %x COMMAND HELP STRING PARAM %{ /* * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> * Released under the terms of the GNU GPL v2.0. */ +#include <limits.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define LKC_DIRECT_LINK #include "lkc.h" -#include "zconf.tab.h" #define START_STRSIZE 16 char *text; static char *text_ptr; static int text_size, text_asize; struct buffer { @@ -78,18 +78,16 @@ n [A-Za-z0-9_] [ \t]*\n current_file->lineno++; return T_EOL; [ \t]+ { BEGIN(COMMAND); } . { unput(yytext[0]); - //printf("new config: "); - //symbol_end(NULL); BEGIN(COMMAND); } <COMMAND>{ "mainmenu" BEGIN(PARAM); return T_MAINMENU; "menu" BEGIN(PARAM); return T_MENU; "endmenu" BEGIN(PARAM); return T_ENDMENU; @@ -138,42 +136,56 @@ n [A-Za-z0-9_] } \n BEGIN(INITIAL); current_file->lineno++; return T_EOL; --- /* ignore */ ({n}|[-/.])+ { alloc_string(yytext, yyleng); zconflval.string = text; return T_WORD; } + \\\n current_file->lineno++; . + <<EOF>> { + BEGIN(INITIAL); + } } <STRING>{ - [^'"\n\\]+ { + [^'"\\\n]+/\n { + append_string(yytext, yyleng); + zconflval.string = text; + return T_STRING; + } + [^'"\\\n]+ { append_string(yytext, yyleng); } + \\.?/\n { + append_string(yytext + 1, yyleng - 1); + zconflval.string = text; + return T_STRING; + } + \\.? { + append_string(yytext + 1, yyleng - 1); + } \'|\" { if (str == yytext[0]) { BEGIN(PARAM); zconflval.string = text; - //printf("s:%s\n", text); return T_STRING; } else append_string(yytext, 1); } - \\[ \t]*\n append_string(yytext+yyleng-1, 1); current_file->lineno++; - \\[ \t]* append_string(yytext+1, yyleng-1); - \\. append_string(yytext+1, 1); \n { - //printf(":%d: open string!\n", current_file->lineno+1); - exit(0); + printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno()); + current_file->lineno++; + BEGIN(INITIAL); + return T_EOL; } <<EOF>> { - //printf(":%d: open string!\n", current_file->lineno+1); - exit(0); + BEGIN(INITIAL); } } <HELP>{ [ \t]+ { ts = 0; for (i = 0; i < yyleng; i++) { if (yytext[i] == '\t') @@ -216,16 +228,17 @@ n [A-Za-z0-9_] } } <<EOF>> { if (current_buf) { zconf_endfile(); return T_EOF; } + fclose(yyin); yyterminate(); } %% void zconf_starthelp(void) { new_string(); last_ts = first_ts = 0; @@ -233,51 +246,73 @@ void zconf_starthelp(void) } static void zconf_endhelp(void) { zconflval.string = text; 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); } - //fprintf(stderr, "zconf_initscan: %s\n", name); current_buf = malloc(sizeof(*current_buf)); memset(current_buf, 0, sizeof(*current_buf)); current_file = file_lookup(name); current_file->lineno = 1; current_file->flags = FILE_BUSY; } void zconf_nextfile(const char *name) { struct file *file = file_lookup(name); struct buffer *buf = malloc(sizeof(*buf)); 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); } yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); buf->parent = current_buf; current_buf = buf; - //fprintf(stderr, "zconf_nextfile: %s\n", name); - if (file->flags & FILE_BUSY) { printf("recursive scan (%s)?\n", name); exit(1); } if (file->flags & FILE_SCANNED) { printf("file %s already scanned?\n", name); exit(1); } @@ -292,16 +327,17 @@ static struct buffer *zconf_endfile(void) struct buffer *parent; current_file->flags |= FILE_SCANNED; current_file->flags &= ~FILE_BUSY; current_file = current_file->parent; parent = current_buf->parent; if (parent) { + fclose(yyin); yy_delete_buffer(YY_CURRENT_BUFFER); yy_switch_to_buffer(parent->state); } free(current_buf); current_buf = parent; return parent; } |