use shell="" instead of shell=none for no shell,
[unix-history] / usr / src / usr.bin / mail / list.c
index 0ee62ca..b361d6c 100644 (file)
@@ -1,12 +1,18 @@
 /*
  * Copyright (c) 1980 Regents of the University of California.
 /*
  * Copyright (c) 1980 Regents of the University of California.
- * All rights reserved.  The Berkeley software License Agreement
- * specifies the terms and conditions for redistribution.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of California at Berkeley. The name of the University
+ * may not be used to endorse or promote products derived from this
+ * software without specific prior written permission. This software
+ * is provided ``as is'' without express or implied warranty.
  */
 
  */
 
-#ifndef lint
-static char *sccsid = "@(#)list.c      5.3 (Berkeley) %G%";
-#endif not lint
+#ifdef notdef
+static char sccsid[] = "@(#)list.c     5.7 (Berkeley) %G%";
+#endif /* notdef */
 
 #include "rcv.h"
 #include <ctype.h>
 
 #include "rcv.h"
 #include <ctype.h>
@@ -134,22 +140,28 @@ number:
                                printf("Non-numeric second argument\n");
                                return(-1);
                        }
                                printf("Non-numeric second argument\n");
                                return(-1);
                        }
-                       if (valdot < msgCount)
-                               mark(valdot+1);
-                       else {
-                               printf("Referencing beyond EOF\n");
-                               return(-1);
-                       }
+                       i = valdot;
+                       do {
+                               i++;
+                               if (i > msgCount) {
+                                       printf("Referencing beyond EOF\n");
+                                       return(-1);
+                               }
+                       } while ((message[i - 1].m_flag & MDELETED) != f);
+                       mark(i);
                        break;
 
                case TDASH:
                        if (beg == 0) {
                        break;
 
                case TDASH:
                        if (beg == 0) {
-                               if (valdot > 1)
-                                       mark(valdot-1);
-                               else {
-                                       printf("Referencing before 1\n");
-                                       return(-1);
-                               }
+                               i = valdot;
+                               do {
+                                       i--;
+                                       if (i <= 0) {
+                                               printf("Referencing before 1\n");
+                                               return(-1);
+                                       }
+                               } while ((message[i - 1].m_flag & MDELETED) != f);
+                               mark(i);
                        }
                        break;
 
                        }
                        break;
 
@@ -214,7 +226,7 @@ number:
 
        if ((np > namelist || colmod != 0) && mc == 0)
                for (i = 1; i <= msgCount; i++)
 
        if ((np > namelist || colmod != 0) && mc == 0)
                for (i = 1; i <= msgCount; i++)
-                       if ((message[i-1].m_flag & (MSAVED|MDELETED)) == f)
+                       if ((message[i-1].m_flag & MDELETED) == f)
                                mark(i);
 
        /*
                                mark(i);
 
        /*
@@ -336,38 +348,91 @@ check(mesg, f)
  * for a RAWLIST.
  */
 
  * for a RAWLIST.
  */
 
-getrawlist(line, argv)
+getrawlist(line, argv, argc)
        char line[];
        char **argv;
        char line[];
        char **argv;
+       int  argc;
 {
 {
-       register char **ap, *cp, *cp2;
-       char linebuf[BUFSIZ], quotec;
+       register char c, *cp, *cp2, quotec;
+       int argn;
+       char linebuf[BUFSIZ];
 
 
-       ap = argv;
+       argn = 0;
        cp = line;
        cp = line;
-       while (*cp != '\0') {
-               while (any(*cp, " \t"))
-                       cp++;
+       for (;;) {
+               for (; *cp == ' ' || *cp == '\t'; cp++)
+                       ;
+               if (*cp == '\0')
+                       break;
+               if (argn >= argc - 1) {
+                       printf(
+                       "Too many elements in the list; excess discarded.\n");
+                       break;
+               }
                cp2 = linebuf;
                cp2 = linebuf;
-               quotec = 0;
-               if (any(*cp, "'\""))
-                       quotec = *cp++;
-               if (quotec == 0)
-                       while (*cp != '\0' && !any(*cp, " \t"))
-                               *cp2++ = *cp++;
-               else {
-                       while (*cp != '\0' && *cp != quotec)
-                               *cp2++ = *cp++;
-                       if (*cp != '\0')
-                               cp++;
+               quotec = '\0';
+               while ((c = *cp) != '\0') {
+                       cp++;
+                       if (quotec != '\0') {
+                               if (c == quotec)
+                                       quotec = '\0';
+                               else if (c == '\\')
+                                       switch (c = *cp++) {
+                                       case '\0':
+                                               *cp2++ = *--cp;
+                                               break;
+                                       case '0': case '1': case '2': case '3':
+                                       case '4': case '5': case '6': case '7':
+                                               c -= '0';
+                                               if (*cp >= '0' && *cp <= '7')
+                                                       c = c * 8 + *cp++ - '0';
+                                               if (*cp >= '0' && *cp <= '7')
+                                                       c = c * 8 + *cp++ - '0';
+                                               *cp2++ = c;
+                                               break;
+                                       case 'b':
+                                               *cp2++ = '\b';
+                                               break;
+                                       case 'f':
+                                               *cp2++ = '\f';
+                                               break;
+                                       case 'n':
+                                               *cp2++ = '\n';
+                                               break;
+                                       case 'r':
+                                               *cp2++ = '\r';
+                                               break;
+                                       case 't':
+                                               *cp2++ = '\t';
+                                               break;
+                                       case 'v':
+                                               *cp2++ = '\v';
+                                               break;
+                                       }
+                               else if (c == '^') {
+                                       c = *cp++;
+                                       if (c == '?')
+                                               *cp2++ = '\177';
+                                       /* null doesn't show up anyway */
+                                       else if (c >= 'A' && c <= '_' ||
+                                                c >= 'a' && c <= 'z')
+                                               *cp2++ &= 037;
+                                       else
+                                               *cp2++ = *--cp;
+                               } else
+                                       *cp2++ = c;
+                       } else if (c == '"' || c == '\'')
+                               quotec = c;
+                       else if (c == ' ' || c == '\t')
+                               break;
+                       else
+                               *cp2++ = c;
                }
                *cp2 = '\0';
                }
                *cp2 = '\0';
-               if (cp2 == linebuf)
-                       break;
-               *ap++ = savestr(linebuf);
+               argv[argn++] = savestr(linebuf);
        }
        }
-       *ap = NOSTR;
-       return(ap-argv);
+       argv[argn] = NOSTR;
+       return argn;
 }
 
 /*
 }
 
 /*
@@ -401,7 +466,7 @@ scan(sp)
        int quotec;
 
        if (regretp >= 0) {
        int quotec;
 
        if (regretp >= 0) {
-               copy(stringstack[regretp], lexstring);
+               strcpy(lexstring, stringstack[regretp]);
                lexnumber = numberstack[regretp];
                return(regretstack[regretp--]);
        }
                lexnumber = numberstack[regretp];
                return(regretstack[regretp--]);
        }
@@ -545,11 +610,20 @@ sender(str, mesg)
        char *str;
 {
        register struct message *mp;
        char *str;
 {
        register struct message *mp;
-       register char *cp;
+       register char *cp, *cp2, *backup;
 
        mp = &message[mesg-1];
 
        mp = &message[mesg-1];
-       cp = nameof(mp, 0);
-       return(icequal(cp, str));
+       backup = cp2 = nameof(mp, 0);
+       cp = str;
+       while (*cp2) {
+               if (*cp == 0)
+                       return(1);
+               if (raise(*cp++) != raise(*cp2++)) {
+                       cp2 = ++backup;
+                       cp = str;
+               }
+       }
+       return(*cp == 0);
 }
 
 /*
 }
 
 /*