fix bug where quoted pattern to case(1) wasen't being quoted
authorMarc Teitelbaum <marc@ucbvax.Berkeley.EDU>
Fri, 31 Jul 1992 06:42:29 +0000 (22:42 -0800)
committerMarc Teitelbaum <marc@ucbvax.Berkeley.EDU>
Fri, 31 Jul 1992 06:42:29 +0000 (22:42 -0800)
SCCS-vsn: bin/sh/expand.c 5.8
SCCS-vsn: bin/sh/expand.h 5.3

usr/src/bin/sh/expand.c
usr/src/bin/sh/expand.h

index 65c1430..3d844dd 100644 (file)
@@ -9,7 +9,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)expand.c   5.7 (Berkeley) %G%";
+static char sccsid[] = "@(#)expand.c   5.8 (Berkeley) %G%";
 #endif /* not lint */
 
 /*
 #endif /* not lint */
 
 /*
@@ -68,6 +68,7 @@ STATIC void recordregion(int, int, int);
 STATIC void ifsbreakup(char *, struct arglist *);
 STATIC void expandmeta(struct strlist *, int);
 STATIC void expmeta(char *, char *);
 STATIC void ifsbreakup(char *, struct arglist *);
 STATIC void expandmeta(struct strlist *, int);
 STATIC void expmeta(char *, char *);
+STATIC void expari(int);
 STATIC void addfname(char *);
 STATIC struct strlist *expsort(struct strlist *);
 STATIC struct strlist *msort(struct strlist *, int);
 STATIC void addfname(char *);
 STATIC struct strlist *expsort(struct strlist *);
 STATIC struct strlist *msort(struct strlist *, int);
@@ -83,6 +84,7 @@ STATIC void recordregion();
 STATIC void ifsbreakup();
 STATIC void expandmeta();
 STATIC void expmeta();
 STATIC void ifsbreakup();
 STATIC void expandmeta();
 STATIC void expmeta();
+STATIC void expari();
 STATIC void addfname();
 STATIC struct strlist *expsort();
 STATIC struct strlist *msort();
 STATIC void addfname();
 STATIC struct strlist *expsort();
 STATIC struct strlist *msort();
@@ -107,7 +109,7 @@ expandhere(arg, fd)
 
 /*
  * Perform variable substitution and command substitution on an argument,
 
 /*
  * Perform variable substitution and command substitution on an argument,
- * placing the resulting list of arguments in arglist.  If full is true,
+ * placing the resulting list of arguments in arglist.  If EXP_FULL is true,
  * perform splitting and file name expansion.  When arglist is NULL, perform
  * here document expansion.
  */
  * perform splitting and file name expansion.  When arglist is NULL, perform
  * here document expansion.
  */
@@ -165,8 +167,8 @@ expandarg(arg, arglist, flag)
 
 
 /*
 
 
 /*
- * Perform variable and command substitution.  If full is set, output CTLESC
- * characters to allow for further processing.  If full is not set, treat
+ * Perform variable and command substitution.  If EXP_FULL is set, output CTLESC
+ * characters to allow for further processing.  Otherwise treat
  * $@ like $* since no splitting will be performed.
  */
 
  * $@ like $* since no splitting will be performed.
  */
 
@@ -174,20 +176,18 @@ STATIC void
 argstr(p, flag)
        register char *p;
        {
 argstr(p, flag)
        register char *p;
        {
-       char c;
-       int sawari = 0;
-       int full = flag & EXP_FULL;  /* is there a later stage? */
-       int vartilde = flag & EXP_VARTILDE;
+       register char c;
+       int quotes = flag & (EXP_FULL | EXP_CASE);      /* do CTLESC */
 
        if (*p == '~' && (flag & (EXP_TILDE | EXP_VARTILDE)))
 
        if (*p == '~' && (flag & (EXP_TILDE | EXP_VARTILDE)))
-               p = exptilde(p, vartilde);
+               p = exptilde(p, flag);
        for (;;) {
                switch (c = *p++) {
                case '\0':
                case CTLENDVAR: /* ??? */
                        goto breakloop;
                case CTLESC:
        for (;;) {
                switch (c = *p++) {
                case '\0':
                case CTLENDVAR: /* ??? */
                        goto breakloop;
                case CTLESC:
-                       if (full)
+                       if (quotes)
                                STPUTC(c, expdest);
                        c = *p++;
                        STPUTC(c, expdest);
                                STPUTC(c, expdest);
                        c = *p++;
                        STPUTC(c, expdest);
@@ -197,16 +197,16 @@ argstr(p, flag)
                        break;
                case CTLBACKQ:
                case CTLBACKQ|CTLQUOTE:
                        break;
                case CTLBACKQ:
                case CTLBACKQ|CTLQUOTE:
-                       expbackq(argbackq->n, c & CTLQUOTE, full);
+                       expbackq(argbackq->n, c & CTLQUOTE, flag);
                        argbackq = argbackq->next;
                        break;
                case CTLENDARI:
                        argbackq = argbackq->next;
                        break;
                case CTLENDARI:
-                       expari();
+                       expari(flag);
                        break;
                case ':':
                        STPUTC(c, expdest);
                        break;
                case ':':
                        STPUTC(c, expdest);
-                       if (vartilde && *p == '~')
-                               p = exptilde(p, vartilde);
+                       if (flag & EXP_VARTILDE && *p == '~')
+                               p = exptilde(p, flag);
                        break;
                default:
                        STPUTC(c, expdest);
                        break;
                default:
                        STPUTC(c, expdest);
@@ -216,19 +216,20 @@ breakloop:;
 }
 
 STATIC char *
 }
 
 STATIC char *
-exptilde(p, vartilde)
+exptilde(p, flag)
        char *p;
        {
        char c, *startp = p;
        struct passwd *pw;
        char *home;
        char *p;
        {
        char c, *startp = p;
        struct passwd *pw;
        char *home;
+       int quotes = flag & (EXP_FULL | EXP_CASE);
 
        while (c = *p) {
                switch(c) {
                case CTLESC:
                        return (startp);
                case ':':
 
        while (c = *p) {
                switch(c) {
                case CTLESC:
                        return (startp);
                case ':':
-                       if (vartilde)
+                       if (flag & EXP_VARTILDE)
                                goto done;
                        break;
                case '/':
                                goto done;
                        break;
                case '/':
@@ -250,7 +251,7 @@ done:
                goto lose;
        *p = c;
        while (c = *home++) {
                goto lose;
        *p = c;
        while (c = *home++) {
-               if (SQSYNTAX[c] == CCTL)
+               if (quotes && SQSYNTAX[c] == CCTL)
                        STPUTC(CTLESC, expdest);
                STPUTC(c, expdest);
        }
                        STPUTC(CTLESC, expdest);
                STPUTC(c, expdest);
        }
@@ -265,10 +266,12 @@ lose:
  * Expand arithmetic expression.  Backup to start of expression,
  * evaluate, place result in (backed up) result, adjust string position.
  */
  * Expand arithmetic expression.  Backup to start of expression,
  * evaluate, place result in (backed up) result, adjust string position.
  */
-expari()
+void
+expari(flag)
        {
        char *p, *start;
        int result;
        {
        char *p, *start;
        int result;
+       int quotes = flag & (EXP_FULL | EXP_CASE);
 
        /*
         * This routine is slightly over-compilcated for
 
        /*
         * This routine is slightly over-compilcated for
@@ -292,7 +295,8 @@ expari()
                for (p = start; *p != CTLARI; p++)
                        if (*p == CTLESC)
                                p++;
                for (p = start; *p != CTLARI; p++)
                        if (*p == CTLESC)
                                p++;
-       rmescapes(p+1);
+       if (quotes)
+               rmescapes(p+1);
        result = arith(p+1);
        fmtstr(p, 10, "%d", result);
        while (*p++)
        result = arith(p+1);
        fmtstr(p, 10, "%d", result);
        while (*p++)
@@ -307,7 +311,7 @@ expari()
  */
 
 STATIC void
  */
 
 STATIC void
-expbackq(cmd, quoted, full)
+expbackq(cmd, quoted, flag)
        union node *cmd;
        {
        struct backcmd in;
        union node *cmd;
        {
        struct backcmd in;
@@ -321,6 +325,7 @@ expbackq(cmd, quoted, full)
        int startloc = dest - stackblock();
        char const *syntax = quoted? DQSYNTAX : BASESYNTAX;
        int saveherefd;
        int startloc = dest - stackblock();
        char const *syntax = quoted? DQSYNTAX : BASESYNTAX;
        int saveherefd;
+       int quotes = flag & (EXP_FULL | EXP_CASE);
 
        INTOFF;
        saveifs = ifsfirst;
 
        INTOFF;
        saveifs = ifsfirst;
@@ -351,7 +356,7 @@ expbackq(cmd, quoted, full)
                }
                lastc = *p++;
                if (lastc != '\0') {
                }
                lastc = *p++;
                if (lastc != '\0') {
-                       if (full && syntax[lastc] == CCTL)
+                       if (quotes && syntax[lastc] == CCTL)
                                STPUTC(CTLESC, dest);
                        STPUTC(lastc, dest);
                }
                                STPUTC(CTLESC, dest);
                        STPUTC(lastc, dest);
                }
@@ -394,6 +399,7 @@ evalvar(p, flag)
        int set;
        int special;
        int startloc;
        int set;
        int special;
        int startloc;
+       int quotes = flag & (EXP_FULL | EXP_CASE);
 
        varflags = *p++;
        subtype = varflags & VSTYPE;
 
        varflags = *p++;
        subtype = varflags & VSTYPE;
@@ -423,7 +429,7 @@ again: /* jump here after setting a variable with ${var=text} */
                        char const *syntax = (varflags & VSQUOTE)? DQSYNTAX : BASESYNTAX;
 
                        while (*val) {
                        char const *syntax = (varflags & VSQUOTE)? DQSYNTAX : BASESYNTAX;
 
                        while (*val) {
-                               if ((flag & EXP_FULL) && syntax[*val] == CCTL)
+                               if (quotes && syntax[*val] == CCTL)
                                        STPUTC(CTLESC, expdest);
                                STPUTC(*val++, expdest);
                        }
                                        STPUTC(CTLESC, expdest);
                                STPUTC(*val++, expdest);
                        }
@@ -959,9 +965,11 @@ patmatch(pattern, string)
        char *pattern;
        char *string;
        {
        char *pattern;
        char *string;
        {
+#ifdef notdef
        if (pattern[0] == '!' && pattern[1] == '!')
                return 1 - pmatch(pattern + 2, string);
        else
        if (pattern[0] == '!' && pattern[1] == '!')
                return 1 - pmatch(pattern + 2, string);
        else
+#endif
                return pmatch(pattern, string);
 }
 
                return pmatch(pattern, string);
 }
 
@@ -1045,7 +1053,7 @@ pmatch(pattern, string)
                                return 0;
                        break;
                }
                                return 0;
                        break;
                }
-dft:       default:
+dft:           default:
                        if (*q++ != c)
                                return 0;
                        break;
                        if (*q++ != c)
                                return 0;
                        break;
@@ -1102,7 +1110,7 @@ casematch(pattern, val)
        argbackq = pattern->narg.backquote;
        STARTSTACKSTR(expdest);
        ifslastp = NULL;
        argbackq = pattern->narg.backquote;
        STARTSTACKSTR(expdest);
        ifslastp = NULL;
-       argstr(pattern->narg.text, 0);
+       argstr(pattern->narg.text, EXP_TILDE | EXP_CASE);
        STPUTC('\0', expdest);
        p = grabstackstr(expdest);
        result = patmatch(p, val);
        STPUTC('\0', expdest);
        p = grabstackstr(expdest);
        result = patmatch(p, val);
index e48ca97..ba6e3b4 100644 (file)
@@ -7,7 +7,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)expand.h    5.2 (Berkeley) %G%
+ *     @(#)expand.h    5.3 (Berkeley) %G%
  */
 
 struct strlist {
  */
 
 struct strlist {
@@ -28,6 +28,7 @@ struct arglist {
 #define EXP_TILDE      0x2     /* do normal tilde expansion */
 #define        EXP_VARTILDE    0x4     /* expand tildes in an assignment */
 #define        EXP_REDIR       0x8     /* file glob for a redirection (1 match only) */
 #define EXP_TILDE      0x2     /* do normal tilde expansion */
 #define        EXP_VARTILDE    0x4     /* expand tildes in an assignment */
 #define        EXP_REDIR       0x8     /* file glob for a redirection (1 match only) */
+#define EXP_CASE       0x10    /* keeps quotes around for CASE pattern */
 
 
 #ifdef __STDC__
 
 
 #ifdef __STDC__