summaryrefslogtreecommitdiff
path: root/shell/ash.c
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2015-11-06 16:38:39 +0000
committerRon Yorston <rmy@pobox.com>2015-11-06 16:38:39 +0000
commitd6c9296168ad0a770967714515ffa1fca5e60145 (patch)
treed72556385814a18a0ac039ee0b43ef6f561c317f /shell/ash.c
parentb60a9b30ba420808c4c9f540dcf92b11ee87a87b (diff)
parent196e400441652946b9c7ad7bc2d78c73885f2359 (diff)
downloadbusybox-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.c101
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 8076enum {
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};
8106typedef smallint token_id_t; 8110typedef 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;