-#
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * 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.
+ */
+
+#ifdef notdef
+static char sccsid[] = "@(#)list.c 5.7 (Berkeley) %G%";
+#endif /* notdef */
#include "rcv.h"
#include <ctype.h>
* Message list handling.
*/
-static char *SccsId = "@(#)list.c 1.4 %G%";
-
/*
* Convert the user string of message numbers and
* store the numbers into vector.
if (check(lexnumber, f))
return(-1);
for (i = beg; i <= lexnumber; i++)
- mark(i);
+ if ((message[i - 1].m_flag & MDELETED) == f)
+ mark(i);
beg = 0;
break;
}
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) {
- 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;
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);
/*
* for a RAWLIST.
*/
-getrawlist(line, argv)
+getrawlist(line, argv, argc)
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;
- 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;
- 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';
- if (cp2 == linebuf)
- break;
- *ap++ = savestr(linebuf);
+ argv[argn++] = savestr(linebuf);
}
- *ap = NOSTR;
- return(ap-argv);
+ argv[argn] = NOSTR;
+ return argn;
}
/*
int quotec;
if (regretp >= 0) {
- copy(stringstack[regretp], lexstring);
+ strcpy(lexstring, stringstack[regretp]);
lexnumber = numberstack[regretp];
return(regretstack[regretp--]);
}
char *str;
{
register struct message *mp;
- register char *cp;
+ register char *cp, *cp2, *backup;
mp = &message[mesg-1];
- cp = nameof(mp);
- 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);
}
/*