diff options
author | Ron Yorston <rmy@pobox.com> | 2015-11-06 16:38:39 +0000 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2015-11-06 16:38:39 +0000 |
commit | d6c9296168ad0a770967714515ffa1fca5e60145 (patch) | |
tree | d72556385814a18a0ac039ee0b43ef6f561c317f /shell/ash.c | |
parent | b60a9b30ba420808c4c9f540dcf92b11ee87a87b (diff) | |
parent | 196e400441652946b9c7ad7bc2d78c73885f2359 (diff) | |
download | busybox-w32-d6c9296168ad0a770967714515ffa1fca5e60145.tar.gz busybox-w32-d6c9296168ad0a770967714515ffa1fca5e60145.tar.bz2 busybox-w32-d6c9296168ad0a770967714515ffa1fca5e60145.zip |
Merge branch 'busybox' into merge
Diffstat (limited to 'shell/ash.c')
-rw-r--r-- | shell/ash.c | 101 |
1 files changed, 70 insertions, 31 deletions
diff --git a/shell/ash.c b/shell/ash.c index 08b6aa430..de5c44ead 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -8073,36 +8073,40 @@ changepath(const char *new) | |||
8073 | clearcmdentry(firstchange); | 8073 | clearcmdentry(firstchange); |
8074 | builtinloc = idx_bltin; | 8074 | builtinloc = idx_bltin; |
8075 | } | 8075 | } |
8076 | 8076 | enum { | |
8077 | #define TEOF 0 | 8077 | TEOF, |
8078 | #define TNL 1 | 8078 | TNL, |
8079 | #define TREDIR 2 | 8079 | TREDIR, |
8080 | #define TWORD 3 | 8080 | TWORD, |
8081 | #define TSEMI 4 | 8081 | TSEMI, |
8082 | #define TBACKGND 5 | 8082 | TBACKGND, |
8083 | #define TAND 6 | 8083 | TAND, |
8084 | #define TOR 7 | 8084 | TOR, |
8085 | #define TPIPE 8 | 8085 | TPIPE, |
8086 | #define TLP 9 | 8086 | TLP, |
8087 | #define TRP 10 | 8087 | TRP, |
8088 | #define TENDCASE 11 | 8088 | TENDCASE, |
8089 | #define TENDBQUOTE 12 | 8089 | TENDBQUOTE, |
8090 | #define TNOT 13 | 8090 | TNOT, |
8091 | #define TCASE 14 | 8091 | TCASE, |
8092 | #define TDO 15 | 8092 | TDO, |
8093 | #define TDONE 16 | 8093 | TDONE, |
8094 | #define TELIF 17 | 8094 | TELIF, |
8095 | #define TELSE 18 | 8095 | TELSE, |
8096 | #define TESAC 19 | 8096 | TESAC, |
8097 | #define TFI 20 | 8097 | TFI, |
8098 | #define TFOR 21 | 8098 | TFOR, |
8099 | #define TIF 22 | 8099 | #if ENABLE_ASH_BASH_COMPAT |
8100 | #define TIN 23 | 8100 | TFUNCTION, |
8101 | #define TTHEN 24 | 8101 | #endif |
8102 | #define TUNTIL 25 | 8102 | TIF, |
8103 | #define TWHILE 26 | 8103 | TIN, |
8104 | #define TBEGIN 27 | 8104 | TTHEN, |
8105 | #define TEND 28 | 8105 | TUNTIL, |
8106 | TWHILE, | ||
8107 | TBEGIN, | ||
8108 | TEND | ||
8109 | }; | ||
8106 | typedef smallint token_id_t; | 8110 | typedef smallint token_id_t; |
8107 | 8111 | ||
8108 | /* first char is indicating which tokens mark the end of a list */ | 8112 | /* first char is indicating which tokens mark the end of a list */ |
@@ -8131,6 +8135,9 @@ static const char *const tokname_array[] = { | |||
8131 | "\1esac", | 8135 | "\1esac", |
8132 | "\1fi", | 8136 | "\1fi", |
8133 | "\0for", | 8137 | "\0for", |
8138 | #if ENABLE_ASH_BASH_COMPAT | ||
8139 | "\0function", | ||
8140 | #endif | ||
8134 | "\0if", | 8141 | "\0if", |
8135 | "\0in", | 8142 | "\0in", |
8136 | "\1then", | 8143 | "\1then", |
@@ -11205,6 +11212,7 @@ simplecmd(void) | |||
11205 | int savecheckkwd; | 11212 | int savecheckkwd; |
11206 | #if ENABLE_ASH_BASH_COMPAT | 11213 | #if ENABLE_ASH_BASH_COMPAT |
11207 | smallint double_brackets_flag = 0; | 11214 | smallint double_brackets_flag = 0; |
11215 | smallint function_flag = 0; | ||
11208 | #endif | 11216 | #endif |
11209 | 11217 | ||
11210 | args = NULL; | 11218 | args = NULL; |
@@ -11221,6 +11229,11 @@ simplecmd(void) | |||
11221 | t = readtoken(); | 11229 | t = readtoken(); |
11222 | switch (t) { | 11230 | switch (t) { |
11223 | #if ENABLE_ASH_BASH_COMPAT | 11231 | #if ENABLE_ASH_BASH_COMPAT |
11232 | case TFUNCTION: | ||
11233 | if (peektoken() != TWORD) | ||
11234 | raise_error_unexpected_syntax(TWORD); | ||
11235 | function_flag = 1; | ||
11236 | break; | ||
11224 | case TAND: /* "&&" */ | 11237 | case TAND: /* "&&" */ |
11225 | case TOR: /* "||" */ | 11238 | case TOR: /* "||" */ |
11226 | if (!double_brackets_flag) { | 11239 | if (!double_brackets_flag) { |
@@ -11249,6 +11262,29 @@ simplecmd(void) | |||
11249 | app = &n->narg.next; | 11262 | app = &n->narg.next; |
11250 | savecheckkwd = 0; | 11263 | savecheckkwd = 0; |
11251 | } | 11264 | } |
11265 | #if ENABLE_ASH_BASH_COMPAT | ||
11266 | if (function_flag) { | ||
11267 | checkkwd = CHKNL | CHKKWD; | ||
11268 | switch (peektoken()) { | ||
11269 | case TBEGIN: | ||
11270 | case TIF: | ||
11271 | case TCASE: | ||
11272 | case TUNTIL: | ||
11273 | case TWHILE: | ||
11274 | case TFOR: | ||
11275 | goto do_func; | ||
11276 | case TLP: | ||
11277 | function_flag = 0; | ||
11278 | break; | ||
11279 | case TWORD: | ||
11280 | if (strcmp("[[", wordtext) == 0) | ||
11281 | goto do_func; | ||
11282 | /* fall through */ | ||
11283 | default: | ||
11284 | raise_error_unexpected_syntax(-1); | ||
11285 | } | ||
11286 | } | ||
11287 | #endif | ||
11252 | break; | 11288 | break; |
11253 | case TREDIR: | 11289 | case TREDIR: |
11254 | *rpp = n = redirnode; | 11290 | *rpp = n = redirnode; |
@@ -11256,6 +11292,7 @@ simplecmd(void) | |||
11256 | parsefname(); /* read name of redirection file */ | 11292 | parsefname(); /* read name of redirection file */ |
11257 | break; | 11293 | break; |
11258 | case TLP: | 11294 | case TLP: |
11295 | IF_ASH_BASH_COMPAT(do_func:) | ||
11259 | if (args && app == &args->narg.next | 11296 | if (args && app == &args->narg.next |
11260 | && !vars && !redir | 11297 | && !vars && !redir |
11261 | ) { | 11298 | ) { |
@@ -11263,7 +11300,7 @@ simplecmd(void) | |||
11263 | const char *name; | 11300 | const char *name; |
11264 | 11301 | ||
11265 | /* We have a function */ | 11302 | /* We have a function */ |
11266 | if (readtoken() != TRP) | 11303 | if (IF_ASH_BASH_COMPAT(!function_flag &&) readtoken() != TRP) |
11267 | raise_error_unexpected_syntax(TRP); | 11304 | raise_error_unexpected_syntax(TRP); |
11268 | name = n->narg.text; | 11305 | name = n->narg.text; |
11269 | if (!goodname(name) | 11306 | if (!goodname(name) |
@@ -11276,6 +11313,7 @@ simplecmd(void) | |||
11276 | n->narg.next = parse_command(); | 11313 | n->narg.next = parse_command(); |
11277 | return n; | 11314 | return n; |
11278 | } | 11315 | } |
11316 | IF_ASH_BASH_COMPAT(function_flag = 0;) | ||
11279 | /* fall through */ | 11317 | /* fall through */ |
11280 | default: | 11318 | default: |
11281 | tokpushback = 1; | 11319 | tokpushback = 1; |
@@ -11456,6 +11494,7 @@ parse_command(void) | |||
11456 | n1 = list(0); | 11494 | n1 = list(0); |
11457 | t = TEND; | 11495 | t = TEND; |
11458 | break; | 11496 | break; |
11497 | IF_ASH_BASH_COMPAT(case TFUNCTION:) | ||
11459 | case TWORD: | 11498 | case TWORD: |
11460 | case TREDIR: | 11499 | case TREDIR: |
11461 | tokpushback = 1; | 11500 | tokpushback = 1; |