diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-02-23 21:10:23 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-02-23 21:10:23 +0000 |
| commit | 2de3d9fbeef02d19305a4a18c758a4e5f65260d4 (patch) | |
| tree | d67f98a23d9da88e9fdf38fcecf05f254cee98f9 /shell | |
| parent | a89150733a39d25a916c28e76f530845a56342bb (diff) | |
| download | busybox-w32-2de3d9fbeef02d19305a4a18c758a4e5f65260d4.tar.gz busybox-w32-2de3d9fbeef02d19305a4a18c758a4e5f65260d4.tar.bz2 busybox-w32-2de3d9fbeef02d19305a4a18c758a4e5f65260d4.zip | |
ash: cleanup part 2.5
Diffstat (limited to 'shell')
| -rw-r--r-- | shell/ash.c | 317 |
1 files changed, 159 insertions, 158 deletions
diff --git a/shell/ash.c b/shell/ash.c index 869ed12fd..c96517c3a 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
| @@ -66,6 +66,15 @@ | |||
| 66 | #endif | 66 | #endif |
| 67 | 67 | ||
| 68 | 68 | ||
| 69 | /* ============ Misc helpers */ | ||
| 70 | |||
| 71 | #define xbarrier() do { __asm__ __volatile__ ("": : :"memory"); } while (0) | ||
| 72 | |||
| 73 | /* C99 say: "char" declaration may be signed or unsigned default */ | ||
| 74 | #define signed_char2int(sc) ((int)((signed char)sc)) | ||
| 75 | |||
| 76 | |||
| 77 | |||
| 69 | /* ============ Shell options */ | 78 | /* ============ Shell options */ |
| 70 | 79 | ||
| 71 | static const char *const optletters_optnames[] = { | 80 | static const char *const optletters_optnames[] = { |
| @@ -192,13 +201,11 @@ static volatile sig_atomic_t pendingsigs; | |||
| 192 | * much more efficient and portable. (But hacking the kernel is so much | 201 | * much more efficient and portable. (But hacking the kernel is so much |
| 193 | * more fun than worrying about efficiency and portability. :-)) | 202 | * more fun than worrying about efficiency and portability. :-)) |
| 194 | */ | 203 | */ |
| 195 | #define xbarrier() ({ __asm__ __volatile__ ("": : :"memory"); }) | ||
| 196 | #define INT_OFF \ | 204 | #define INT_OFF \ |
| 197 | ({ \ | 205 | do { \ |
| 198 | suppressint++; \ | 206 | suppressint++; \ |
| 199 | xbarrier(); \ | 207 | xbarrier(); \ |
| 200 | 0; \ | 208 | } while (0) |
| 201 | }) | ||
| 202 | 209 | ||
| 203 | /* | 210 | /* |
| 204 | * Called to raise an exception. Since C doesn't include exceptions, we | 211 | * Called to raise an exception. Since C doesn't include exceptions, we |
| @@ -263,38 +270,37 @@ force_int_on(void) | |||
| 263 | #define FORCE_INT_ON force_int_on() | 270 | #define FORCE_INT_ON force_int_on() |
| 264 | #else | 271 | #else |
| 265 | #define INT_ON \ | 272 | #define INT_ON \ |
| 266 | ({ \ | 273 | do { \ |
| 267 | xbarrier(); \ | 274 | xbarrier(); \ |
| 268 | if (--suppressint == 0 && intpending) raise_interrupt(); \ | 275 | if (--suppressint == 0 && intpending) \ |
| 269 | 0; \ | 276 | raise_interrupt(); \ |
| 270 | }) | 277 | } while (0) |
| 271 | #define FORCE_INT_ON \ | 278 | #define FORCE_INT_ON \ |
| 272 | ({ \ | 279 | do { \ |
| 273 | xbarrier(); \ | 280 | xbarrier(); \ |
| 274 | suppressint = 0; \ | 281 | suppressint = 0; \ |
| 275 | if (intpending) raise_interrupt(); \ | 282 | if (intpending) \ |
| 276 | 0; \ | 283 | raise_interrupt(); \ |
| 277 | }) | 284 | } while (0) |
| 278 | #endif /* ASH_OPTIMIZE_FOR_SIZE */ | 285 | #endif /* ASH_OPTIMIZE_FOR_SIZE */ |
| 279 | 286 | ||
| 280 | #define SAVE_INT(v) ((v) = suppressint) | 287 | #define SAVE_INT(v) ((v) = suppressint) |
| 281 | 288 | ||
| 282 | #define RESTORE_INT(v) \ | 289 | #define RESTORE_INT(v) \ |
| 283 | ({ \ | 290 | do { \ |
| 284 | xbarrier(); \ | 291 | xbarrier(); \ |
| 285 | suppressint = (v); \ | 292 | suppressint = (v); \ |
| 286 | if (suppressint == 0 && intpending) raise_interrupt(); \ | 293 | if (suppressint == 0 && intpending) \ |
| 287 | 0; \ | 294 | raise_interrupt(); \ |
| 288 | }) | 295 | } while (0) |
| 289 | 296 | ||
| 290 | #define EXSIGON \ | 297 | #define EXSIGON \ |
| 291 | ({ \ | 298 | do { \ |
| 292 | exsig++; \ | 299 | exsig++; \ |
| 293 | xbarrier(); \ | 300 | xbarrier(); \ |
| 294 | if (pendingsigs) \ | 301 | if (pendingsigs) \ |
| 295 | raise_exception(EXSIG); \ | 302 | raise_exception(EXSIG); \ |
| 296 | 0; \ | 303 | } while (0) |
| 297 | }) | ||
| 298 | /* EXSIG is turned off by evalbltin(). */ | 304 | /* EXSIG is turned off by evalbltin(). */ |
| 299 | 305 | ||
| 300 | /* | 306 | /* |
| @@ -406,7 +412,7 @@ out2str(const char *p) | |||
| 406 | } | 412 | } |
| 407 | 413 | ||
| 408 | 414 | ||
| 409 | /* ============ Parsing structures */ | 415 | /* ============ Parser structures */ |
| 410 | 416 | ||
| 411 | /* control characters in argument strings */ | 417 | /* control characters in argument strings */ |
| 412 | #define CTLESC '\201' /* escape next character */ | 418 | #define CTLESC '\201' /* escape next character */ |
| @@ -436,6 +442,8 @@ out2str(const char *p) | |||
| 436 | #define VSTRIMLEFTMAX 0x9 /* ${var##pattern} */ | 442 | #define VSTRIMLEFTMAX 0x9 /* ${var##pattern} */ |
| 437 | #define VSLENGTH 0xa /* ${#var} */ | 443 | #define VSLENGTH 0xa /* ${#var} */ |
| 438 | 444 | ||
| 445 | static const char dolatstr[] = { CTLVAR, VSNORMAL|VSQUOTE, '@', '=', '\0' }; | ||
| 446 | |||
| 439 | #define NCMD 0 | 447 | #define NCMD 0 |
| 440 | #define NPIPE 1 | 448 | #define NPIPE 1 |
| 441 | #define NREDIR 2 | 449 | #define NREDIR 2 |
| @@ -1361,21 +1369,25 @@ _STPUTC(int c, char *p) | |||
| 1361 | return p; | 1369 | return p; |
| 1362 | } | 1370 | } |
| 1363 | 1371 | ||
| 1364 | #define STARTSTACKSTR(p) ((p) = stackblock()) | 1372 | #define STARTSTACKSTR(p) ((p) = stackblock()) |
| 1365 | #define STPUTC(c, p) ((p) = _STPUTC((c), (p))) | 1373 | #define STPUTC(c, p) ((p) = _STPUTC((c), (p))) |
| 1366 | #define CHECKSTRSPACE(n, p) \ | 1374 | #define CHECKSTRSPACE(n, p) \ |
| 1367 | ({ \ | 1375 | do { \ |
| 1368 | char *q = (p); \ | 1376 | char *q = (p); \ |
| 1369 | size_t l = (n); \ | 1377 | size_t l = (n); \ |
| 1370 | size_t m = sstrend - q; \ | 1378 | size_t m = sstrend - q; \ |
| 1371 | if (l > m) \ | 1379 | if (l > m) \ |
| 1372 | (p) = makestrspace(l, q); \ | 1380 | (p) = makestrspace(l, q); \ |
| 1373 | 0; \ | 1381 | } while (0) |
| 1374 | }) | ||
| 1375 | #define USTPUTC(c, p) (*p++ = (c)) | 1382 | #define USTPUTC(c, p) (*p++ = (c)) |
| 1376 | #define STACKSTRNUL(p) ((p) == sstrend ? (p = growstackstr(), *p = '\0') : (*p = '\0')) | 1383 | #define STACKSTRNUL(p) \ |
| 1384 | do { \ | ||
| 1385 | if ((p) == sstrend) \ | ||
| 1386 | p = growstackstr(); \ | ||
| 1387 | *p = '\0'; \ | ||
| 1388 | } while (0) | ||
| 1377 | #define STUNPUTC(p) (--p) | 1389 | #define STUNPUTC(p) (--p) |
| 1378 | #define STTOPC(p) p[-1] | 1390 | #define STTOPC(p) (p[-1]) |
| 1379 | #define STADJUST(amount, p) (p += (amount)) | 1391 | #define STADJUST(amount, p) (p += (amount)) |
| 1380 | 1392 | ||
| 1381 | #define grabstackstr(p) stalloc((char *)(p) - (char *)stackblock()) | 1393 | #define grabstackstr(p) stalloc((char *)(p) - (char *)stackblock()) |
| @@ -1519,6 +1531,29 @@ nextopt(const char *optstring) | |||
| 1519 | } | 1531 | } |
| 1520 | 1532 | ||
| 1521 | 1533 | ||
| 1534 | /* ============ Math support definitions */ | ||
| 1535 | |||
| 1536 | #if ENABLE_ASH_MATH_SUPPORT_64 | ||
| 1537 | typedef int64_t arith_t; | ||
| 1538 | #define arith_t_type long long | ||
| 1539 | #else | ||
| 1540 | typedef long arith_t; | ||
| 1541 | #define arith_t_type long | ||
| 1542 | #endif | ||
| 1543 | |||
| 1544 | #if ENABLE_ASH_MATH_SUPPORT | ||
| 1545 | static arith_t dash_arith(const char *); | ||
| 1546 | static arith_t arith(const char *expr, int *perrcode); | ||
| 1547 | #endif | ||
| 1548 | |||
| 1549 | #if ENABLE_ASH_RANDOM_SUPPORT | ||
| 1550 | static unsigned long rseed; | ||
| 1551 | #ifndef DYNAMIC_VAR | ||
| 1552 | #define DYNAMIC_VAR | ||
| 1553 | #endif | ||
| 1554 | #endif | ||
| 1555 | |||
| 1556 | |||
| 1522 | /* ============ Shell variables */ | 1557 | /* ============ Shell variables */ |
| 1523 | 1558 | ||
| 1524 | /* flags */ | 1559 | /* flags */ |
| @@ -1532,9 +1567,9 @@ nextopt(const char *optstring) | |||
| 1532 | #define VNOSET 0x80 /* do not set variable - just readonly test */ | 1567 | #define VNOSET 0x80 /* do not set variable - just readonly test */ |
| 1533 | #define VNOSAVE 0x100 /* when text is on the heap before setvareq */ | 1568 | #define VNOSAVE 0x100 /* when text is on the heap before setvareq */ |
| 1534 | #ifdef DYNAMIC_VAR | 1569 | #ifdef DYNAMIC_VAR |
| 1535 | # define VDYNAMIC 0x200 /* dynamic variable */ | 1570 | # define VDYNAMIC 0x200 /* dynamic variable */ |
| 1536 | # else | 1571 | #else |
| 1537 | # define VDYNAMIC 0 | 1572 | # define VDYNAMIC 0 |
| 1538 | #endif | 1573 | #endif |
| 1539 | 1574 | ||
| 1540 | static const char defpathvar[] = "PATH=/usr/local/bin:/usr/bin:/sbin:/bin"; | 1575 | static const char defpathvar[] = "PATH=/usr/local/bin:/usr/bin:/sbin:/bin"; |
| @@ -2401,12 +2436,6 @@ pwdcmd(int argc, char **argv) | |||
| 2401 | #define IBUFSIZ (BUFSIZ + 1) | 2436 | #define IBUFSIZ (BUFSIZ + 1) |
| 2402 | #define basebuf bb_common_bufsiz1 /* buffer for top level input file */ | 2437 | #define basebuf bb_common_bufsiz1 /* buffer for top level input file */ |
| 2403 | 2438 | ||
| 2404 | |||
| 2405 | /* shell.h */ | ||
| 2406 | |||
| 2407 | static const char spcstr[] = " "; | ||
| 2408 | static const char dolatstr[] = { CTLVAR, VSNORMAL|VSQUOTE, '@', '=', '\0' }; | ||
| 2409 | |||
| 2410 | /* Syntax classes */ | 2439 | /* Syntax classes */ |
| 2411 | #define CWORD 0 /* character is nothing special */ | 2440 | #define CWORD 0 /* character is nothing special */ |
| 2412 | #define CNL 1 /* newline character */ | 2441 | #define CNL 1 /* newline character */ |
| @@ -2435,77 +2464,72 @@ static const char dolatstr[] = { CTLVAR, VSNORMAL|VSQUOTE, '@', '=', '\0' }; | |||
| 2435 | #define PEOA_OR_PEOF PEOF | 2464 | #define PEOA_OR_PEOF PEOF |
| 2436 | #endif | 2465 | #endif |
| 2437 | 2466 | ||
| 2438 | /* C99 say: "char" declaration may be signed or unsigned default */ | ||
| 2439 | #define SC2INT(chr2may_be_negative_int) (int)((signed char)chr2may_be_negative_int) | ||
| 2440 | |||
| 2441 | /* | 2467 | /* |
| 2442 | * is_special(c) evaluates to 1 for c in "!#$*-0123456789?@"; 0 otherwise | 2468 | * is_special(c) evaluates to 1 for c in "!#$*-0123456789?@"; 0 otherwise |
| 2443 | * (assuming ascii char codes, as the original implementation did) | 2469 | * (assuming ascii char codes, as the original implementation did) |
| 2444 | */ | 2470 | */ |
| 2445 | #define is_special(c) \ | 2471 | #define is_special(c) \ |
| 2446 | ( (((unsigned int)c) - 33 < 32) \ | 2472 | ((((unsigned int)c) - 33 < 32) \ |
| 2447 | && ((0xc1ff920dUL >> (((unsigned int)c) - 33)) & 1)) | 2473 | && ((0xc1ff920dUL >> (((unsigned int)c) - 33)) & 1)) |
| 2474 | |||
| 2475 | /* number syntax index */ | ||
| 2476 | #define BASESYNTAX 0 /* not in quotes */ | ||
| 2477 | #define DQSYNTAX 1 /* in double quotes */ | ||
| 2478 | #define SQSYNTAX 2 /* in single quotes */ | ||
| 2479 | #define ARISYNTAX 3 /* in arithmetic */ | ||
| 2448 | 2480 | ||
| 2449 | #if ENABLE_ASH_OPTIMIZE_FOR_SIZE | 2481 | #if ENABLE_ASH_OPTIMIZE_FOR_SIZE |
| 2450 | #define USE_SIT_FUNCTION | 2482 | #define USE_SIT_FUNCTION |
| 2451 | #endif | 2483 | #endif |
| 2452 | 2484 | ||
| 2453 | /* number syntax index */ | ||
| 2454 | #define BASESYNTAX 0 /* not in quotes */ | ||
| 2455 | #define DQSYNTAX 1 /* in double quotes */ | ||
| 2456 | #define SQSYNTAX 2 /* in single quotes */ | ||
| 2457 | #define ARISYNTAX 3 /* in arithmetic */ | ||
| 2458 | |||
| 2459 | #if ENABLE_ASH_MATH_SUPPORT | 2485 | #if ENABLE_ASH_MATH_SUPPORT |
| 2460 | static const char S_I_T[][4] = { | 2486 | static const char S_I_T[][4] = { |
| 2461 | #if ENABLE_ASH_ALIAS | 2487 | #if ENABLE_ASH_ALIAS |
| 2462 | {CSPCL, CIGN, CIGN, CIGN}, /* 0, PEOA */ | 2488 | { CSPCL, CIGN, CIGN, CIGN }, /* 0, PEOA */ |
| 2463 | #endif | 2489 | #endif |
| 2464 | {CSPCL, CWORD, CWORD, CWORD}, /* 1, ' ' */ | 2490 | { CSPCL, CWORD, CWORD, CWORD }, /* 1, ' ' */ |
| 2465 | {CNL, CNL, CNL, CNL}, /* 2, \n */ | 2491 | { CNL, CNL, CNL, CNL }, /* 2, \n */ |
| 2466 | {CWORD, CCTL, CCTL, CWORD}, /* 3, !*-/:=?[]~ */ | 2492 | { CWORD, CCTL, CCTL, CWORD }, /* 3, !*-/:=?[]~ */ |
| 2467 | {CDQUOTE, CENDQUOTE, CWORD, CWORD}, /* 4, '"' */ | 2493 | { CDQUOTE, CENDQUOTE, CWORD, CWORD }, /* 4, '"' */ |
| 2468 | {CVAR, CVAR, CWORD, CVAR}, /* 5, $ */ | 2494 | { CVAR, CVAR, CWORD, CVAR }, /* 5, $ */ |
| 2469 | {CSQUOTE, CWORD, CENDQUOTE, CWORD}, /* 6, "'" */ | 2495 | { CSQUOTE, CWORD, CENDQUOTE, CWORD }, /* 6, "'" */ |
| 2470 | {CSPCL, CWORD, CWORD, CLP}, /* 7, ( */ | 2496 | { CSPCL, CWORD, CWORD, CLP }, /* 7, ( */ |
| 2471 | {CSPCL, CWORD, CWORD, CRP}, /* 8, ) */ | 2497 | { CSPCL, CWORD, CWORD, CRP }, /* 8, ) */ |
| 2472 | {CBACK, CBACK, CCTL, CBACK}, /* 9, \ */ | 2498 | { CBACK, CBACK, CCTL, CBACK }, /* 9, \ */ |
| 2473 | {CBQUOTE, CBQUOTE, CWORD, CBQUOTE}, /* 10, ` */ | 2499 | { CBQUOTE, CBQUOTE, CWORD, CBQUOTE }, /* 10, ` */ |
| 2474 | {CENDVAR, CENDVAR, CWORD, CENDVAR}, /* 11, } */ | 2500 | { CENDVAR, CENDVAR, CWORD, CENDVAR }, /* 11, } */ |
| 2475 | #ifndef USE_SIT_FUNCTION | 2501 | #ifndef USE_SIT_FUNCTION |
| 2476 | {CENDFILE, CENDFILE, CENDFILE, CENDFILE}, /* 12, PEOF */ | 2502 | { CENDFILE, CENDFILE, CENDFILE, CENDFILE }, /* 12, PEOF */ |
| 2477 | {CWORD, CWORD, CWORD, CWORD}, /* 13, 0-9A-Za-z */ | 2503 | { CWORD, CWORD, CWORD, CWORD }, /* 13, 0-9A-Za-z */ |
| 2478 | {CCTL, CCTL, CCTL, CCTL} /* 14, CTLESC ... */ | 2504 | { CCTL, CCTL, CCTL, CCTL } /* 14, CTLESC ... */ |
| 2479 | #endif | 2505 | #endif |
| 2480 | }; | 2506 | }; |
| 2481 | #else | 2507 | #else |
| 2482 | static const char S_I_T[][3] = { | 2508 | static const char S_I_T[][3] = { |
| 2483 | #if ENABLE_ASH_ALIAS | 2509 | #if ENABLE_ASH_ALIAS |
| 2484 | {CSPCL, CIGN, CIGN}, /* 0, PEOA */ | 2510 | { CSPCL, CIGN, CIGN }, /* 0, PEOA */ |
| 2485 | #endif | 2511 | #endif |
| 2486 | {CSPCL, CWORD, CWORD}, /* 1, ' ' */ | 2512 | { CSPCL, CWORD, CWORD }, /* 1, ' ' */ |
| 2487 | {CNL, CNL, CNL}, /* 2, \n */ | 2513 | { CNL, CNL, CNL }, /* 2, \n */ |
| 2488 | {CWORD, CCTL, CCTL}, /* 3, !*-/:=?[]~ */ | 2514 | { CWORD, CCTL, CCTL }, /* 3, !*-/:=?[]~ */ |
| 2489 | {CDQUOTE, CENDQUOTE, CWORD}, /* 4, '"' */ | 2515 | { CDQUOTE, CENDQUOTE, CWORD }, /* 4, '"' */ |
| 2490 | {CVAR, CVAR, CWORD}, /* 5, $ */ | 2516 | { CVAR, CVAR, CWORD }, /* 5, $ */ |
| 2491 | {CSQUOTE, CWORD, CENDQUOTE}, /* 6, "'" */ | 2517 | { CSQUOTE, CWORD, CENDQUOTE }, /* 6, "'" */ |
| 2492 | {CSPCL, CWORD, CWORD}, /* 7, ( */ | 2518 | { CSPCL, CWORD, CWORD }, /* 7, ( */ |
| 2493 | {CSPCL, CWORD, CWORD}, /* 8, ) */ | 2519 | { CSPCL, CWORD, CWORD }, /* 8, ) */ |
| 2494 | {CBACK, CBACK, CCTL}, /* 9, \ */ | 2520 | { CBACK, CBACK, CCTL }, /* 9, \ */ |
| 2495 | {CBQUOTE, CBQUOTE, CWORD}, /* 10, ` */ | 2521 | { CBQUOTE, CBQUOTE, CWORD }, /* 10, ` */ |
| 2496 | {CENDVAR, CENDVAR, CWORD}, /* 11, } */ | 2522 | { CENDVAR, CENDVAR, CWORD }, /* 11, } */ |
| 2497 | #ifndef USE_SIT_FUNCTION | 2523 | #ifndef USE_SIT_FUNCTION |
| 2498 | {CENDFILE, CENDFILE, CENDFILE}, /* 12, PEOF */ | 2524 | { CENDFILE, CENDFILE, CENDFILE }, /* 12, PEOF */ |
| 2499 | {CWORD, CWORD, CWORD}, /* 13, 0-9A-Za-z */ | 2525 | { CWORD, CWORD, CWORD }, /* 13, 0-9A-Za-z */ |
| 2500 | {CCTL, CCTL, CCTL} /* 14, CTLESC ... */ | 2526 | { CCTL, CCTL, CCTL } /* 14, CTLESC ... */ |
| 2501 | #endif | 2527 | #endif |
| 2502 | }; | 2528 | }; |
| 2503 | #endif /* ASH_MATH_SUPPORT */ | 2529 | #endif /* ASH_MATH_SUPPORT */ |
| 2504 | 2530 | ||
| 2505 | #ifdef USE_SIT_FUNCTION | 2531 | #ifdef USE_SIT_FUNCTION |
| 2506 | 2532 | ||
| 2507 | #define U_C(c) ((unsigned char)(c)) | ||
| 2508 | |||
| 2509 | static int | 2533 | static int |
| 2510 | SIT(int c, int syntax) | 2534 | SIT(int c, int syntax) |
| 2511 | { | 2535 | { |
| @@ -2535,9 +2559,13 @@ SIT(int c, int syntax) | |||
| 2535 | indx = 0; | 2559 | indx = 0; |
| 2536 | else | 2560 | else |
| 2537 | #endif | 2561 | #endif |
| 2538 | if (U_C(c) >= U_C(CTLESC) && U_C(c) <= U_C(CTLQUOTEMARK)) | 2562 | #define U_C(c) ((unsigned char)(c)) |
| 2563 | |||
| 2564 | if ((unsigned char)c >= (unsigned char)(CTLESC) | ||
| 2565 | && (unsigned char)c <= (unsigned char)(CTLQUOTEMARK) | ||
| 2566 | ) { | ||
| 2539 | return CCTL; | 2567 | return CCTL; |
| 2540 | else { | 2568 | } else { |
| 2541 | s = strchr(spec_symbls, c); | 2569 | s = strchr(spec_symbls, c); |
| 2542 | if (s == NULL || *s == '\0') | 2570 | if (s == NULL || *s == '\0') |
| 2543 | return CWORD; | 2571 | return CWORD; |
| @@ -2546,41 +2574,39 @@ SIT(int c, int syntax) | |||
| 2546 | return S_I_T[indx][syntax]; | 2574 | return S_I_T[indx][syntax]; |
| 2547 | } | 2575 | } |
| 2548 | 2576 | ||
| 2549 | #else /* USE_SIT_FUNCTION */ | 2577 | #else /* !USE_SIT_FUNCTION */ |
| 2550 | |||
| 2551 | #define SIT(c, syntax) S_I_T[(int)syntax_index_table[((int)c)+SYNBASE]][syntax] | ||
| 2552 | 2578 | ||
| 2553 | #if ENABLE_ASH_ALIAS | 2579 | #if ENABLE_ASH_ALIAS |
| 2554 | #define CSPCL_CIGN_CIGN_CIGN 0 | 2580 | #define CSPCL_CIGN_CIGN_CIGN 0 |
| 2555 | #define CSPCL_CWORD_CWORD_CWORD 1 | 2581 | #define CSPCL_CWORD_CWORD_CWORD 1 |
| 2556 | #define CNL_CNL_CNL_CNL 2 | 2582 | #define CNL_CNL_CNL_CNL 2 |
| 2557 | #define CWORD_CCTL_CCTL_CWORD 3 | 2583 | #define CWORD_CCTL_CCTL_CWORD 3 |
| 2558 | #define CDQUOTE_CENDQUOTE_CWORD_CWORD 4 | 2584 | #define CDQUOTE_CENDQUOTE_CWORD_CWORD 4 |
| 2559 | #define CVAR_CVAR_CWORD_CVAR 5 | 2585 | #define CVAR_CVAR_CWORD_CVAR 5 |
| 2560 | #define CSQUOTE_CWORD_CENDQUOTE_CWORD 6 | 2586 | #define CSQUOTE_CWORD_CENDQUOTE_CWORD 6 |
| 2561 | #define CSPCL_CWORD_CWORD_CLP 7 | 2587 | #define CSPCL_CWORD_CWORD_CLP 7 |
| 2562 | #define CSPCL_CWORD_CWORD_CRP 8 | 2588 | #define CSPCL_CWORD_CWORD_CRP 8 |
| 2563 | #define CBACK_CBACK_CCTL_CBACK 9 | 2589 | #define CBACK_CBACK_CCTL_CBACK 9 |
| 2564 | #define CBQUOTE_CBQUOTE_CWORD_CBQUOTE 10 | 2590 | #define CBQUOTE_CBQUOTE_CWORD_CBQUOTE 10 |
| 2565 | #define CENDVAR_CENDVAR_CWORD_CENDVAR 11 | 2591 | #define CENDVAR_CENDVAR_CWORD_CENDVAR 11 |
| 2566 | #define CENDFILE_CENDFILE_CENDFILE_CENDFILE 12 | 2592 | #define CENDFILE_CENDFILE_CENDFILE_CENDFILE 12 |
| 2567 | #define CWORD_CWORD_CWORD_CWORD 13 | 2593 | #define CWORD_CWORD_CWORD_CWORD 13 |
| 2568 | #define CCTL_CCTL_CCTL_CCTL 14 | 2594 | #define CCTL_CCTL_CCTL_CCTL 14 |
| 2569 | #else | 2595 | #else |
| 2570 | #define CSPCL_CWORD_CWORD_CWORD 0 | 2596 | #define CSPCL_CWORD_CWORD_CWORD 0 |
| 2571 | #define CNL_CNL_CNL_CNL 1 | 2597 | #define CNL_CNL_CNL_CNL 1 |
| 2572 | #define CWORD_CCTL_CCTL_CWORD 2 | 2598 | #define CWORD_CCTL_CCTL_CWORD 2 |
| 2573 | #define CDQUOTE_CENDQUOTE_CWORD_CWORD 3 | 2599 | #define CDQUOTE_CENDQUOTE_CWORD_CWORD 3 |
| 2574 | #define CVAR_CVAR_CWORD_CVAR 4 | 2600 | #define CVAR_CVAR_CWORD_CVAR 4 |
| 2575 | #define CSQUOTE_CWORD_CENDQUOTE_CWORD 5 | 2601 | #define CSQUOTE_CWORD_CENDQUOTE_CWORD 5 |
| 2576 | #define CSPCL_CWORD_CWORD_CLP 6 | 2602 | #define CSPCL_CWORD_CWORD_CLP 6 |
| 2577 | #define CSPCL_CWORD_CWORD_CRP 7 | 2603 | #define CSPCL_CWORD_CWORD_CRP 7 |
| 2578 | #define CBACK_CBACK_CCTL_CBACK 8 | 2604 | #define CBACK_CBACK_CCTL_CBACK 8 |
| 2579 | #define CBQUOTE_CBQUOTE_CWORD_CBQUOTE 9 | 2605 | #define CBQUOTE_CBQUOTE_CWORD_CBQUOTE 9 |
| 2580 | #define CENDVAR_CENDVAR_CWORD_CENDVAR 10 | 2606 | #define CENDVAR_CENDVAR_CWORD_CENDVAR 10 |
| 2581 | #define CENDFILE_CENDFILE_CENDFILE_CENDFILE 11 | 2607 | #define CENDFILE_CENDFILE_CENDFILE_CENDFILE 11 |
| 2582 | #define CWORD_CWORD_CWORD_CWORD 12 | 2608 | #define CWORD_CWORD_CWORD_CWORD 12 |
| 2583 | #define CCTL_CCTL_CCTL_CCTL 13 | 2609 | #define CCTL_CCTL_CCTL_CCTL 13 |
| 2584 | #endif | 2610 | #endif |
| 2585 | 2611 | ||
| 2586 | static const char syntax_index_table[258] = { | 2612 | static const char syntax_index_table[258] = { |
| @@ -2847,30 +2873,9 @@ static const char syntax_index_table[258] = { | |||
| 2847 | /* 257 127 */ CWORD_CWORD_CWORD_CWORD, | 2873 | /* 257 127 */ CWORD_CWORD_CWORD_CWORD, |
| 2848 | }; | 2874 | }; |
| 2849 | 2875 | ||
| 2850 | #endif /* USE_SIT_FUNCTION */ | 2876 | #define SIT(c, syntax) (S_I_T[(int)syntax_index_table[((int)c)+SYNBASE]][syntax]) |
| 2851 | |||
| 2852 | |||
| 2853 | /* exec.h */ | ||
| 2854 | |||
| 2855 | #if ENABLE_ASH_MATH_SUPPORT_64 | ||
| 2856 | typedef int64_t arith_t; | ||
| 2857 | #define arith_t_type long long | ||
| 2858 | #else | ||
| 2859 | typedef long arith_t; | ||
| 2860 | #define arith_t_type long | ||
| 2861 | #endif | ||
| 2862 | |||
| 2863 | #if ENABLE_ASH_MATH_SUPPORT | ||
| 2864 | static arith_t dash_arith(const char *); | ||
| 2865 | static arith_t arith(const char *expr, int *perrcode); | ||
| 2866 | #endif | ||
| 2867 | 2877 | ||
| 2868 | #if ENABLE_ASH_RANDOM_SUPPORT | 2878 | #endif /* USE_SIT_FUNCTION */ |
| 2869 | static unsigned long rseed; | ||
| 2870 | # ifndef DYNAMIC_VAR | ||
| 2871 | # define DYNAMIC_VAR | ||
| 2872 | # endif | ||
| 2873 | #endif | ||
| 2874 | 2879 | ||
| 2875 | 2880 | ||
| 2876 | /* main.h */ | 2881 | /* main.h */ |
| @@ -4244,10 +4249,10 @@ cmdlist(union node *np, int sep) | |||
| 4244 | { | 4249 | { |
| 4245 | for (; np; np = np->narg.next) { | 4250 | for (; np; np = np->narg.next) { |
| 4246 | if (!sep) | 4251 | if (!sep) |
| 4247 | cmdputs(spcstr); | 4252 | cmdputs(" "); |
| 4248 | cmdtxt(np); | 4253 | cmdtxt(np); |
| 4249 | if (sep && np->narg.next) | 4254 | if (sep && np->narg.next) |
| 4250 | cmdputs(spcstr); | 4255 | cmdputs(" "); |
| 4251 | } | 4256 | } |
| 4252 | } | 4257 | } |
| 4253 | 4258 | ||
| @@ -4810,7 +4815,7 @@ memtodest(const char *p, size_t len, int syntax, int quotes) | |||
| 4810 | q = makestrspace(len * 2, q); | 4815 | q = makestrspace(len * 2, q); |
| 4811 | 4816 | ||
| 4812 | while (len--) { | 4817 | while (len--) { |
| 4813 | int c = SC2INT(*p++); | 4818 | int c = signed_char2int(*p++); |
| 4814 | if (!c) | 4819 | if (!c) |
| 4815 | continue; | 4820 | continue; |
| 4816 | if (quotes && (SIT(c, syntax) == CCTL || SIT(c, syntax) == CBACK)) | 4821 | if (quotes && (SIT(c, syntax) == CCTL || SIT(c, syntax) == CBACK)) |
| @@ -5477,7 +5482,7 @@ varvalue(char *name, int varflags, int flags) | |||
| 5477 | goto param; | 5482 | goto param; |
| 5478 | /* fall through */ | 5483 | /* fall through */ |
| 5479 | case '*': | 5484 | case '*': |
| 5480 | sep = ifsset() ? SC2INT(ifsval()[0]) : ' '; | 5485 | sep = ifsset() ? signed_char2int(ifsval()[0]) : ' '; |
| 5481 | if (quotes && (SIT(sep, syntax) == CCTL || SIT(sep, syntax) == CBACK)) | 5486 | if (quotes && (SIT(sep, syntax) == CCTL || SIT(sep, syntax) == CBACK)) |
| 5482 | sepq = 1; | 5487 | sepq = 1; |
| 5483 | param: | 5488 | param: |
| @@ -8510,7 +8515,7 @@ preadbuffer(void) | |||
| 8510 | #endif | 8515 | #endif |
| 8511 | popstring(); | 8516 | popstring(); |
| 8512 | if (--parsenleft >= 0) | 8517 | if (--parsenleft >= 0) |
| 8513 | return SC2INT(*parsenextc++); | 8518 | return signed_char2int(*parsenextc++); |
| 8514 | } | 8519 | } |
| 8515 | if (parsenleft == EOF_NLEFT || parsefile->buf == NULL) | 8520 | if (parsenleft == EOF_NLEFT || parsefile->buf == NULL) |
| 8516 | return PEOF; | 8521 | return PEOF; |
| @@ -8563,25 +8568,20 @@ preadbuffer(void) | |||
| 8563 | 8568 | ||
| 8564 | *q = savec; | 8569 | *q = savec; |
| 8565 | 8570 | ||
| 8566 | return SC2INT(*parsenextc++); | 8571 | return signed_char2int(*parsenextc++); |
| 8567 | } | 8572 | } |
| 8568 | 8573 | ||
| 8569 | #define pgetc_as_macro() (--parsenleft >= 0? SC2INT(*parsenextc++) : preadbuffer()) | 8574 | #define pgetc_as_macro() (--parsenleft >= 0? signed_char2int(*parsenextc++) : preadbuffer()) |
| 8570 | |||
| 8571 | #if ENABLE_ASH_OPTIMIZE_FOR_SIZE | ||
| 8572 | #define pgetc_macro() pgetc() | ||
| 8573 | static int | 8575 | static int |
| 8574 | pgetc(void) | 8576 | pgetc(void) |
| 8575 | { | 8577 | { |
| 8576 | return pgetc_as_macro(); | 8578 | return pgetc_as_macro(); |
| 8577 | } | 8579 | } |
| 8580 | |||
| 8581 | #if ENABLE_ASH_OPTIMIZE_FOR_SIZE | ||
| 8582 | #define pgetc_macro() pgetc() | ||
| 8578 | #else | 8583 | #else |
| 8579 | #define pgetc_macro() pgetc_as_macro() | 8584 | #define pgetc_macro() pgetc_as_macro() |
| 8580 | static int | ||
| 8581 | pgetc(void) | ||
| 8582 | { | ||
| 8583 | return pgetc_macro(); | ||
| 8584 | } | ||
| 8585 | #endif | 8585 | #endif |
| 8586 | 8586 | ||
| 8587 | /* | 8587 | /* |
| @@ -8810,6 +8810,7 @@ setinputstring(char *string) | |||
| 8810 | * | 8810 | * |
| 8811 | * Routines to check for mail. | 8811 | * Routines to check for mail. |
| 8812 | */ | 8812 | */ |
| 8813 | |||
| 8813 | #if ENABLE_ASH_MAIL | 8814 | #if ENABLE_ASH_MAIL |
| 8814 | 8815 | ||
| 8815 | #define MAXMBOXES 10 | 8816 | #define MAXMBOXES 10 |
| @@ -8870,6 +8871,7 @@ changemail(const char *val) | |||
| 8870 | { | 8871 | { |
| 8871 | mail_var_path_changed++; | 8872 | mail_var_path_changed++; |
| 8872 | } | 8873 | } |
| 8874 | |||
| 8873 | #endif /* ASH_MAIL */ | 8875 | #endif /* ASH_MAIL */ |
| 8874 | 8876 | ||
| 8875 | 8877 | ||
| @@ -9133,7 +9135,7 @@ showvars(const char *sep_prefix, int on, int off) | |||
| 9133 | ep = listvars(on, off, &epend); | 9135 | ep = listvars(on, off, &epend); |
| 9134 | qsort(ep, epend - ep, sizeof(char *), vpcmp); | 9136 | qsort(ep, epend - ep, sizeof(char *), vpcmp); |
| 9135 | 9137 | ||
| 9136 | sep = *sep_prefix ? spcstr : sep_prefix; | 9138 | sep = *sep_prefix ? " " : sep_prefix; |
| 9137 | 9139 | ||
| 9138 | for (; ep < epend; ep++) { | 9140 | for (; ep < epend; ep++) { |
| 9139 | const char *p; | 9141 | const char *p; |
| @@ -10991,9 +10993,8 @@ readcmdfile(char *name) | |||
| 10991 | } | 10993 | } |
| 10992 | 10994 | ||
| 10993 | 10995 | ||
| 10994 | /* ============ redir.c */ | 10996 | /* ============ redir.c |
| 10995 | 10997 | * | |
| 10996 | /* | ||
| 10997 | * Code for dealing with input/output redirection. | 10998 | * Code for dealing with input/output redirection. |
| 10998 | */ | 10999 | */ |
| 10999 | 11000 | ||
