diff options
| author | Eric Andersen <andersen@codepoet.org> | 2003-07-29 06:38:40 +0000 |
|---|---|---|
| committer | Eric Andersen <andersen@codepoet.org> | 2003-07-29 06:38:40 +0000 |
| commit | 81fe123040b53490b239b3d2abc8cc93d6d462ae (patch) | |
| tree | c3f501afd6305ff9415e5a9ab5e371d7fc2db101 /shell | |
| parent | 9cdef5d9286839a0b787c25f41633508f8623765 (diff) | |
| download | busybox-w32-81fe123040b53490b239b3d2abc8cc93d6d462ae.tar.gz busybox-w32-81fe123040b53490b239b3d2abc8cc93d6d462ae.tar.bz2 busybox-w32-81fe123040b53490b239b3d2abc8cc93d6d462ae.zip | |
Vladimir N. Oleynik writes:
Last patch have synced form Manuel Nova III xxreadtoken() function,
corrected (C) form dash debian/copyright, removed my small mistake
with IFS_BROKEN (thanks by Herbert), and synced cmdedit.c from
current CVS (removed libc5 support, your email correction, my (C) year
corertion).
Diffstat (limited to 'shell')
| -rw-r--r-- | shell/ash.c | 120 | ||||
| -rw-r--r-- | shell/cmdedit.c | 10 |
2 files changed, 97 insertions, 33 deletions
diff --git a/shell/ash.c b/shell/ash.c index 334dc2235..f852b26d3 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
| @@ -5,6 +5,10 @@ | |||
| 5 | * Copyright (c) 1989, 1991, 1993, 1994 | 5 | * Copyright (c) 1989, 1991, 1993, 1994 |
| 6 | * The Regents of the University of California. All rights reserved. | 6 | * The Regents of the University of California. All rights reserved. |
| 7 | * | 7 | * |
| 8 | * Copyright (c) 1997-2003 Herbert Xu <herbert@debian.org> | ||
| 9 | * was re-ported from NetBSD and debianized. | ||
| 10 | * | ||
| 11 | * | ||
| 8 | * This code is derived from software contributed to Berkeley by | 12 | * This code is derived from software contributed to Berkeley by |
| 9 | * Kenneth Almquist. | 13 | * Kenneth Almquist. |
| 10 | * | 14 | * |
| @@ -22,14 +26,11 @@ | |||
| 22 | * along with this program; if not, write to the Free Software | 26 | * along with this program; if not, write to the Free Software |
| 23 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 27 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 24 | * | 28 | * |
| 25 | * This version of ash is adapted from the source in Debian's ash 0.3.8-5 | ||
| 26 | * package. | ||
| 27 | * Maintainer Herbert Xu <herbert@debian.org> (C) 1997-2002 | ||
| 28 | * | 29 | * |
| 29 | * Modified by Vladimir Oleynik <dzo@simtreas.ru> to be used in busybox | 30 | * Modified by Vladimir Oleynik <dzo@simtreas.ru> to be used in busybox |
| 30 | * | 31 | * |
| 31 | * | 32 | * |
| 32 | * Original copyright notice is retained at the end of this file. | 33 | * Original BSD copyright notice is retained at the end of this file. |
| 33 | */ | 34 | */ |
| 34 | 35 | ||
| 35 | /* | 36 | /* |
| @@ -1485,8 +1486,11 @@ static const char defpathvar[] = | |||
| 1485 | "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"; | 1486 | "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"; |
| 1486 | #ifdef IFS_BROKEN | 1487 | #ifdef IFS_BROKEN |
| 1487 | static const char defifsvar[] = "IFS= \t\n"; | 1488 | static const char defifsvar[] = "IFS= \t\n"; |
| 1488 | #endif | 1489 | #define defifs (defifsvar + 4) |
| 1490 | #else | ||
| 1489 | static const char defifs[] = " \t\n"; | 1491 | static const char defifs[] = " \t\n"; |
| 1492 | #endif | ||
| 1493 | |||
| 1490 | 1494 | ||
| 1491 | static struct var varinit[] = { | 1495 | static struct var varinit[] = { |
| 1492 | #ifdef IFS_BROKEN | 1496 | #ifdef IFS_BROKEN |
| @@ -9848,6 +9852,89 @@ out: | |||
| 9848 | * have parseword (readtoken1?) handle both words and redirection.] | 9852 | * have parseword (readtoken1?) handle both words and redirection.] |
| 9849 | */ | 9853 | */ |
| 9850 | 9854 | ||
| 9855 | #define NEW_xxreadtoken | ||
| 9856 | #ifdef NEW_xxreadtoken | ||
| 9857 | |||
| 9858 | /* singles must be first! */ | ||
| 9859 | static const char xxreadtoken_chars[7] = { '\n', '(', ')', '&', '|', ';', 0 }; | ||
| 9860 | |||
| 9861 | static const char xxreadtoken_tokens[] = { | ||
| 9862 | TNL, TLP, TRP, /* only single occurrence allowed */ | ||
| 9863 | TBACKGND, TPIPE, TSEMI, /* if single occurrence */ | ||
| 9864 | TEOF, /* corresponds to trailing nul */ | ||
| 9865 | TAND, TOR, TENDCASE, /* if double occurrence */ | ||
| 9866 | }; | ||
| 9867 | |||
| 9868 | #define xxreadtoken_doubles \ | ||
| 9869 | (sizeof(xxreadtoken_tokens) - sizeof(xxreadtoken_chars)) | ||
| 9870 | #define xxreadtoken_singles \ | ||
| 9871 | (sizeof(xxreadtoken_chars) - xxreadtoken_doubles - 1) | ||
| 9872 | |||
| 9873 | static int xxreadtoken() | ||
| 9874 | { | ||
| 9875 | int c; | ||
| 9876 | |||
| 9877 | if (tokpushback) { | ||
| 9878 | tokpushback = 0; | ||
| 9879 | return lasttoken; | ||
| 9880 | } | ||
| 9881 | if (needprompt) { | ||
| 9882 | setprompt(2); | ||
| 9883 | needprompt = 0; | ||
| 9884 | } | ||
| 9885 | startlinno = plinno; | ||
| 9886 | for (;;) { /* until token or start of word found */ | ||
| 9887 | c = pgetc_macro(); | ||
| 9888 | |||
| 9889 | if ((c != ' ') && (c != '\t') | ||
| 9890 | #ifdef CONFIG_ASH_ALIAS | ||
| 9891 | && (c != PEOA) | ||
| 9892 | #endif | ||
| 9893 | ) { | ||
| 9894 | if (c == '#') { | ||
| 9895 | while ((c = pgetc()) != '\n' && c != PEOF); | ||
| 9896 | pungetc(); | ||
| 9897 | } else if (c == '\\') { | ||
| 9898 | if (pgetc() != '\n') { | ||
| 9899 | pungetc(); | ||
| 9900 | goto READTOKEN1; | ||
| 9901 | } | ||
| 9902 | startlinno = ++plinno; | ||
| 9903 | if (doprompt) | ||
| 9904 | setprompt(2); | ||
| 9905 | } else { | ||
| 9906 | const char *p | ||
| 9907 | = xxreadtoken_chars + sizeof(xxreadtoken_chars) - 1; | ||
| 9908 | |||
| 9909 | if (c != PEOF) { | ||
| 9910 | if (c == '\n') { | ||
| 9911 | plinno++; | ||
| 9912 | needprompt = doprompt; | ||
| 9913 | } | ||
| 9914 | |||
| 9915 | p = strchr(xxreadtoken_chars, c); | ||
| 9916 | if (p == NULL) { | ||
| 9917 | READTOKEN1: | ||
| 9918 | return readtoken1(c, BASESYNTAX, (char *) NULL, 0); | ||
| 9919 | } | ||
| 9920 | |||
| 9921 | if (p - xxreadtoken_chars >= xxreadtoken_singles) { | ||
| 9922 | if (pgetc() == *p) { /* double occurrence? */ | ||
| 9923 | p += xxreadtoken_doubles + 1; | ||
| 9924 | } else { | ||
| 9925 | pungetc(); | ||
| 9926 | } | ||
| 9927 | } | ||
| 9928 | } | ||
| 9929 | |||
| 9930 | return lasttoken = xxreadtoken_tokens[p - xxreadtoken_chars]; | ||
| 9931 | } | ||
| 9932 | } | ||
| 9933 | } | ||
| 9934 | } | ||
| 9935 | |||
| 9936 | |||
| 9937 | #else | ||
| 9851 | #define RETURN(token) return lasttoken = token | 9938 | #define RETURN(token) return lasttoken = token |
| 9852 | 9939 | ||
| 9853 | static int | 9940 | static int |
| @@ -9918,7 +10005,7 @@ breakloop: | |||
| 9918 | return readtoken1(c, BASESYNTAX, (char *)NULL, 0); | 10005 | return readtoken1(c, BASESYNTAX, (char *)NULL, 0); |
| 9919 | #undef RETURN | 10006 | #undef RETURN |
| 9920 | } | 10007 | } |
| 9921 | 10008 | #endif /* NEW_xxreadtoken */ | |
| 9922 | 10009 | ||
| 9923 | 10010 | ||
| 9924 | /* | 10011 | /* |
| @@ -10909,10 +10996,6 @@ redirect(union node *redir, int flags) | |||
| 10909 | } | 10996 | } |
| 10910 | 10997 | ||
| 10911 | 10998 | ||
| 10912 | |||
| 10913 | |||
| 10914 | |||
| 10915 | |||
| 10916 | /* | 10999 | /* |
| 10917 | * Undo the effects of the last redirection. | 11000 | * Undo the effects of the last redirection. |
| 10918 | */ | 11001 | */ |
| @@ -10962,7 +11045,6 @@ clearredir(int drop) | |||
| 10962 | } | 11045 | } |
| 10963 | 11046 | ||
| 10964 | 11047 | ||
| 10965 | |||
| 10966 | /* | 11048 | /* |
| 10967 | * Copy a file descriptor to be >= to. Returns -1 | 11049 | * Copy a file descriptor to be >= to. Returns -1 |
| 10968 | * if the source file descriptor is closed, EMPTY if there are no unused | 11050 | * if the source file descriptor is closed, EMPTY if there are no unused |
| @@ -11073,7 +11155,6 @@ binop: | |||
| 11073 | } | 11155 | } |
| 11074 | 11156 | ||
| 11075 | 11157 | ||
| 11076 | |||
| 11077 | static void | 11158 | static void |
| 11078 | shcmd(union node *cmd, FILE *fp) | 11159 | shcmd(union node *cmd, FILE *fp) |
| 11079 | { | 11160 | { |
| @@ -11422,7 +11503,6 @@ trapcmd(int argc, char **argv) | |||
| 11422 | } | 11503 | } |
| 11423 | 11504 | ||
| 11424 | 11505 | ||
| 11425 | |||
| 11426 | /* | 11506 | /* |
| 11427 | * Clear traps on a fork. | 11507 | * Clear traps on a fork. |
| 11428 | */ | 11508 | */ |
| @@ -11445,7 +11525,6 @@ clear_traps(void) | |||
| 11445 | } | 11525 | } |
| 11446 | 11526 | ||
| 11447 | 11527 | ||
| 11448 | |||
| 11449 | /* | 11528 | /* |
| 11450 | * Set the signal handler for the specified signal. The routine figures | 11529 | * Set the signal handler for the specified signal. The routine figures |
| 11451 | * out what it should be set to. | 11530 | * out what it should be set to. |
| @@ -11546,7 +11625,6 @@ ignoresig(int signo) | |||
| 11546 | } | 11625 | } |
| 11547 | 11626 | ||
| 11548 | 11627 | ||
| 11549 | |||
| 11550 | /* | 11628 | /* |
| 11551 | * Signal handler. | 11629 | * Signal handler. |
| 11552 | */ | 11630 | */ |
| @@ -11565,7 +11643,6 @@ onsig(int signo) | |||
| 11565 | } | 11643 | } |
| 11566 | 11644 | ||
| 11567 | 11645 | ||
| 11568 | |||
| 11569 | /* | 11646 | /* |
| 11570 | * Called to execute a trap. Perhaps we should avoid entering new trap | 11647 | * Called to execute a trap. Perhaps we should avoid entering new trap |
| 11571 | * handlers while we are executing a trap handler. | 11648 | * handlers while we are executing a trap handler. |
| @@ -11591,12 +11668,10 @@ dotrap(void) | |||
| 11591 | } | 11668 | } |
| 11592 | 11669 | ||
| 11593 | 11670 | ||
| 11594 | |||
| 11595 | /* | 11671 | /* |
| 11596 | * Controls whether the shell is interactive or not. | 11672 | * Controls whether the shell is interactive or not. |
| 11597 | */ | 11673 | */ |
| 11598 | 11674 | ||
| 11599 | |||
| 11600 | void | 11675 | void |
| 11601 | setinteractive(int on) | 11676 | setinteractive(int on) |
| 11602 | { | 11677 | { |
| @@ -11691,7 +11766,6 @@ exitshell(void) | |||
| 11691 | } | 11766 | } |
| 11692 | #endif | 11767 | #endif |
| 11693 | out: | 11768 | out: |
| 11694 | out1c('\n'); | ||
| 11695 | _exit(status); | 11769 | _exit(status); |
| 11696 | /* NOTREACHED */ | 11770 | /* NOTREACHED */ |
| 11697 | } | 11771 | } |
| @@ -11780,7 +11854,6 @@ setvar(const char *name, const char *val, int flags) | |||
| 11780 | } | 11854 | } |
| 11781 | 11855 | ||
| 11782 | 11856 | ||
| 11783 | |||
| 11784 | /* | 11857 | /* |
| 11785 | * Same as setvar except that the variable and value are passed in | 11858 | * Same as setvar except that the variable and value are passed in |
| 11786 | * the first argument as name=value. Since the first argument will | 11859 | * the first argument as name=value. Since the first argument will |
| @@ -11830,7 +11903,6 @@ setvareq(char *s, int flags) | |||
| 11830 | } | 11903 | } |
| 11831 | 11904 | ||
| 11832 | 11905 | ||
| 11833 | |||
| 11834 | /* | 11906 | /* |
| 11835 | * Process a linked list of variable assignments. | 11907 | * Process a linked list of variable assignments. |
| 11836 | */ | 11908 | */ |
| @@ -11866,7 +11938,6 @@ lookupvar(const char *name) | |||
| 11866 | } | 11938 | } |
| 11867 | 11939 | ||
| 11868 | 11940 | ||
| 11869 | |||
| 11870 | /* | 11941 | /* |
| 11871 | * Search the environment of a builtin command. | 11942 | * Search the environment of a builtin command. |
| 11872 | */ | 11943 | */ |
| @@ -11884,7 +11955,6 @@ bltinlookup(const char *name) | |||
| 11884 | } | 11955 | } |
| 11885 | 11956 | ||
| 11886 | 11957 | ||
| 11887 | |||
| 11888 | /* | 11958 | /* |
| 11889 | * Generate a list of variables satisfying the given conditions. | 11959 | * Generate a list of variables satisfying the given conditions. |
| 11890 | */ | 11960 | */ |
| @@ -11917,7 +11987,6 @@ listvars(int on, int off, char ***end) | |||
| 11917 | } | 11987 | } |
| 11918 | 11988 | ||
| 11919 | 11989 | ||
| 11920 | |||
| 11921 | /* | 11990 | /* |
| 11922 | * POSIX requires that 'set' (but not export or readonly) output the | 11991 | * POSIX requires that 'set' (but not export or readonly) output the |
| 11923 | * variables in lexicographic order - by the locale's collating order (sigh). | 11992 | * variables in lexicographic order - by the locale's collating order (sigh). |
| @@ -12054,7 +12123,6 @@ localcmd(int argc, char **argv) | |||
| 12054 | 12123 | ||
| 12055 | 12124 | ||
| 12056 | 12125 | ||
| 12057 | |||
| 12058 | /* | 12126 | /* |
| 12059 | * Called after a function returns. | 12127 | * Called after a function returns. |
| 12060 | * Interrupts must be off. | 12128 | * Interrupts must be off. |
| @@ -12568,7 +12636,7 @@ ulimitcmd(int argc, char **argv) | |||
| 12568 | 12636 | ||
| 12569 | if (all || argptr[1]) | 12637 | if (all || argptr[1]) |
| 12570 | error("too many arguments"); | 12638 | error("too many arguments"); |
| 12571 | if (strcmp(p, "unlimited") == 0) | 12639 | if (strncmp(p, "unlimited\n", 9) == 0) |
| 12572 | val = RLIM_INFINITY; | 12640 | val = RLIM_INFINITY; |
| 12573 | else { | 12641 | else { |
| 12574 | val = (rlim_t) 0; | 12642 | val = (rlim_t) 0; |
diff --git a/shell/cmdedit.c b/shell/cmdedit.c index 717067267..0ab195803 100644 --- a/shell/cmdedit.c +++ b/shell/cmdedit.c | |||
| @@ -2,14 +2,14 @@ | |||
| 2 | /* | 2 | /* |
| 3 | * Termios command line History and Editting. | 3 | * Termios command line History and Editting. |
| 4 | * | 4 | * |
| 5 | * Copyright (c) 1986-2001 may safely be consumed by a BSD or GPL license. | 5 | * Copyright (c) 1986-2003 may safely be consumed by a BSD or GPL license. |
| 6 | * Written by: Vladimir Oleynik <dzo@simtreas.ru> | 6 | * Written by: Vladimir Oleynik <dzo@simtreas.ru> |
| 7 | * | 7 | * |
| 8 | * Used ideas: | 8 | * Used ideas: |
| 9 | * Adam Rogoyski <rogoyski@cs.utexas.edu> | 9 | * Adam Rogoyski <rogoyski@cs.utexas.edu> |
| 10 | * Dave Cinege <dcinege@psychosis.com> | 10 | * Dave Cinege <dcinege@psychosis.com> |
| 11 | * Jakub Jelinek (c) 1995 | 11 | * Jakub Jelinek (c) 1995 |
| 12 | * Erik Andersen <andersee@debian.org> (Majorly adjusted for busybox) | 12 | * Erik Andersen <andersen@codepoet.org> (Majorly adjusted for busybox) |
| 13 | * | 13 | * |
| 14 | * This code is 'as is' with no warranty. | 14 | * This code is 'as is' with no warranty. |
| 15 | * | 15 | * |
| @@ -163,11 +163,6 @@ static int my_gid; | |||
| 163 | 163 | ||
| 164 | #endif /* CONFIG_FEATURE_COMMAND_TAB_COMPLETION */ | 164 | #endif /* CONFIG_FEATURE_COMMAND_TAB_COMPLETION */ |
| 165 | 165 | ||
| 166 | /* It seems that libc5 doesn't know what a sighandler_t is... */ | ||
| 167 | #if (__GLIBC__ <= 2) && (__GLIBC_MINOR__ < 1) | ||
| 168 | typedef void (*sighandler_t) (int); | ||
| 169 | #endif | ||
| 170 | |||
| 171 | static void cmdedit_setwidth(int w, int redraw_flg); | 166 | static void cmdedit_setwidth(int w, int redraw_flg); |
| 172 | 167 | ||
| 173 | static void win_changed(int nsig) | 168 | static void win_changed(int nsig) |
| @@ -264,6 +259,7 @@ static inline void out1str(const char *s) | |||
| 264 | if ( s ) | 259 | if ( s ) |
| 265 | fputs(s, stdout); | 260 | fputs(s, stdout); |
| 266 | } | 261 | } |
| 262 | |||
| 267 | static inline void beep(void) | 263 | static inline void beep(void) |
| 268 | { | 264 | { |
| 269 | putchar('\007'); | 265 | putchar('\007'); |
