diff options
Diffstat (limited to 'ash.c')
-rw-r--r-- | ash.c | 90 |
1 files changed, 85 insertions, 5 deletions
@@ -7294,7 +7294,7 @@ cmdputs(const char *s) | |||
7294 | cmdnextc = q; | 7294 | cmdnextc = q; |
7295 | } | 7295 | } |
7296 | 7296 | ||
7297 | //#define CMDTXT_TABLE | 7297 | #define CMDTXT_TABLE |
7298 | #ifdef CMDTXT_TABLE | 7298 | #ifdef CMDTXT_TABLE |
7299 | /* | 7299 | /* |
7300 | * To collect a lot of redundant code in cmdtxt() case statements, we | 7300 | * To collect a lot of redundant code in cmdtxt() case statements, we |
@@ -8710,8 +8710,8 @@ static void sizenodelist (const struct nodelist *); | |||
8710 | static struct nodelist *copynodelist (const struct nodelist *); | 8710 | static struct nodelist *copynodelist (const struct nodelist *); |
8711 | static char *nodesavestr (const char *); | 8711 | static char *nodesavestr (const char *); |
8712 | 8712 | ||
8713 | //#define CALCSIZE_TABLE | 8713 | #define CALCSIZE_TABLE |
8714 | //#define COPYNODE_TABLE | 8714 | #define COPYNODE_TABLE |
8715 | #if defined(CALCSIZE_TABLE) || defined(COPYNODE_TABLE) | 8715 | #if defined(CALCSIZE_TABLE) || defined(COPYNODE_TABLE) |
8716 | /* | 8716 | /* |
8717 | * To collect a lot of redundant code in case statements for copynode() | 8717 | * To collect a lot of redundant code in case statements for copynode() |
@@ -10337,6 +10337,86 @@ out: | |||
10337 | * have parseword (readtoken1?) handle both words and redirection.] | 10337 | * have parseword (readtoken1?) handle both words and redirection.] |
10338 | */ | 10338 | */ |
10339 | 10339 | ||
10340 | #define NEW_xxreadtoken | ||
10341 | #ifdef NEW_xxreadtoken | ||
10342 | |||
10343 | static const char xxreadtoken_chars[] = "\n()&|;"; /* singles must be first! */ | ||
10344 | static const char xxreadtoken_tokens[] = { | ||
10345 | TNL, TLP, TRP, /* only single occurrence allowed */ | ||
10346 | TBACKGND, TPIPE, TSEMI, /* if single occurrence */ | ||
10347 | TEOF, /* corresponds to trailing nul */ | ||
10348 | TAND, TOR, TENDCASE, /* if double occurrence */ | ||
10349 | }; | ||
10350 | |||
10351 | #define xxreadtoken_doubles \ | ||
10352 | (sizeof(xxreadtoken_tokens) - sizeof(xxreadtoken_chars)) | ||
10353 | #define xxreadtoken_singles \ | ||
10354 | (sizeof(xxreadtoken_chars) - xxreadtoken_doubles - 1) | ||
10355 | |||
10356 | static int | ||
10357 | xxreadtoken() { | ||
10358 | int c; | ||
10359 | |||
10360 | if (tokpushback) { | ||
10361 | tokpushback = 0; | ||
10362 | return lasttoken; | ||
10363 | } | ||
10364 | if (needprompt) { | ||
10365 | setprompt(2); | ||
10366 | needprompt = 0; | ||
10367 | } | ||
10368 | startlinno = plinno; | ||
10369 | for (;;) { /* until token or start of word found */ | ||
10370 | c = pgetc_macro(); | ||
10371 | |||
10372 | if ((c!=' ') && (c!='\t') | ||
10373 | #ifdef ASH_ALIAS | ||
10374 | && (c!=PEOA) | ||
10375 | #endif | ||
10376 | ) { | ||
10377 | if (c=='#') { | ||
10378 | while ((c = pgetc()) != '\n' && c != PEOF); | ||
10379 | pungetc(); | ||
10380 | } else if (c=='\\') { | ||
10381 | if (pgetc() != '\n') { | ||
10382 | pungetc(); | ||
10383 | goto READTOKEN1; | ||
10384 | } | ||
10385 | startlinno = ++plinno; | ||
10386 | setprompt(doprompt ? 2 : 0); | ||
10387 | } else { | ||
10388 | const char *p | ||
10389 | = xxreadtoken_chars + sizeof(xxreadtoken_chars) - 1; | ||
10390 | |||
10391 | if (c!=PEOF) { | ||
10392 | if (c=='\n') { | ||
10393 | plinno++; | ||
10394 | needprompt = doprompt; | ||
10395 | } | ||
10396 | |||
10397 | p = strchr(xxreadtoken_chars, c); | ||
10398 | if (p == NULL) { | ||
10399 | READTOKEN1: | ||
10400 | return readtoken1(c, BASESYNTAX, (char *)NULL, 0); | ||
10401 | } | ||
10402 | |||
10403 | if (p-xxreadtoken_chars >= xxreadtoken_singles) { | ||
10404 | if (pgetc() == *p) { /* double occurrence? */ | ||
10405 | p += xxreadtoken_doubles + 1; | ||
10406 | } else { | ||
10407 | pungetc(); | ||
10408 | } | ||
10409 | } | ||
10410 | } | ||
10411 | |||
10412 | return lasttoken = xxreadtoken_tokens[p-xxreadtoken_chars]; | ||
10413 | } | ||
10414 | } | ||
10415 | } | ||
10416 | } | ||
10417 | |||
10418 | |||
10419 | #else | ||
10340 | #define RETURN(token) return lasttoken = token | 10420 | #define RETURN(token) return lasttoken = token |
10341 | 10421 | ||
10342 | static int | 10422 | static int |
@@ -10408,7 +10488,7 @@ breakloop: | |||
10408 | return readtoken1(c, BASESYNTAX, (char *)NULL, 0); | 10488 | return readtoken1(c, BASESYNTAX, (char *)NULL, 0); |
10409 | #undef RETURN | 10489 | #undef RETURN |
10410 | } | 10490 | } |
10411 | 10491 | #endif | |
10412 | 10492 | ||
10413 | 10493 | ||
10414 | /* | 10494 | /* |
@@ -12681,7 +12761,7 @@ findvar(struct var **vpp, const char *name) | |||
12681 | /* | 12761 | /* |
12682 | * Copyright (c) 1999 Herbert Xu <herbert@debian.org> | 12762 | * Copyright (c) 1999 Herbert Xu <herbert@debian.org> |
12683 | * This file contains code for the times builtin. | 12763 | * This file contains code for the times builtin. |
12684 | * $Id: ash.c,v 1.24 2001/09/06 18:00:41 andersen Exp $ | 12764 | * $Id: ash.c,v 1.25 2001/09/11 01:14:02 mjn3 Exp $ |
12685 | */ | 12765 | */ |
12686 | static int timescmd (int argc, char **argv) | 12766 | static int timescmd (int argc, char **argv) |
12687 | { | 12767 | { |