diff options
author | Chris Packham <judge.packham@gmail.com> | 2020-12-09 08:24:45 (GMT) |
---|---|---|
committer | Chris Packham <judge.packham@gmail.com> | 2021-02-02 07:06:32 (GMT) |
commit | bbc4db133746d49893c3c9b70ef710747df27441 (patch) | |
tree | 6bd2bd5cc2970f7c896841939ce834754f678c3f /kconfig/zconf.l | |
parent | 689dc60f212db105243b60290480f29475578e0d (diff) |
kconfig: Sync with upstream v4.18
This commit introduces the following upstream changes:
73d1c580f92b kconfig: loop boundary condition fix
ecd53ac2f2c6 kconfig: handle P_SYMBOL in print_symbol()
b2d00d7c61c8 kconfig: fix line numbers for if-entries in menu tree
8593080c0fcf kconfig: fix localmodconfig
2ae89c7a82ea kconfig: Avoid format overflow warning from GCC 8.1
bb6d83dde191 kbuild: Move last word of nconfig help to the previous line
d6a0c8a1326b kconfig: Add testconfig into make help output
2bece88f89fa kconfig: test: add Kconfig macro language tests
915f64901eb3 kconfig: error out if a recursive variable references itself
a702a6176e2f kconfig: add 'filename' and 'lineno' built-in variables
1d6272e6fe43 kconfig: add 'info', 'warning-if', and 'error-if' built-in functions
82bc8bd82e5c kconfig: expand lefthand side of assignment statement
ed2a22f277c6 kconfig: support append assignment operator
1175c02506ff kconfig: support simply expanded variable
9ced3bddec08 kconfig: support user-defined function and recursively expanded variable
9de071536c87 kconfig: begin PARAM state only when seeing a command keyword
2fd5b09c201e kconfig: add 'shell' built-in function
e298f3b49def kconfig: add built-in function support
137c0118a900 kconfig: make default prompt of mainmenu less specific
5b31a9746756 kconfig: remove sym_expand_string_value()
96d8e48da55a kconfig: remove string expansion for mainmenu after yyparse()
bb222ceeb327 kconfig: remove string expansion in file_lookup()
104daea149c4 kconfig: reference environment variables directly and remove 'option env='
694c49a7c01c kconfig: drop localization support
1c5af5cf9308 kconfig: refactor ncurses package checks for building mconf and nconf
b464ef583dc7 kconfig: refactor GTK+ package checks for building gconf
0b669a5076fd kconfig: refactor Qt package checks for building qconf
Signed-off-by: Chris Packham <judge.packham@gmail.com>
Diffstat (limited to 'kconfig/zconf.l')
-rw-r--r-- | kconfig/zconf.l | 95 |
1 files changed, 89 insertions, 6 deletions
diff --git a/kconfig/zconf.l b/kconfig/zconf.l index 045093d..25bd2b8 100644 --- a/kconfig/zconf.l +++ b/kconfig/zconf.l @@ -1,13 +1,13 @@ %option nostdinit noyywrap never-interactive full ecs %option 8bit nodefault yylineno -%option noinput -%x COMMAND HELP STRING PARAM +%x COMMAND HELP STRING PARAM ASSIGN_VAL %{ /* * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> * Released under the terms of the GNU GPL v2.0. */ +#include <assert.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> @@ -35,6 +35,8 @@ struct buffer *current_buf; static int last_ts, first_ts; +static char *expand_token(const char *in, size_t n); +static void append_expanded_string(const char *in); static void zconf_endhelp(void); static void zconf_endfile(void); @@ -101,17 +103,28 @@ n [A-Za-z0-9_-] <COMMAND>{ {n}+ { const struct kconf_id *id = kconf_id_lookup(yytext, yyleng); - BEGIN(PARAM); current_pos.file = current_file; current_pos.lineno = yylineno; if (id && id->flags & TF_COMMAND) { + BEGIN(PARAM); yylval.id = id; return id->token; } alloc_string(yytext, yyleng); yylval.string = text; - return T_WORD; + return T_VARIABLE; } + ({n}|$)+ { + /* this token includes at least one '$' */ + yylval.string = expand_token(yytext, yyleng); + if (strlen(yylval.string)) + return T_VARIABLE; + free(yylval.string); + } + "=" { BEGIN(ASSIGN_VAL); yylval.flavor = VAR_RECURSIVE; return T_ASSIGN; } + ":=" { BEGIN(ASSIGN_VAL); yylval.flavor = VAR_SIMPLE; return T_ASSIGN; } + "+=" { BEGIN(ASSIGN_VAL); yylval.flavor = VAR_APPEND; return T_ASSIGN; } + [[:blank:]]+ . warn_ignored_character(*yytext); \n { BEGIN(INITIAL); @@ -119,6 +132,16 @@ n [A-Za-z0-9_-] } } +<ASSIGN_VAL>{ + [^[:blank:]\n]+.* { + alloc_string(yytext, yyleng); + yylval.string = text; + return T_ASSIGN_VAL; + } + \n { BEGIN(INITIAL); return T_EOL; } + . +} + <PARAM>{ "&&" return T_AND; "||" return T_OR; @@ -147,6 +170,13 @@ n [A-Za-z0-9_-] yylval.string = text; return T_WORD; } + ({n}|[/.$])+ { + /* this token includes at least one '$' */ + yylval.string = expand_token(yytext, yyleng); + if (strlen(yylval.string)) + return T_WORD; + free(yylval.string); + } #.* /* comment */ \\\n ; [[:blank:]]+ @@ -157,12 +187,13 @@ n [A-Za-z0-9_-] } <STRING>{ - [^'"\\\n]+/\n { + "$".* append_expanded_string(yytext); + [^$'"\\\n]+/\n { append_string(yytext, yyleng); yylval.string = text; return T_WORD_QUOTE; } - [^'"\\\n]+ { + [^$'"\\\n]+ { append_string(yytext, yyleng); } \\.?/\n { @@ -249,6 +280,58 @@ n [A-Za-z0-9_-] } %% +static char *expand_token(const char *in, size_t n) +{ + char *out; + int c; + char c2; + const char *rest, *end; + + new_string(); + append_string(in, n); + + /* get the whole line because we do not know the end of token. */ + while ((c = input()) != EOF) { + if (c == '\n') { + unput(c); + break; + } + c2 = c; + append_string(&c2, 1); + } + + rest = text; + out = expand_one_token(&rest); + + /* push back unused characters to the input stream */ + end = rest + strlen(rest); + while (end > rest) + unput(*--end); + + free(text); + + return out; +} + +static void append_expanded_string(const char *str) +{ + const char *end; + char *res; + + str++; + + res = expand_dollar(&str); + + /* push back unused characters to the input stream */ + end = str + strlen(str); + while (end > str) + unput(*--end); + + append_string(res, strlen(res)); + + free(res); +} + void zconf_starthelp(void) { new_string(); |