[PATCH] kconfig: improve error handling in the parser

Add a few error tokens to the parser to catch common errors and print more
descriptive error messages.

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:
Roman Zippel
2005-11-08 21:34:53 -08:00
committed by Linus Torvalds
parent 3370f9f0d9
commit a02f0570ae
6 changed files with 546 additions and 452 deletions

View File

@@ -18,6 +18,11 @@
#define START_STRSIZE 16
static struct {
struct file *file;
int lineno;
} current_pos;
static char *text;
static int text_size, text_asize;
@@ -31,7 +36,7 @@ struct buffer *current_buf;
static int last_ts, first_ts;
static void zconf_endhelp(void);
static struct buffer *zconf_endfile(void);
static void zconf_endfile(void);
void new_string(void)
{
@@ -70,10 +75,13 @@ n [A-Za-z0-9_]
int str = 0;
int ts, i;
[ \t]*#.*\n current_file->lineno++;
[ \t]*#.*\n |
[ \t]*\n {
current_file->lineno++;
return T_EOL;
}
[ \t]*#.*
[ \t]*\n current_file->lineno++; return T_EOL;
[ \t]+ {
BEGIN(COMMAND);
@@ -88,8 +96,10 @@ n [A-Za-z0-9_]
<COMMAND>{
{n}+ {
struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
BEGIN(PARAM);
current_pos.file = current_file;
current_pos.lineno = current_file->lineno;
if (id && id->flags & TF_COMMAND) {
BEGIN(PARAM);
zconflval.id = id;
return id->token;
}
@@ -98,7 +108,11 @@ n [A-Za-z0-9_]
return T_WORD;
}
.
\n current_file->lineno++; BEGIN(INITIAL);
\n {
BEGIN(INITIAL);
current_file->lineno++;
return T_EOL;
}
}
<PARAM>{
@@ -214,9 +228,9 @@ n [A-Za-z0-9_]
}
<<EOF>> {
if (current_buf) {
if (current_file) {
zconf_endfile();
return T_EOF;
return T_EOL;
}
fclose(yyin);
yyterminate();
@@ -307,7 +321,7 @@ void zconf_nextfile(const char *name)
current_file = file;
}
static struct buffer *zconf_endfile(void)
static void zconf_endfile(void)
{
struct buffer *parent;
@@ -323,22 +337,14 @@ static struct buffer *zconf_endfile(void)
}
free(current_buf);
current_buf = parent;
return parent;
}
int zconf_lineno(void)
{
if (current_buf)
return current_file->lineno - 1;
else
return 0;
return current_pos.lineno;
}
char *zconf_curname(void)
{
if (current_buf)
return current_file->name;
else
return "<none>";
return current_pos.file ? current_pos.file->name : "<none>";
}