Mercurial > illumos > illumos-gate
changeset 2931:6348b43829d4
6460901 UNIX03: *vsc* mailx(1) "next" command does not handle message lists properly
author | as145665 |
---|---|
date | Mon, 16 Oct 2006 17:00:43 -0700 |
parents | fbfe08e4bef8 |
children | 9882da59a45c |
files | usr/src/cmd/mailx/cmd2.c usr/src/cmd/mailx/hdr/def.h usr/src/cmd/mailx/lex.c usr/src/cmd/mailx/list.c |
diffstat | 4 files changed, 495 insertions(+), 463 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/cmd/mailx/cmd2.c Mon Oct 16 15:11:09 2006 -0700 +++ b/usr/src/cmd/mailx/cmd2.c Mon Oct 16 17:00:43 2006 -0700 @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -21,7 +20,7 @@ */ /* - * Copyright 2002 Sun Microsystems, Inc. All rights reserved. + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -67,59 +66,35 @@ #define S_NOIGNORE 8 /* don't do ignore processing */ /* - * If any arguments were given, go to the next applicable argument - * following dot, otherwise, go to the next applicable message. - * If given as first command with no arguments, print first message. + * If any arguments were given, print the first message + * identified by the first argument. If no arguments are given, + * print the next applicable message after dot. */ -int +int next(int *msgvec) { register struct message *mp; - register int *ip, *ip2; - int list[2], mdot; + int list[2]; if (*msgvec != NULL) { - - /* - * If some messages were supplied, find the - * first applicable one following dot using - * wrap around. - */ - - mdot = dot - &message[0] + 1; - - /* - * Find the first message in the supplied - * message list which follows dot. - */ - - for (ip = msgvec; *ip != NULL; ip++) - if (*ip > mdot) - break; - if (*ip == NULL) - ip = msgvec; - ip2 = ip; - do { - mp = &message[*ip2 - 1]; - if ((mp->m_flag & MDELETED) == 0) { - dot = mp; - goto hitit; - } - if (*ip2 != NULL) - ip2++; - if (*ip2 == NULL) - ip2 = msgvec; - } while (ip2 != ip); - printf(gettext("No messages applicable\n")); - return(1); + if (*msgvec < 0) { + printf((gettext("Negative message given\n"))); + return (1); + } + mp = &message[*msgvec - 1]; + if ((mp->m_flag & MDELETED) == 0) { + dot = mp; + goto hitit; + } + printf(gettext("No applicable message\n")); + return (1); } /* * If this is the first command, select message 1. * Note that this must exist for us to get here at all. */ - if (!sawcom) goto hitit; @@ -127,93 +102,91 @@ * Just find the next good message after dot, no * wraparound. */ - for (mp = dot+1; mp < &message[msgCount]; mp++) if ((mp->m_flag & (MDELETED|MSAVED)) == 0) break; if (mp >= &message[msgCount]) { printf(gettext("At EOF\n")); - return(0); + return (0); } dot = mp; hitit: /* * Print dot. */ - list[0] = dot - &message[0] + 1; list[1] = NULL; - return(type(list)); + return (type(list)); } /* * Save a message in a file. Mark the message as saved * so we can discard when the user quits. */ -int +int save(char str[]) { - return(save1(str, S_MARK)); + return (save1(str, S_MARK)); } /* * Copy a message to a file without affected its saved-ness */ -int +int copycmd(char str[]) { - return(save1(str, 0)); + return (save1(str, 0)); } /* * Save/copy the indicated messages at the end of the passed file name. * If mark is true, mark the message "saved." */ -static int +static int save1(char str[], int mark) { char *file, *cmd; int f, *msgvec; cmd = mark ? "save" : "copy"; - msgvec = (int *) salloc((msgCount + 2) * sizeof *msgvec); + msgvec = (int *)salloc((msgCount + 2) * sizeof (*msgvec)); if ((file = snarf(str, &f, 0)) == NOSTR) file = Getf("MBOX"); - if (f==-1) - return(1); + if (f == -1) + return (1); if (!f) { *msgvec = first(0, MMNORM); if (*msgvec == NULL) { printf(gettext("No messages to %s.\n"), cmd); - return(1); + return (1); } msgvec[1] = NULL; } if (f && getmsglist(str, msgvec, 0) < 0) - return(1); + return (1); if ((file = expand(file)) == NOSTR) - return(1); + return (1); savemsglist(file, msgvec, mark | S_SAVING); - return(0); + return (0); } -int +int Save(int *msgvec) { - return(Save1(msgvec, S_MARK)); + return (Save1(msgvec, S_MARK)); } -int +int Copy(int *msgvec) { - return(Save1(msgvec, 0)); + return (Save1(msgvec, 0)); } /* * save/copy the indicated messages at the end of a file named * by the sender of the first message in the msglist. */ -static int +static int Save1(int *msgvec, int mark) { register char *from; @@ -227,49 +200,49 @@ getrecf(from, recfile, 1, sizeof (recfile)); if (*recfile != '\0') savemsglist(safeexpand(recfile), msgvec, mark | S_SAVING); - return(0); + return (0); } -int +int sput(char str[]) { - return(put1(str, 0)); + return (put1(str, 0)); } -int +int Sput(char str[]) { - return(put1(str, S_NOIGNORE)); + return (put1(str, S_NOIGNORE)); } /* * Put the indicated messages at the end of the passed file name. */ -static int +static int put1(char str[], int doign) { char *file; int f, *msgvec; - msgvec = (int *) salloc((msgCount + 2) * sizeof *msgvec); + msgvec = (int *)salloc((msgCount + 2) * sizeof (*msgvec)); if ((file = snarf(str, &f, 0)) == NOSTR) file = Getf("MBOX"); - if (f==-1) - return(1); + if (f == -1) + return (1); if (!f) { *msgvec = first(0, MMNORM); if (*msgvec == NULL) { printf(gettext("No messages to put.\n")); - return(1); + return (1); } msgvec[1] = NULL; } if (f && getmsglist(str, msgvec, 0) < 0) - return(1); + return (1); if ((file = expand(file)) == NOSTR) - return(1); + return (1); savemsglist(file, msgvec, doign); - return(0); + return (0); } /* @@ -285,7 +258,7 @@ static long wr_maxlines; /* total lines in message */ static int wr_inhead; /* in header of message */ -static void +static void savemsglist(char *file, int *msgvec, int flag) { register int *ip, mesg; @@ -358,7 +331,7 @@ { wr_linecount++; wr_charcount += strlen(line); - return(fputs(line, obuf)); + return (fputs(line, obuf)); } static int @@ -374,13 +347,13 @@ if (wr_inhead) { if (strcmp(line, "\n") == 0) wr_inhead = 0; - return(0); + return (0); } if (wr_inlines >= wr_maxlines && strcmp(line, "\n") == 0) - return(0); + return (0); wr_linecount++; wr_charcount += strlen(line); - return(fputs(line, obuf)); + return (fputs(line, obuf)); } /* @@ -388,31 +361,31 @@ * file name, minus header and trailing blank line. */ -int +int swrite(char str[]) { register char *file; int f, *msgvec; - msgvec = (int *) salloc((msgCount + 2) * sizeof *msgvec); + msgvec = (int *)salloc((msgCount + 2) * sizeof (*msgvec)); if ((file = snarf(str, &f, 1)) == NOSTR) - return(1); - if (f==-1) - return(1); + return (1); + if (f == -1) + return (1); if ((file = expand(file)) == NOSTR) - return(1); + return (1); if (!f) { *msgvec = first(0, MMNORM); if (*msgvec == NULL) { printf(gettext("No messages to write.\n")); - return(1); + return (1); } msgvec[1] = NULL; } if (f && getmsglist(str, msgvec, 0) < 0) - return(1); + return (1); savemsglist(file, msgvec, S_MARK|S_NOHEADER); - return(0); + return (0); } /* @@ -445,12 +418,12 @@ char *line_beg; /* beginning of line, after */ /* leading whitespace */ - /* + /* * Skip leading whitespace. */ for (line_beg = linebuf; - *line_beg && any(*line_beg, " \t"); - line_beg++) { + *line_beg && any(*line_beg, " \t"); + line_beg++) { /* empty body */ } if (!*line_beg) { @@ -458,13 +431,15 @@ printf(gettext("No file specified\n.")); } *flag = 0; - return(NOSTR); + return (NOSTR); } /* * Process line from left-to-right, 1 char at a time. */ - for (pc_type = SN_DELIM, tok_beg = tok_end = NOSTR, p = line_beg; - *p != '\0'; ) { + pc_type = SN_DELIM; + tok_beg = tok_end = NOSTR; + p = line_beg; + while (*p != '\0') { if (any(*p, " \t")) { /* This character is a DELIMITER */ if (pc_type & (SN_TOKEN|SN_QUOTE)) { @@ -482,17 +457,17 @@ } /* Search for the matching QUOTE character */ for (tok_beg = p, tok_end = NOSTR, p++; - *p != '\0' && *p != qc; - p++) { + *p != '\0' && *p != qc; + p++) { if (*p == '\\' && *(p+1) == qc) { p++; } } if (*p == '\0') { printf(gettext("Syntax error: missing " - "%c.\n"), qc); + "%c.\n"), qc); *flag = -1; - return(NOSTR); + return (NOSTR); } tok_end = p; pc_type = SN_QUOTE; @@ -506,15 +481,15 @@ } } else { printf(gettext("improper quotes" - " at \"%s\".\n"), p); + " at \"%s\".\n"), p); *flag = -1; - return(NOSTR); + return (NOSTR); } if (*p == '\\' && *++p == '\0') { printf(gettext("\'\\\' at " - "end of line.\n")); + "end of line.\n")); *flag = -1; - return(NOSTR); + return (NOSTR); } pc_type = SN_TOKEN; p++; @@ -531,13 +506,13 @@ *flag = 1; } tok_end[1] = '\0'; - return(tok_beg); + return (tok_beg); } else { if (erf) { printf(gettext("No file specified\n.")); } *flag = 0; - return(NOSTR); + return (NOSTR); } } @@ -545,7 +520,7 @@ * Delete messages, then type the new dot. */ -int +int deltype(int msgvec[]) { int list[2]; @@ -558,14 +533,13 @@ if (list[0] > lastdot) { touch(list[0]); list[1] = NULL; - return(type(list)); + return (type(list)); } printf(gettext("At EOF\n")); - return(0); - } - else { + return (0); + } else { printf(gettext("No more messages\n")); - return(0); + return (0); } } @@ -573,7 +547,7 @@ * Delete the indicated messages. * Set dot to some nice place afterwards. */ -int +int delm(int *msgvec) { register struct message *mp; @@ -594,11 +568,10 @@ last = first(0, MDELETED); if (last != NULL) { dot = &message[last-1]; - return(0); - } - else { + return (0); + } else { dot = &message[0]; - return(-1); + return (-1); } } @@ -606,13 +579,13 @@ * Following can't happen -- it keeps lint happy */ - return(-1); + return (-1); } /* * Undelete the indicated messages. */ -int +int undelete(int *msgvec) { register struct message *mp; @@ -621,20 +594,20 @@ for (ip = msgvec; ip-msgvec < msgCount; ip++) { mesg = *ip; if (mesg == 0) - return(0); + return (0); touch(mesg); mp = &message[mesg-1]; dot = mp; mp->m_flag &= ~MDELETED; } - return(0); + return (0); } /* * Add the given header fields to the retained list. * If no arguments, print the current list of retained fields. */ -int +int retfield(char *list[]) { char field[BUFSIZ]; @@ -643,7 +616,7 @@ char **ap; if (argcount(list) == 0) - return(retshow()); + return (retshow()); for (ap = list; *ap != 0; ap++) { istrcpy(field, sizeof (field), *ap); @@ -664,13 +637,13 @@ retain[h] = igp; nretained++; } - return(0); + return (0); } /* * Print out all currently retained fields. */ -static int +static int retshow(void) { register int h, count; @@ -683,9 +656,9 @@ count++; if (count == 0) { printf(gettext("No fields currently being retained.\n")); - return(0); + return (0); } - ring = (char **) salloc((count + 1) * sizeof (char *)); + ring = (char **)salloc((count + 1) * sizeof (char *)); ap = ring; for (h = 0; h < HSHSIZE; h++) for (igp = retain[h]; igp != 0; igp = igp->i_link) @@ -694,13 +667,13 @@ qsort(ring, count, sizeof (char *), igcomp); for (ap = ring; *ap != 0; ap++) printf("%s\n", *ap); - return(0); + return (0); } /* * Remove a list of fields from the retain list. */ -int +int unretfield(char *list[]) { char **ap, field[BUFSIZ]; @@ -713,7 +686,7 @@ while (ig1) { free(ig1->i_field); ig2 = ig1->i_link; - free((char *) ig1); + free((char *)ig1); ig1 = ig2; count++; } @@ -723,7 +696,7 @@ printf(gettext( "No fields currently being retained.\n")); nretained = 0; - return 0; + return (0); } for (ap = list; *ap; ap++) { istrcpy(field, sizeof (field), *ap); @@ -735,19 +708,19 @@ else ig2->i_link = ig1->i_link; free(ig1->i_field); - free((char *) ig1); + free((char *)ig1); nretained--; break; } } - return 0; + return (0); } /* * Add the given header fields to the ignored list. * If no arguments, print the current list of ignored fields. */ -int +int igfield(char *list[]) { char field[BUFSIZ]; @@ -756,7 +729,7 @@ char **ap; if (argcount(list) == 0) - return(igshow()); + return (igshow()); for (ap = list; *ap != 0; ap++) { if (isign(*ap, 0)) continue; @@ -775,13 +748,13 @@ igp->i_link = ignore[h]; ignore[h] = igp; } - return(0); + return (0); } /* * Print out all currently ignored fields. */ -static int +static int igshow(void) { register int h, count; @@ -794,33 +767,33 @@ count++; if (count == 0) { printf(gettext("No fields currently being ignored.\n")); - return(0); + return (0); } - ring = (char **) salloc((count + 1) * sizeof (char *)); + ring = (char **)salloc((count + 1) * sizeof (char *)); ap = ring; for (h = 0; h < HSHSIZE; h++) for (igp = ignore[h]; igp != 0; igp = igp->i_link) *ap++ = igp->i_field; *ap = 0; - qsort((char *) ring, (unsigned) count, sizeof (char *), igcomp); + qsort((char *)ring, (unsigned)count, sizeof (char *), igcomp); for (ap = ring; *ap != 0; ap++) printf("%s\n", *ap); - return(0); + return (0); } /* * Compare two names for sorting ignored field list. */ -static int +static int igcomp(const void *l, const void *r) { - return(strcmp(*(char **)l, *(char **)r)); + return (strcmp(*(char **)l, *(char **)r)); } /* * Remove a list of fields from the ignore list. */ -int +int unigfield(char *list[]) { char **ap, field[BUFSIZ]; @@ -833,7 +806,7 @@ while (ig1) { free(ig1->i_field); ig2 = ig1->i_link; - free((char *) ig1); + free((char *)ig1); ig1 = ig2; count++; } @@ -841,7 +814,7 @@ } if (count == 0) printf(gettext("No fields currently being ignored.\n")); - return 0; + return (0); } for (ap = list; *ap; ap++) { istrcpy(field, sizeof (field), *ap); @@ -853,9 +826,9 @@ else ig2->i_link = ig1->i_link; free(ig1->i_field); - free((char *) ig1); + free((char *)ig1); break; } } - return 0; + return (0); }
--- a/usr/src/cmd/mailx/hdr/def.h Mon Oct 16 15:11:09 2006 -0700 +++ b/usr/src/cmd/mailx/hdr/def.h Mon Oct 16 17:00:43 2006 -0700 @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -19,15 +18,15 @@ * * CDDL HEADER END */ + /* - * Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T - * All Rights Reserved - * - * - * Copyright (c) 1985-2001 by Sun Microsystems, Inc. - * All rights reserved. + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. */ +/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ +/* All Rights Reserved */ + /* * University Copyright- Copyright (c) 1982, 1986, 1988 * The Regents of the University of California @@ -60,10 +59,10 @@ #include <ctype.h> #include <errno.h> #ifndef preSVr4 -# include <unistd.h> -# include <stdlib.h> -# include <ulimit.h> -# include <wait.h> +#include <unistd.h> +#include <stdlib.h> +#include <ulimit.h> +#include <wait.h> #endif #ifdef VMUNIX #include <sys/wait.h> @@ -82,16 +81,21 @@ #define HSHSIZE 59 /* Hash size for aliases and vars */ #define HDRFIELDS 3 /* Number of header fields */ #define LINESIZE 5120 /* max readable line width */ -#define STRINGSIZE ((unsigned) 128)/* Dynamic allocation units */ +#define STRINGSIZE ((unsigned)128) /* Dynamic allocation units */ #define MAXARGC 1024 /* Maximum list of raw strings */ -#define NOSTR ((char *) 0) /* Nill string pointer */ -#define NOSTRPTR ((char **) 0) /* Nill pointer to string pointer */ -#define NOINTPTR ((int *) 0) /* Nill pointer */ +#define NOSTR ((char *)0) /* Nill string pointer */ +#define NOSTRPTR ((char **)0) /* Nill pointer to string pointer */ +#define NOINTPTR ((int *)0) /* Nill pointer */ #define MAXEXP 25 /* Maximum expansion of aliases */ -#define equal(a, b) (strcmp(a,b)==0)/* A nice function to string compare */ -#define fopen(s,t) my_fopen(s,t) /* Keep a list of all opened files */ -#define fclose(s) my_fclose(s) /* delete closed file from the list*/ +/* A nice function to string compare */ +#define equal(a, b) (strcmp(a, b) == 0) + +/* Keep a list of all opened files */ +#define fopen(s, t) my_fopen(s, t) + +/* Delete closed file from the list */ +#define fclose(s) my_fclose(s) struct message { off_t m_offset; /* offset in block of message */ @@ -127,31 +131,32 @@ #define H_AFWDCNT 1 /* "Auto-Forward-Count:" */ #define H_AFWDFROM 2 /* "Auto-Forwarded-From:" */ -#define H_CLEN 3 /* "Content-Length:" */ -#define H_CTYPE 4 /* "Content-Type:" */ -#define H_DATE 5 /* "Date:" */ -#define H_DEFOPTS 6 /* "Default-Options:" */ -#define H_EOH 7 /* "End-of-Header:" */ -#define H_FROM 8 /* "From " */ -#define H_FROM1 9 /* ">From " */ -#define H_FROM2 10 /* "From: " */ -#define H_MTSID 11 /* "MTS-Message-ID:" */ -#define H_MTYPE 12 /* "Message-Type:" */ -#define H_MVERS 13 /* "Message-Version:" */ -#define H_MSVC 14 /* "Message-Service:" */ -#define H_RECEIVED 15 /* "Received:" */ -#define H_RVERS 16 /* "Report-Version:" */ -#define H_STATUS 17 /* "Status:" */ -#define H_SUBJ 18 /* "Subject:" */ -#define H_TO 19 /* "To:" */ -#define H_TCOPY 20 /* ">To:" */ +#define H_CLEN 3 /* "Content-Length:" */ +#define H_CTYPE 4 /* "Content-Type:" */ +#define H_DATE 5 /* "Date:" */ +#define H_DEFOPTS 6 /* "Default-Options:" */ +#define H_EOH 7 /* "End-of-Header:" */ +#define H_FROM 8 /* "From " */ +#define H_FROM1 9 /* ">From " */ +#define H_FROM2 10 /* "From: " */ +#define H_MTSID 11 /* "MTS-Message-ID:" */ +#define H_MTYPE 12 /* "Message-Type:" */ +#define H_MVERS 13 /* "Message-Version:" */ +#define H_MSVC 14 /* "Message-Service:" */ +#define H_RECEIVED 15 /* "Received:" */ +#define H_RVERS 16 /* "Report-Version:" */ +#define H_STATUS 17 /* "Status:" */ +#define H_SUBJ 18 /* "Subject:" */ +#define H_TO 19 /* "To:" */ +#define H_TCOPY 20 /* ">To:" */ #define H_TROPTS 21 /* "Transport-Options:" */ #define H_UAID 22 /* "UA-Content-ID:" */ -#define H_DAFWDFROM 23 /* Hold A-F-F when sending Del. Notf. */ -#define H_DTCOPY 24 /* Hold ">To:" when sending Del. Notf.*/ -#define H_DRECEIVED 25 /* Hold Rcvd: when sending Del. Notf.*/ -#define H_CONT 26 /* Continuation of previous line */ -#define H_NAMEVALUE 27 /* unrecognized "name: value" hdr line*/ + +#define H_DAFWDFROM 23 /* Hold A-F-F when sending Del. Notf. */ +#define H_DTCOPY 24 /* Hold ">To:" when sending Del. Notf. */ +#define H_DRECEIVED 25 /* Hold Rcvd: when sending Del. Notf. */ +#define H_CONT 26 /* Continuation of previous line */ +#define H_NAMEVALUE 27 /* unrecognized "name: value" hdr line */ /* * Format of the command description table. @@ -194,8 +199,8 @@ * Oft-used mask values */ -#define MMNORM (MDELETED|MSAVED)/* Look at both save and delete bits */ -#define MMNDEL MDELETED /* Look only at deleted bit */ +#define MMNORM (MDELETED|MSAVED) /* Look at both save and delete bits */ +#define MMNDEL MDELETED /* Look only at deleted bit */ /* * Structure used to return a break down of a head @@ -214,7 +219,7 @@ #define GBCC 8 /* And also the Bcc: line */ #define GDEFOPT 16 /* And the Default-Options: lines */ #define GNL 32 /* Print blank line after */ -#define GOTHER 64 /* Other header lines */ +#define GOTHER 64 /* Other header lines */ #define GMASK (GTO|GSUBJECT|GCC|GBCC|GDEFOPT|GNL|GOTHER) /* Mask of all header lines */ #define GDEL 128 /* Entity removed from list */ @@ -272,22 +277,22 @@ struct mgroup *g_list; /* Users in group. */ }; -#define NIL ((struct name *) 0) /* The nil pointer for namelists */ -#define NONE ((struct cmd *) 0) /* The nil pointer to command tab */ -#define NOVAR ((struct var *) 0) /* The nil pointer to variables */ -#define NOGRP ((struct grouphead *) 0)/* The nil grouphead pointer */ -#define NOGE ((struct mgroup *) 0) /* The nil group pointer */ -#define NOFP ((struct fplst *) 0) /* The nil file pointer */ +#define NIL ((struct name *)0) /* The nil pointer for namelists */ +#define NONE ((struct cmd *)0) /* The nil pointer to command tab */ +#define NOVAR ((struct var *)0) /* The nil pointer to variables */ +#define NOGRP ((struct grouphead *)0) /* The nil grouphead pointer */ +#define NOGE ((struct mgroup *)0) /* The nil group pointer */ +#define NOFP ((struct fplst *)0) /* The nil file pointer */ -#define TRUE 1 -#define FALSE 0 +#define TRUE 1 +#define FALSE 0 -#define DEADPERM 0600 /* permissions of dead.letter */ -#define TEMPPERM 0600 /* permissions of temp files */ -#define MBOXPERM 0600 /* permissions of ~/mbox */ +#define DEADPERM 0600 /* permissions of dead.letter */ +#define TEMPPERM 0600 /* permissions of temp files */ +#define MBOXPERM 0600 /* permissions of ~/mbox */ #ifndef MFMODE -# define MFMODE 0600 /* create mode for `/var/mail' files */ +#define MFMODE 0600 /* create mode for `/var/mail' files */ #endif /* @@ -304,7 +309,7 @@ time_t modtime; }; #else -# include <utime.h> +#include <utime.h> #endif /* @@ -322,7 +327,7 @@ #define TSTAR 7 /* A "*" */ #define TOPEN 8 /* An '(' */ #define TCLOSE 9 /* A ')' */ -#define TPLUS 10 /* A '+' */ +#define TPLUS 10 /* A '+' */ #define REGDEP 2 /* Maximum regret depth. */ #define STRINGLEN 1024 /* Maximum length of string token */ @@ -381,7 +386,7 @@ * useful just before closing an old file that was opened * for read/write. */ -#define trunc(stream) ftruncate(fileno(stream), (long) ftell(stream)) +#define trunc(stream) ftruncate(fileno(stream), (long)ftell(stream)) /* * The pointers for the string allocation routines, @@ -468,100 +473,105 @@ extern int from(int *msgvec); extern off_t fsize(FILE *iob); extern int getfold(char *name); -extern int gethfield(register FILE *f, char linebuf[], register long rem); -extern int getline(char *line, int size, FILE *f, int *hasnulls); -extern int getmsglist(char *buf, int *vector, int flags); -extern int getname(uid_t uid, char namebuf[]); -extern int getrawlist(char line[], char **argv, int argc); -extern void getrecf(char *buf, char *recfile, int useauthor, int sz_recfile); -extern uid_t getuserid(char name[]); -extern int grabh(register struct header *hp, int gflags, int subjtop); -extern int group(char **argv); -extern void hangup(int); -extern int hash(char name[]); -extern char *hcontents(char hfield[]); -extern int headerp(register char *line); -extern int headers(int *msgvec); -extern int help(void); -extern char *helppath(char *file); -extern char *hfield(char field[], struct message *mp, char *(*add)(char *, char *)); -extern void holdsigs(void); -extern int icequal(register char *s1, register char *s2); -extern int ifcmd(char **argv); -extern int igfield(char *list[]); -extern int inc(void); -extern void inithost(void); -extern int isdir(char name[]); -extern int ishead(char linebuf[]); -extern int ishfield(char linebuf[], char field[]); -extern int ishost(char *sys, char *rest); -extern int isign(char *field, int saving); -extern void istrcpy(char *dest, int dstsize, char *src); -extern void lcwrite(char *fn, FILE *fi, FILE *fo, int addnl); -extern void load(char *name); -extern int loadmsg(char str[]); -extern int lock(FILE *fp, char *mode, int blk); -extern void lockmail(void); -extern int mail(char **people); -extern void mail1(struct header *hp, int use_to, char *orig_to); -extern void mapf(register struct name *np, char *from); -extern int mboxit(int msgvec[]); -extern void mechk(struct name *names); -extern int member(register char *realfield, register struct ignore **table); -extern int messize(int *msgvec); -extern void minit(void); -extern int more(int *msgvec); -extern long msend(struct message *mailp, FILE *obuf, int flag, int (*fp)(const char *, FILE *)); -extern int my_fclose(register FILE *iop); -extern FILE *my_fopen(char *file, char *mode); -extern char *nameof(register struct message *mp); -extern char *netmap(char name[], char from[]); -extern int newfileinfo(int start); -extern int next(int *msgvec); -extern int npclose(FILE *ptr); -extern FILE *npopen(char *cmd, char *mode); -extern char *nstrcpy(char *dst, int dstsize, char *src); -extern char *nstrcat(char *dst, int dstsize, char *src); -extern int null(char *e); -extern int outof(struct name *names, FILE *fo); +extern int gethfield(register FILE *f, char linebuf[], register long rem); +extern int getline(char *line, int size, FILE *f, int *hasnulls); +extern int getmessage(char *buf, int *vector, int flags); +extern int getmsglist(char *buf, int *vector, int flags); +extern int getname(uid_t uid, char namebuf[]); +extern int getrawlist(char line[], char **argv, int argc); +extern void getrecf(char *buf, char *recfile, + int useauthor, int sz_recfile); +extern uid_t getuserid(char name[]); +extern int grabh(register struct header *hp, int gflags, int subjtop); +extern int group(char **argv); +extern void hangup(int); +extern int hash(char name[]); +extern char *hcontents(char hfield[]); +extern int headerp(register char *line); +extern int headers(int *msgvec); +extern int help(void); +extern char *helppath(char *file); +extern char *hfield(char field[], struct message *mp, + char *(*add)(char *, char *)); +extern void holdsigs(void); +extern int icequal(register char *s1, register char *s2); +extern int ifcmd(char **argv); +extern int igfield(char *list[]); +extern int inc(void); +extern void inithost(void); +extern int isdir(char name[]); +extern int ishead(char linebuf[]); +extern int ishfield(char linebuf[], char field[]); +extern int ishost(char *sys, char *rest); +extern int isign(char *field, int saving); +extern void istrcpy(char *dest, int dstsize, char *src); +extern void lcwrite(char *fn, FILE *fi, FILE *fo, int addnl); +extern void load(char *name); +extern int loadmsg(char str[]); +extern int lock(FILE *fp, char *mode, int blk); +extern void lockmail(void); +extern int mail(char **people); +extern void mail1(struct header *hp, int use_to, char *orig_to); +extern void mapf(register struct name *np, char *from); +extern int mboxit(int msgvec[]); +extern void mechk(struct name *names); +extern int member(register char *realfield, + register struct ignore **table); +extern int messize(int *msgvec); +extern void minit(void); +extern int more(int *msgvec); +extern long msend(struct message *mailp, FILE *obuf, + int flag, int (*fp)(const char *, FILE *)); +extern int my_fclose(register FILE *iop); +extern FILE *my_fopen(char *file, char *mode); +extern char *nameof(register struct message *mp); +extern char *netmap(char name[], char from[]); +extern int newfileinfo(int start); +extern int next(int *msgvec); +extern int npclose(FILE *ptr); +extern FILE *npopen(char *cmd, char *mode); +extern char *nstrcpy(char *dst, int dstsize, char *src); +extern char *nstrcat(char *dst, int dstsize, char *src); +extern int null(char *e); +extern int outof(struct name *names, FILE *fo); extern struct name *outpre(struct name *to); -extern void panic(char *str); -extern void parse(char line[], struct headline *hl, char pbuf[]); -extern int pcmdlist(void); -extern int pdot(void); -extern int preserve(int *msgvec); -extern void printgroup(char name[]); -extern void printhead(int mesg); -extern int puthead(struct header *hp, FILE *fo, int w, long clen); -extern int pversion(char *e); -extern void quit(int noremove); -extern int readline(FILE *ibuf, char *linebuf); -extern void receipt(struct message *mp); -extern void relsesigs(void); -extern int removefile(char name[]); -extern int replyall(int *msgvec); -extern int replysender(int *msgvec); -extern int respond(int *msgvec); -extern int retfield(char *list[]); -extern int rexit(int e); -extern char *safeexpand(char name[]); -extern void *salloc(unsigned size); -extern void *srealloc(void *optr, unsigned size); -extern int samebody(register char *user, register char *addr, - int fuzzy); -extern int save(char str[]); -extern void savedead(int s); -extern char *savestr(char *str); -extern int schdir(char *str); -extern int screensize(void); -extern int scroll(char arg[]); -extern int sendm(char *str); -extern int set(char **arglist); -extern void setclen(register struct message *mp); -extern int setfile(char *name, int isedit); -extern FILE *setinput(register struct message *mp); -extern void setptr(register FILE *ibuf); -extern int shell(char *str); +extern void panic(char *str); +extern void parse(char line[], struct headline *hl, char pbuf[]); +extern int pcmdlist(void); +extern int pdot(void); +extern int preserve(int *msgvec); +extern void printgroup(char name[]); +extern void printhead(int mesg); +extern int puthead(struct header *hp, FILE *fo, int w, long clen); +extern int pversion(char *e); +extern void quit(int noremove); +extern int readline(FILE *ibuf, char *linebuf); +extern void receipt(struct message *mp); +extern void relsesigs(void); +extern int removefile(char name[]); +extern int replyall(int *msgvec); +extern int replysender(int *msgvec); +extern int respond(int *msgvec); +extern int retfield(char *list[]); +extern int rexit(int e); +extern char *safeexpand(char name[]); +extern void *salloc(unsigned size); +extern void *srealloc(void *optr, unsigned size); +extern int samebody(register char *user, register char *addr, + int fuzzy); +extern int save(char str[]); +extern void savedead(int s); +extern char *savestr(char *str); +extern int schdir(char *str); +extern int screensize(void); +extern int scroll(char arg[]); +extern int sendm(char *str); +extern int set(char **arglist); +extern void setclen(register struct message *mp); +extern int setfile(char *name, int isedit); +extern FILE *setinput(register struct message *mp); +extern void setptr(register FILE *ibuf); +extern int shell(char *str); #ifndef sigchild extern void sigchild(void); #endif
--- a/usr/src/cmd/mailx/lex.c Mon Oct 16 15:11:09 2006 -0700 +++ b/usr/src/cmd/mailx/lex.c Mon Oct 16 17:00:43 2006 -0700 @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -19,15 +18,15 @@ * * CDDL HEADER END */ -/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ -/* All Rights Reserved */ - /* - * Copyright 1998-2002 Sun Microsystems, Inc. All rights reserved. + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ +/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ +/* All Rights Reserved */ + /* * University Copyright- Copyright (c) 1982, 1986, 1988 * The Regents of the University of California @@ -65,7 +64,7 @@ * mbox and so forth. */ -int +int setfile(char *name, int isedit) { FILE *ibuf; @@ -86,16 +85,16 @@ goto doret; } if ((ibuf = fopen(name, "r")) == NULL) { - extern int errno; + extern int errno; int sverrno = errno; - int filethere = (access(name,0) == 0); + int filethere = (access(name, 0) == 0); errno = sverrno; if (exitflg) goto doexit; /* no mail, return error */ if (isedit || filethere) perror(name); else if (!Hflag) { - char *f = strrchr(name,'/'); + char *f = strrchr(name, '/'); if (f == NOSTR) fprintf(stderr, gettext("No mail.\n")); else @@ -116,7 +115,7 @@ fprintf(stderr, gettext("%s: not a regular file\n"), name); else if (!Hflag) { - if (strrchr(name,'/') == NOSTR) + if (strrchr(name, '/') == NOSTR) fprintf(stderr, gettext("No mail.\n")); else fprintf(stderr, gettext("No mail for %s\n"), @@ -126,7 +125,11 @@ goto doret; } - fgets(fortest, sizeof fortest, ibuf); + if (fgets(fortest, sizeof (fortest), ibuf) == NULL) { + perror(gettext("mailx: Unable to read from mail file")); + goto doexit; + } + fseek(ibuf, (long)(BUFSIZ+1), 0); /* flush input buffer */ fseek(ibuf, 0L, 0); if (strncmp(fortest, "Forward to ", 11) == 0) { @@ -170,11 +173,11 @@ fclose(itf); fclose(otf); free(message); - space=0; + space = 0; } readonly = 0; if (!isedit && issysmbox && !Hflag) - readonly = Passeren()==-1; + readonly = Passeren() == -1; lock(ibuf, "r", 1); fstat(fileno(ibuf), &stbuf); utimep->actime = stbuf.st_atime; @@ -215,12 +218,12 @@ sawcom = 0; rc = 0; - doret: +doret: if (!isedit && issysmbox) unlockmail(); - return(rc); + return (rc); - doexit: +doexit: if (!isedit && issysmbox) unlockmail(); exit(exrc ? exrc : rpterr); @@ -240,14 +243,14 @@ char *home; if ((home = getenv("HOME")) == NULL) - return 0; - snprintf(semfn, sizeof (semfn), "%s%s", home, "/.Maillock"); + return (0); + snprintf(semfn, sizeof (semfn), "%s%s", home, "/.Maillock"); if ((semfp = fopen(semfn, "w")) == NULL) { fprintf(stderr, gettext("WARNING: Can't open mail lock file (%s).\n"), semfn); fprintf(stderr, gettext("\t Assuming you are not already reading mail.\n")); - return 0; + return (0); } if (lock(semfp, "w", 0) < 0) { if (errno == ENOLCK) { @@ -255,7 +258,7 @@ gettext("WARNING: Unable to acquire mail lock, no record locks available.\n")); fprintf(stderr, gettext("\t Assuming you are not already reading mail.\n")); - return 0; + return (0); } fprintf(stderr, gettext("WARNING: You are already reading mail.\n")); @@ -263,12 +266,12 @@ gettext("\t This instance of mail is read only.\n")); fclose(semfp); semfp = NULL; - return -1; + return (-1); } - return 0; + return (0); } -void +void Verhogen(void) { if (semfp != NULL) { @@ -285,7 +288,7 @@ static int *msgvec; static int shudprompt; -void +void commands(void) { int eofloop; @@ -317,17 +320,17 @@ eofloop = 0; top: if ((shudprompt = (intty && !sourcing)) != 0) { - if (prompt==NOSTR) { + if (prompt == NOSTR) { if ((int)value("bsdcompat")) prompt = "& "; else - prompt = ""; + prompt = ""; } #ifdef SIGCONT sigset(SIGCONT, contin); #endif if (intty && value("autoinc") && - stat(editfile, &minfo) >=0 && + stat(editfile, &minfo) >= 0 && minfo.st_size > mailsize) { int OmsgCount, i; @@ -336,7 +339,7 @@ holdsigs(); if (!edit && issysmbox) lockmail(); - if ((ibuf = fopen(editfile, "r")) == NULL ) { + if ((ibuf = fopen(editfile, "r")) == NULL) { fprintf(stderr, gettext("Can't reopen %s\n"), editfile); @@ -366,7 +369,7 @@ msgCount-OmsgCount); if (value("header") != NOSTR) for (i = OmsgCount+1; - i <= msgCount; i++) { + i <= msgCount; i++) { printhead(i); sreset(); } @@ -427,13 +430,13 @@ } return; } - strncat(linebuf, line, n); + strncat(linebuf, line, n); #ifdef SIGCONT sigset(SIGCONT, SIG_DFL); #endif if (execute(linebuf, 0)) return; -more: ; +more:; } } @@ -444,7 +447,7 @@ * Contxt is non-zero if called while composing mail. */ -int +int execute(char linebuf[], int contxt) { char word[LINESIZE]; @@ -483,19 +486,19 @@ */ if (sourcing && equal(word, "")) - return(0); + return (0); com = lex(word); if (com == NONE) { fprintf(stderr, gettext("Unknown command: \"%s\"\n"), word); if (loading) { cond = CANY; - return(1); + return (1); } if (sourcing) { cond = CANY; unstack(); } - return(0); + return (0); } /* @@ -506,7 +509,7 @@ if ((com->c_argtype & F) == 0) if (cond == CRCV && !rcvmode || cond == CSEND && rcvmode || cond == CTTY && !intty || cond == CNOTTY && intty) - return(0); + return (0); /* * Special case so that quit causes a return to @@ -517,11 +520,11 @@ if (com->c_func == (int (*)(void *))edstop) { if (sourcing) { if (loading) - return(1); + return (1); unstack(); - return(0); + return (0); } - return(1); + return (1); } /* @@ -536,10 +539,10 @@ gettext("May not execute \"%s\" while sending\n"), com->c_name); if (loading) - return(1); + return (1); if (sourcing) unstack(); - return(0); + return (0); } if (sourcing && com->c_argtype & I) { fprintf(stderr, @@ -547,24 +550,24 @@ com->c_name); rpterr = 1; if (loading) - return(1); + return (1); unstack(); - return(0); + return (0); } if (readonly && com->c_argtype & W) { fprintf(stderr, gettext( "May not execute \"%s\" -- message file is read only\n"), com->c_name); if (loading) - return(1); + return (1); if (sourcing) unstack(); - return(0); + return (0); } if (contxt && com->c_argtype & R) { fprintf(stderr, gettext("Cannot recursively invoke \"%s\"\n"), com->c_name); - return(0); + return (0); } e = 1; switch (com->c_argtype & ~(F|P|I|M|T|W|R)) { @@ -576,7 +579,7 @@ if (msgvec == 0) { fprintf(stderr, gettext("Illegal use of \"message list\"\n")); - return(-1); + return (-1); } if ((c = getmsglist(cp, msgvec, com->c_msgflag)) < 0) break; @@ -597,15 +600,16 @@ case NDMLIST: /* - * A message list with no defaults, but no error - * if none exist. + * A message operand with no defaults, but no error + * if none exists. There will be an error if the + * msgvec pointer is of zero value. */ if (msgvec == 0) { fprintf(stderr, - gettext("Illegal use of \"message list\"\n")); - return(-1); + gettext("Illegal use of \"message operand\"\n")); + return (-1); } - if (getmsglist(cp, msgvec, com->c_msgflag) < 0) + if (getmessage(cp, msgvec, com->c_msgflag) < 0) break; e = (*com->c_func)(msgvec); break; @@ -625,7 +629,7 @@ * A vector of strings, in shell style. */ if ((c = getrawlist(cp, arglist, - sizeof arglist / sizeof *arglist)) < 0) + sizeof (arglist) / sizeof (*arglist))) < 0) break; if (c < com->c_minargs) { fprintf(stderr, @@ -660,11 +664,11 @@ */ if (e && loading) - return(1); + return (1); if (e && sourcing) unstack(); if (com->c_func == (int (*)(void *))edstop) - return(1); + return (1); if (value("autoprint") != NOSTR && com->c_argtype & P) if ((dot->m_flag & MDELETED) == 0) { muvec[0] = dot - &message[0] + 1; @@ -673,14 +677,14 @@ } if (!sourcing && (com->c_argtype & T) == 0) sawcom = 1; - return(0); + return (0); } #ifdef SIGCONT /* * When we wake up after ^Z, reprint the prompt. */ -static void +static void #ifdef __cplusplus contin(int) #else @@ -697,7 +701,7 @@ /* * Branch here on hangup signal and simulate quit. */ -void +void #ifdef __cplusplus hangup(int) #else @@ -707,9 +711,9 @@ { holdsigs(); -# ifdef OLD_BSD_SIGS +#ifdef OLD_BSD_SIGS sigignore(SIGHUP); -# endif +#endif if (edit) { if (setjmp(srbuf)) exit(rpterr); @@ -730,11 +734,11 @@ * lists to message list functions. */ -static void +static void setmsize(int sz) { - if (msgvec != (int *) 0) + if (msgvec != (int *)0) free(msgvec); if (sz < 1) sz = 1; /* need at least one cell for terminating 0 */ @@ -755,14 +759,14 @@ for (cp = &cmdtab[0]; cp->c_name != NOSTR; cp++) if (isprefix(word, cp->c_name)) - return(cp); - return(NONE); + return (cp); + return (NONE); } /* * Determine if as1 is a valid prefix of as2. */ -static int +static int isprefix(char *as1, char *as2) { register char *s1, *s2; @@ -771,8 +775,8 @@ s2 = as2; while (*s1++ == *s2) if (*s2++ == '\0') - return(1); - return(*--s1 == '\0'); + return (1); + return (*--s1 == '\0'); } /* @@ -787,7 +791,7 @@ static int inithdr; /* am printing startup headers */ -void +void stop(int s) { register NODE *head; @@ -798,7 +802,7 @@ inithdr = 0; while (sourcing) unstack(); - getuserid((char *) 0); + (void) getuserid((char *)0); for (head = fplist; head != (NODE *)NULL; head = head->next) { if (head->fp == stdin || head->fp == stdout) continue; @@ -822,9 +826,9 @@ if (s) { fprintf(stderr, gettext("Interrupt\n")); fflush(stderr); -# ifdef OLD_BSD_SIGS +#ifdef OLD_BSD_SIGS sigrelse(s); -# endif +#endif } longjmp(srbuf, 1); } @@ -836,13 +840,13 @@ #define GREETING "%s Type ? for help.\n" -void +void announce(void) { int vec[2], mdot; extern const char *const version; - if (!Hflag && value("quiet")==NOSTR) + if (!Hflag && value("quiet") == NOSTR) printf(gettext(GREETING), version); mdot = newfileinfo(1); vec[0] = mdot; @@ -859,7 +863,7 @@ * Announce information about the file we are editing. * Return a likely place to set dot. */ -int +int newfileinfo(int start) { register struct message *mp; @@ -867,7 +871,7 @@ char fname[BUFSIZ], zname[BUFSIZ], *ename; if (Hflag) - return(1); /* fake it--return message 1 */ + return (1); /* fake it--return message 1 */ for (mp = &message[start - 1]; mp < &message[msgCount]; mp++) if ((mp->m_flag & (MNEW|MREAD)) == MNEW) break; @@ -890,7 +894,7 @@ if (mp->m_flag & MSAVED) s++; } - ename=origname; + ename = origname; if (getfold(fname) >= 0) { nstrcat(fname, sizeof (fname), "/"); if (strncmp(fname, editfile, strlen(fname)) == 0) { @@ -915,14 +919,14 @@ if (readonly) printf(gettext(" [Read only]")); printf("\n"); - return(mdot); + return (mdot); } /* * Print the current version number. */ -int +int #ifdef __cplusplus pversion(char *) #else @@ -931,13 +935,13 @@ #endif { printf("%s\n", version); - return(0); + return (0); } /* * Load a file of user definitions. */ -void +void load(char *name) { register FILE *in, *oldin; @@ -962,7 +966,7 @@ * system mailbox, this probably ought to as well. */ -int +int inc(void) { FILE *ibuf; @@ -972,7 +976,7 @@ if (edit) { fprintf(stderr, gettext("Not in system mailbox\n")); - return(-1); + return (-1); } if (((ibuf = fopen(mailname, "r")) == NULL) || (fstat(fileno(ibuf), &stbuf) < 0) || stbuf.st_size == 0L || @@ -984,7 +988,7 @@ strrchr(mailname, '/')+1); if (ibuf != NULL) fclose(ibuf); - return(-1); + return (-1); } fseek(otf, 0L, 2); @@ -1002,5 +1006,5 @@ mdot = newfileinfo(firstnewmsg); dot = &message[mdot - 1]; sawcom = 0; - return(0); + return (0); }
--- a/usr/src/cmd/mailx/list.c Mon Oct 16 15:11:09 2006 -0700 +++ b/usr/src/cmd/mailx/list.c Mon Oct 16 17:00:43 2006 -0700 @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -19,15 +18,15 @@ * * CDDL HEADER END */ -/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ -/* All Rights Reserved */ - /* - * Copyright (c) 1985-2001 by Sun Microsystems, Inc. - * All rights reserved. + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. */ +/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ +/* All Rights Reserved */ + /* * University Copyright- Copyright (c) 1982, 1986, 1988 * The Regents of the University of California @@ -37,7 +36,6 @@ * software developed by the University of California, Berkeley, and its * contributors. */ - #pragma ident "%Z%%M% %I% %E% SMI" #include "rcv.h" @@ -63,28 +61,76 @@ static void unmark(int mesg); /* + * Process message operand list. + * Convert the user string of message numbers and + * store the numbers into vector. + * + * Returns the count of messages picked up or -1 on error. + */ +int +getmessage(char *buf, int *vector, int flags) +{ + register int *ip; + register struct message *mp; + int i, firstmsg = -1; + + if (markall(buf, flags) < 0) + return (-1); + ip = vector; + + /* + * Check for first message number and make sure it is + * at the beginning of the vector. + */ + i = 0; + while (any(buf[i], " \t")) + i++; + + if (isdigit(buf[i])) { + firstmsg = buf[i] - '0'; + *ip++ = firstmsg; + } + + /* + * Add marked messages to vector and skip first + * message number because it is already at the + * beginning of the vector + */ + for (mp = &message[0]; mp < &message[msgCount]; mp++) { + if (firstmsg == mp - &message[0] + 1) + continue; + if (mp->m_flag & MMARK) + *ip++ = mp - &message[0] + 1; + } + *ip = NULL; + return (ip - vector); +} + +/* + * Process msglist operand list. * Convert the user string of message numbers and * store the numbers into vector. * * Returns the count of messages picked up or -1 on error. */ -int +int getmsglist(char *buf, int *vector, int flags) { register int *ip; register struct message *mp; if (markall(buf, flags) < 0) - return(-1); + return (-1); ip = vector; for (mp = &message[0]; mp < &message[msgCount]; mp++) if (mp->m_flag & MMARK) *ip++ = mp - &message[0] + 1; *ip = NULL; - return(ip - vector); + return (ip - vector); } + /* * Mark all messages that the user wanted from the command * line in the message structure. Return 0 on success, -1 @@ -122,7 +168,7 @@ static int lastcolmod; -static int +static int markall(char buf[], int f) { register char **np; @@ -148,13 +194,13 @@ number: if (star) { printf(gettext("No numbers mixed with *\n")); - return(-1); + return (-1); } mc++; other++; if (beg != 0) { if (check(lexnumber, f)) - return(-1); + return (-1); for (i = beg; i <= lexnumber; i++) if ((message[i-1].m_flag&MDELETED) == f) mark(i); @@ -163,7 +209,7 @@ } beg = lexnumber; if (check(beg, f)) - return(-1); + return (-1); tok = scan(&bufp); if (tok != TDASH) { regret(tok); @@ -176,7 +222,7 @@ if (beg != 0) { printf(gettext( "Non-numeric second argument\n")); - return(-1); + return (-1); } other++; if (lexstring[0] == ':') { @@ -185,7 +231,7 @@ printf(gettext( "Unknown colon modifier \"%s\"\n"), lexstring); - return(-1); + return (-1); } colmod |= colresult; } @@ -200,14 +246,14 @@ case TDOT: lexnumber = metamess(lexstring[0], f); if (lexnumber == -1) - return(-1); + return (-1); goto number; case TSTAR: if (other) { printf(gettext( "Can't mix \"*\" with anything\n")); - return(-1); + return (-1); } star++; break; @@ -225,9 +271,9 @@ } if (mc == 0) { printf(gettext("No applicable messages\n")); - return(-1); + return (-1); } - return(0); + return (0); } /* @@ -254,8 +300,7 @@ mc++; break; } - } - else { + } else { if (sender(*np, i)) { mc++; break; @@ -281,7 +326,7 @@ for (np = &namelist[1]; *np != NOSTR; np++) printf(", %s", *np); printf("}\n"); - return(-1); + return (-1); } } @@ -313,47 +358,47 @@ if (colp->co_bit & colmod) printf(" :%c", colp->co_char); printf("\n"); - return(-1); + return (-1); } } - return(0); + return (0); } /* * Turn the character after a colon modifier into a bit * value. */ -static int +static int evalcol(int col) { register struct coltab *colp; if (col == 0) - return(lastcolmod); + return (lastcolmod); for (colp = &coltab[0]; colp->co_char; colp++) if (colp->co_char == col) - return(colp->co_bit); - return(0); + return (colp->co_bit); + return (0); } /* * Check the passed message number for legality and proper flags. */ -static int +static int check(int mesg, int f) { register struct message *mp; if (mesg < 1 || mesg > msgCount) { printf(gettext("%d: Invalid message number\n"), mesg); - return(-1); + return (-1); } mp = &message[mesg-1]; if ((mp->m_flag & MDELETED) != f) { printf(gettext("%d: Inappropriate message\n"), mesg); - return(-1); + return (-1); } - return(0); + return (0); } /* @@ -361,7 +406,7 @@ * for a RAWLIST. */ -int +int getrawlist(char line[], char **argv, int argc) { register char **ap, *cp, *cp2; @@ -379,7 +424,7 @@ while (*cp != '\0') { if (quotec) { if (*cp == quotec) { - quotec=0; + quotec = 0; cp++; } else *cp2++ = *cp++; @@ -390,7 +435,7 @@ cp++; } else { printf(gettext( - "Trailing \\; ignoring\n")); + "Trailing \\; ignoring\n")); break; } } @@ -406,14 +451,14 @@ if (cp2 == linebuf) break; if (ap >= last) { - printf(gettext( - "Too many elements in the list; excess discarded\n")); + printf(gettext("Too many elements in the list;" + " excess discarded\n")); break; } *ap++ = savestr(linebuf); } *ap = NOSTR; - return(ap-argv); + return (ap-argv); } /* @@ -438,7 +483,7 @@ 0, 0 }; -static int +static int scan(char **sp) { register char *cp, *cp2; @@ -449,7 +494,7 @@ if (regretp >= 0) { copy(stringstack[regretp], lexstring); lexnumber = numberstack[regretp]; - return(regretstack[regretp--]); + return (regretstack[regretp--]); } cp = *sp; cp2 = lexstring; @@ -469,7 +514,7 @@ if (c == '\0') { *sp = --cp; - return(TEOL); + return (TEOL); } /* @@ -487,7 +532,7 @@ } *cp2 = '\0'; *sp = --cp; - return(TNUMBER); + return (TNUMBER); } /* @@ -500,7 +545,7 @@ lexstring[0] = c; lexstring[1] = '\0'; *sp = cp; - return(lp->l_token); + return (lp->l_token); } /* @@ -539,14 +584,14 @@ fprintf(stderr, gettext("Missing %c\n"), quotec); *sp = --cp; *cp2 = '\0'; - return(TSTRING); + return (TSTRING); } /* * Unscan the named token by pushing it onto the regret stack. */ -static void +static void regret(int token) { if (++regretp >= REGDEP) @@ -561,7 +606,7 @@ * Reset all the scanner global variables. */ -static void +static void scaninit(void) { regretp = -1; @@ -572,7 +617,7 @@ * its message number. */ -int +int first(int f, int m) { register int mesg; @@ -583,23 +628,23 @@ m &= MDELETED; for (mp = dot; mp < &message[msgCount]; mp++) { if ((mp->m_flag & m) == f) - return(mesg); + return (mesg); mesg++; } mesg = dot - &message[0]; for (mp = dot-1; mp >= &message[0]; mp--) { if ((mp->m_flag & m) == f) - return(mesg); + return (mesg); mesg--; } - return(NULL); + return (NULL); } /* * See if the passed name sent the passed message number. Return true * if so. */ -static int +static int sender(char *str, int mesg) { return (samebody(str, skin(nameof(&message[mesg-1])), TRUE)); @@ -615,7 +660,7 @@ static char lastscan[128]; -static int +static int matchsubj(char *str, int mesg) { register struct message *mp; @@ -635,24 +680,24 @@ cp = str; cp2 = hfield("subject", mp, addone); if (cp2 == NOSTR) - return(0); + return (0); backup = cp2; while (*cp2) { if (*cp == 0) - return(1); + return (1); if (toupper(*cp++) != toupper(*cp2++)) { cp2 = ++backup; cp = str; } } - return(*cp == 0); + return (*cp == 0); } /* * Mark the named message by setting its mark bit. */ -static void +static void mark(int mesg) { register int i; @@ -667,7 +712,7 @@ * Unmark the named message. */ -static void +static void unmark(int mesg) { register int i; @@ -681,7 +726,7 @@ /* * Return the message number corresponding to the passed meta character. */ -static int +static int metamess(int meta, int f) { register int c, m; @@ -695,9 +740,9 @@ */ for (mp = &message[0]; mp < &message[msgCount]; mp++) if ((mp->m_flag & MDELETED) == f) - return(mp - &message[0] + 1); + return (mp - &message[0] + 1); printf(gettext("No applicable messages\n")); - return(-1); + return (-1); case '+': /* @@ -705,9 +750,9 @@ */ for (mp = dot + 1; mp < &message[msgCount]; mp++) if ((mp->m_flag & MDELETED) == f) - return(mp - &message[0] + 1); + return (mp - &message[0] + 1); printf(gettext("Referencing beyond last message\n")); - return(-1); + return (-1); case '-': /* @@ -715,9 +760,9 @@ */ for (mp = dot - 1; mp >= &message[0]; mp--) if ((mp->m_flag & MDELETED) == f) - return(mp - &message[0] + 1); + return (mp - &message[0] + 1); printf(gettext("Referencing before first message\n")); - return(-1); + return (-1); case '$': /* @@ -725,23 +770,23 @@ */ for (mp = &message[msgCount-1]; mp >= &message[0]; mp--) if ((mp->m_flag & MDELETED) == f) - return(mp - &message[0] + 1); + return (mp - &message[0] + 1); printf(gettext("No applicable messages\n")); - return(-1); + return (-1); case '.': - /* + /* * Current message. */ m = dot - &message[0] + 1; if ((dot->m_flag & MDELETED) != f) { printf(gettext("%d: Inappropriate message\n"), m); - return(-1); + return (-1); } - return(m); + return (m); default: printf(gettext("Unknown metachar (%c)\n"), c); - return(-1); + return (-1); } }