From 4417f6297d70cec0f456c9dbc01685adcb98f84c Mon Sep 17 00:00:00 2001 From: Peter Wemm Date: Tue, 3 Sep 1996 14:16:06 +0000 Subject: [PATCH] Fix for PR#1287. This makes sh behave sensibly in case statements in the face of aliases. Note, bash doesn't do aliases while running scripts, but "real" ksh does.. Also: Reduce redundant .Nm macros in (unused) bltin/echo.1 nuke error2, it's hardly used. More -Wall cleanups dont do certain history operations if NO_HISTORY defined handle quad_t's from resource limits Submitted by: Steve Price (minor tweaks by me) --- bin/sh/bltin/echo.1 | 12 ++++++------ bin/sh/error.c | 10 +--------- bin/sh/error.h | 3 +-- bin/sh/exec.c | 4 ++-- bin/sh/input.c | 9 ++++----- bin/sh/jobs.c | 3 ++- bin/sh/memalloc.c | 6 +++--- bin/sh/miscbltin.c | 9 +++++---- bin/sh/mystring.c | 4 ++-- bin/sh/output.c | 20 +++++++++++++++----- bin/sh/parser.c | 13 +++++++++---- bin/sh/sh.1 | 4 ++-- bin/sh/show.c | 8 ++++---- 13 files changed, 56 insertions(+), 49 deletions(-) diff --git a/bin/sh/bltin/echo.1 b/bin/sh/bltin/echo.1 index 39a5aa192ec9..c5a1b424f253 100644 --- a/bin/sh/bltin/echo.1 +++ b/bin/sh/bltin/echo.1 @@ -34,7 +34,7 @@ .\" SUCH DAMAGE. .\" .\" @(#)echo.1 8.2 (Berkeley) 5/4/95 -.\" $Id: echo.1,v 1.2 1994/09/24 02:58:27 davidg Exp $ +.\" $Id: echo.1,v 1.3 1996/09/01 10:22:15 peter Exp $ .\" .Dd May 4, 1995 .Dt ECHO 1 @@ -43,11 +43,11 @@ .Nm echo .Nd produce message in a shell script .Sh SYNOPSIS -.Nm echo +.Nm .Op Fl n | Fl e .Ar args... .Sh DESCRIPTION -.Nm Echo +.Nm prints its arguments on the standard output, separated by spaces. Unless the .Fl n @@ -55,7 +55,7 @@ option is present, a newline is output following the arguments. The .Fl e option causes -.Nm echo +.Nm to treat the escape sequences specially, as described in the following paragraph. The @@ -77,7 +77,7 @@ A backspace character is output. .It Li \ec Subsequent output is suppressed. This is normally used at the end of the last argument to suppress the trailing newline that -.Nm echo +.Nm would otherwise output. .It Li \ef Output a form feed. @@ -107,6 +107,6 @@ differs from the C language mechanism. .Pp There is no way to force -.Nm echo +.Nm to treat its arguments literally, rather than interpreting them as options and escape sequences. diff --git a/bin/sh/error.c b/bin/sh/error.c index ca5c17b83f08..9bd94ca45695 100644 --- a/bin/sh/error.c +++ b/bin/sh/error.c @@ -33,7 +33,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: error.c,v 1.3 1995/05/30 00:07:10 rgrimes Exp $ + * $Id: error.c,v 1.4 1996/09/01 10:19:53 peter Exp $ */ #ifndef lint @@ -112,14 +112,6 @@ onint() { -void -error2(a, b) - char *a, *b; - { - error("%s: %s", a, b); -} - - /* * Error is called to raise the error exception. If the first argument * is not NULL then error prints an error message using printf style diff --git a/bin/sh/error.h b/bin/sh/error.h index 261b0960fc93..fb26f1e4a5ff 100644 --- a/bin/sh/error.h +++ b/bin/sh/error.h @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)error.h 8.2 (Berkeley) 5/4/95 - * $Id: error.h,v 1.2 1994/09/24 02:57:28 davidg Exp $ + * $Id: error.h,v 1.3 1996/09/01 10:19:55 peter Exp $ */ /* @@ -90,7 +90,6 @@ extern char *commandname; /* name of command--printed on error */ void exraise __P((int)); void onint __P((void)); -void error2 __P((char *, char *)); void error __P((char *, ...)); char *errmsg __P((int, int)); diff --git a/bin/sh/exec.c b/bin/sh/exec.c index 4b6b1b4478eb..dec1eaf98dfa 100644 --- a/bin/sh/exec.c +++ b/bin/sh/exec.c @@ -33,7 +33,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: exec.c,v 1.4 1995/05/30 00:07:12 rgrimes Exp $ + * $Id: exec.c,v 1.5 1996/09/01 10:20:02 peter Exp $ */ #ifndef lint @@ -132,7 +132,7 @@ shellexec(argv, envp, path, index) stunalloc(cmdname); } } - error2(argv[0], errmsg(e, E_EXEC)); + error("%s: %s", argv[0], errmsg(e, E_EXEC)); } diff --git a/bin/sh/input.c b/bin/sh/input.c index 1d41bb2b44f4..e1c530ccb9ae 100644 --- a/bin/sh/input.c +++ b/bin/sh/input.c @@ -33,7 +33,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: input.c,v 1.4 1995/11/03 18:50:14 peter Exp $ + * $Id: input.c,v 1.5 1996/09/01 10:20:18 peter Exp $ */ #ifndef lint @@ -178,14 +178,13 @@ pread() retry: if (parsefile->fd == 0 && el) { const char *rl_cp; - int len; rl_cp = el_gets(el, &nr); if (rl_cp == NULL) nr = 0; else { /* XXX - BUFSIZE should redesign so not necessary */ - strcpy(parsenextc, rl_cp); + (void)strcpy(parsenextc, rl_cp); } } else { @@ -286,13 +285,13 @@ preadbuffer() { savec = *q; *q = '\0'; - +#ifndef NO_HISTORY if (parsefile->fd == 0 && hist && something) { INTOFF; history(hist, whichprompt == 1 ? H_ENTER : H_ADD, parsenextc); INTON; } - +#endif if (vflag) { out2str(parsenextc); diff --git a/bin/sh/jobs.c b/bin/sh/jobs.c index 005e2fd2049c..b9b4096bdfec 100644 --- a/bin/sh/jobs.c +++ b/bin/sh/jobs.c @@ -33,7 +33,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: jobs.c,v 1.5 1996/09/01 10:20:24 peter Exp $ + * $Id: jobs.c,v 1.6 1996/09/03 13:35:09 peter Exp $ */ #ifndef lint @@ -52,6 +52,7 @@ static char sccsid[] = "@(#)jobs.c 8.5 (Berkeley) 5/4/95"; #include #include #endif +#include #include "shell.h" #if JOBS diff --git a/bin/sh/memalloc.c b/bin/sh/memalloc.c index 38b32a9d7cb5..adaf1fe001f3 100644 --- a/bin/sh/memalloc.c +++ b/bin/sh/memalloc.c @@ -33,7 +33,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: memalloc.c,v 1.2 1994/09/24 02:57:50 davidg Exp $ + * $Id: memalloc.c,v 1.3 1996/09/01 10:20:42 peter Exp $ */ #ifndef lint @@ -207,7 +207,7 @@ popstackmark(mark) void growstackblock() { char *p; - int newlen = stacknleft * 2 + 100; + int newlen = ALIGN(stacknleft * 2 + 100); char *oldspace = stacknxt; int oldlen = stacknleft; struct stack_block *sp; @@ -226,7 +226,7 @@ growstackblock() { p = stalloc(newlen); memcpy(p, oldspace, oldlen); stacknxt = p; /* free the space */ - stacknleft += ALIGN(newlen); /* we just allocated */ + stacknleft += newlen; /* we just allocated */ } } diff --git a/bin/sh/miscbltin.c b/bin/sh/miscbltin.c index 97b28853dad4..4122ac5aa69b 100644 --- a/bin/sh/miscbltin.c +++ b/bin/sh/miscbltin.c @@ -33,7 +33,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: miscbltin.c,v 1.5 1996/09/01 10:20:46 peter Exp $ + * $Id: miscbltin.c,v 1.6 1996/09/03 13:35:10 peter Exp $ */ #ifndef lint @@ -51,6 +51,7 @@ static char sccsid[] = "@(#)miscbltin.c 8.4 (Berkeley) 5/4/95"; #include #include #include +#include #include "shell.h" #include "options.h" @@ -292,7 +293,7 @@ ulimitcmd(argc, argv) char **argv; { register int c; - quad_t val; + quad_t val = 0; enum { SOFT = 0x1, HARD = 0x2 } how = SOFT | HARD; const struct limits *l; @@ -365,7 +366,7 @@ ulimitcmd(argc, argv) else { val /= l->factor; - out1fmt("%ld\n", (long) val); + out1fmt("%qd\n", (quad_t) val); } } return 0; @@ -393,7 +394,7 @@ ulimitcmd(argc, argv) else { val /= l->factor; - out1fmt("%ld\n", (long) val); + out1fmt("%qd\n", (quad_t) val); } } return 0; diff --git a/bin/sh/mystring.c b/bin/sh/mystring.c index 5cec9e60ea2e..ab7ea92a079b 100644 --- a/bin/sh/mystring.c +++ b/bin/sh/mystring.c @@ -33,7 +33,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: mystring.c,v 1.2 1994/09/24 02:57:59 davidg Exp $ + * $Id: mystring.c,v 1.3 1996/09/01 10:21:03 peter Exp $ */ #ifndef lint @@ -117,7 +117,7 @@ number(s) { if (! is_number(s)) - error2("Illegal number", (char *)s); + error("Illegal number: %s", (char *)s); return atoi(s); } diff --git a/bin/sh/output.c b/bin/sh/output.c index a52cea9f8747..cc0e84d5d14c 100644 --- a/bin/sh/output.c +++ b/bin/sh/output.c @@ -33,7 +33,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: output.c,v 1.2 1994/09/24 02:58:06 davidg Exp $ + * $Id: output.c,v 1.3 1996/09/01 10:21:23 peter Exp $ */ #ifndef lint @@ -52,6 +52,7 @@ static char sccsid[] = "@(#)output.c 8.2 (Berkeley) 5/4/95"; */ #include +#include /* quad_t */ #include /* defines BUFSIZ */ #include @@ -337,7 +338,7 @@ fmtstr(va_alist) * Formatted output. This routine handles a subset of the printf formats: * - Formats supported: d, u, o, X, s, and c. * - The x format is also accepted but is treated like X. - * - The l modifier is accepted. + * - The l and q modifiers is accepted. * - The - and # flags are accepted; # only works with the o format. * - Width and precision may be specified with any format except c. * - An * may be given for the width or precision. @@ -349,7 +350,7 @@ fmtstr(va_alist) #define TEMPSIZE 24 #ifdef __STDC__ -static const char digit[16] = "0123456789ABCDEF"; +static const char digit[] = "0123456789ABCDEF"; #else static const char digit[17] = "0123456789ABCDEF"; #endif @@ -368,10 +369,11 @@ doformat(dest, f, ap) int width; int prec; int islong; + int isquad; char *p; int sign; - long l; - unsigned long num; + quad_t l; + u_quad_t num; unsigned base; int len; int size; @@ -387,6 +389,7 @@ doformat(dest, f, ap) width = 0; prec = -1; islong = 0; + isquad = 0; for (;;) { if (*f == '-') flushleft++; @@ -418,11 +421,16 @@ doformat(dest, f, ap) if (*f == 'l') { islong++; f++; + } else if (*f == 'q') { + isquad++; + f++; } switch (*f) { case 'd': if (islong) l = va_arg(ap, long); + else if (isquad) + l = va_arg(ap, quad_t); else l = va_arg(ap, int); sign = 0; @@ -447,6 +455,8 @@ doformat(dest, f, ap) sign = 0; if (islong) num = va_arg(ap, unsigned long); + else if (isquad) + num = va_arg(ap, u_quad_t); else num = va_arg(ap, unsigned int); number: /* process a number */ diff --git a/bin/sh/parser.c b/bin/sh/parser.c index 64a0cd008cf6..d24508e4c1a3 100644 --- a/bin/sh/parser.c +++ b/bin/sh/parser.c @@ -33,7 +33,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: parser.c,v 1.11 1996/02/03 13:27:55 joerg Exp $ + * $Id: parser.c,v 1.12 1996/09/01 10:21:31 peter Exp $ */ #ifndef lint @@ -95,6 +95,8 @@ struct heredoc *heredoc; int quoteflag; /* set if (part of) last token was quoted */ int startlinno; /* line # where last token started */ +/* XXX When 'noaliases' is set to one, no alias expansion takes place. */ +static int noaliases = 0; #define GDB_HACK 1 /* avoid local declarations which gdb can't handle */ #ifdef GDB_HACK @@ -414,6 +416,7 @@ TRACE(("expecting DO got %s %s\n", tokname[got], got == TWORD ? wordtext : "")); if (lasttoken != TWORD || ! equal(wordtext, "in")) synerror("expecting \"in\""); cpp = &n1->ncase.cases; + noaliases = 1; /* turn off alias expansion */ checkkwd = 2, readtoken(); do { *cpp = cp = (union node *)stalloc(sizeof (struct nclist)); @@ -431,18 +434,19 @@ TRACE(("expecting DO got %s %s\n", tokname[got], got == TWORD ? wordtext : "")); } ap->narg.next = NULL; if (lasttoken != TRP) - synexpect(TRP); + noaliases = 0, synexpect(TRP); cp->nclist.body = list(0); checkkwd = 2; if ((t = readtoken()) != TESAC) { if (t != TENDCASE) - synexpect(TENDCASE); + noaliases = 0, synexpect(TENDCASE); else checkkwd = 2, readtoken(); } cpp = &cp->nclist.next; } while(lasttoken != TESAC); + noaliases = 0; /* reset alias expansion */ *cpp = NULL; checkkwd = 1; break; @@ -712,7 +716,8 @@ readtoken() { goto out; } } - if ((ap = lookupalias(wordtext, 1)) != NULL) { + if (noaliases == 0 && + (ap = lookupalias(wordtext, 1)) != NULL) { pushstring(ap->val, strlen(ap->val), ap); checkkwd = savecheckkwd; goto top; diff --git a/bin/sh/sh.1 b/bin/sh/sh.1 index 5be3e07e2681..7be1828c21e4 100644 --- a/bin/sh/sh.1 +++ b/bin/sh/sh.1 @@ -33,7 +33,7 @@ .\" SUCH DAMAGE. .\" .\" @(#)sh.1 8.6 (Berkeley) 5/4/95 -.\" $Id: sh.1,v 1.6 1996/08/29 18:06:10 wosch Exp $ +.\" $Id: sh.1,v 1.7 1996/09/01 10:21:39 peter Exp $ .\" .na .TH SH 1 @@ -1281,7 +1281,7 @@ resets trapped (but not ignored) signals to the default action. The trap command has no effect on signals that were ignored on entry to the shell. .TP -ulimit [ -HSacdflmnpst ] [ limit ] +ulimit [ -HSacdflmnust ] [ limit ] Set or display resource limits (see getrlimit(2)). If ``limit'' is specified, the named resource will be set; otherwise the current resource value will be displayed. diff --git a/bin/sh/show.c b/bin/sh/show.c index ac1992aadf3e..4f5d546baee8 100644 --- a/bin/sh/show.c +++ b/bin/sh/show.c @@ -33,7 +33,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: show.c,v 1.2 1994/09/24 02:58:16 davidg Exp $ + * $Id: show.c,v 1.3 1996/09/01 10:21:43 peter Exp $ */ #ifndef lint @@ -341,6 +341,7 @@ trputs(s) } +#ifdef DEBUG static void trstring(s) char *s; @@ -348,7 +349,6 @@ trstring(s) register char *p; char c; -#ifdef DEBUG if (tracefile == NULL) return; putc('"', tracefile); @@ -380,8 +380,8 @@ backslash: putc('\\', tracefile); } } putc('"', tracefile); -#endif } +#endif void @@ -405,13 +405,13 @@ trargs(ap) void opentrace() { +#ifdef DEBUG char s[100]; char *getenv(); #ifdef O_APPEND int flags; #endif -#ifdef DEBUG if (!debug) return; #ifdef not_this_way