#ident "@(#)head.c 1.3 'attmail mail(1) command'" #ident "@(#)mailx:head.c 1.3.1.1" /* Copyright (c) 1984 AT&T */ /* All Rights Reserved */ /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */ /* The copyright notice above does not evidence any */ /* actual or intended publication of such source code. */ #ident "@(#)mailx:head.c 1.3" #include "rcv.h" /* * mailx -- a modified version of a University of California at Berkeley * mail program * * Routines for processing and detecting headlines. */ static char *copyin(); static int isname(); static char *nextword(); /* * Split a headline into its useful components. * Copy the line into dynamic string space, then set * pointers into the copied line in the passed headline * structure. Actually, it scans. */ void parse(line, hl, pbuf) char line[], pbuf[]; struct headline *hl; { register char *cp, *dp; char *sp; char word[LINESIZE]; hl->l_from = NOSTR; hl->l_tty = NOSTR; hl->l_date = NOSTR; cp = line; sp = pbuf; /* * Skip the first "word" of the line, which should be "From" * anyway. */ cp = nextword(cp, word); dp = nextword(cp, word); if (dp == NOSTR) return; if (!equal(word, "")) hl->l_from = copyin(word, &sp); if (isname(dp, "tty", 3)) { cp = nextword(dp, word); hl->l_tty = copyin(word, &sp); if (cp != NOSTR) hl->l_date = copyin(cp, &sp); } else if (dp != NOSTR) hl->l_date = copyin(dp, &sp); } /* * Copy the string on the left into the string on the right * and bump the right (reference) string pointer by the length. * Thus, dynamically allocate space in the right string, copying * the left string into it. */ static char * copyin(src, space) char src[]; char **space; { register char *cp, *top; register int s; s = strlen(src); cp = *space; top = cp; strcpy(cp, src); cp += s + 1; *space = cp; return(top); } static isname(as1, as2, acount) char *as1, *as2; { register char *s1, *s2; register count; s1 = as1; s2 = as2; count = acount; if (count > 0) do if (*s1++ != *s2++) return(0); while (--count); return(1); } /* * Collect a liberal (space, tab delimited) word into the word buffer * passed. Also, return a pointer to the next word following that, * or NOSTR if none follow. */ static char * nextword(wp, wbuf) char wp[], wbuf[]; { register char *cp, *cp2; if ((cp = wp) == NOSTR) { copy("", wbuf); return(NOSTR); } cp2 = wbuf; while (!any(*cp, " \t") && *cp != '\0') if (*cp == '"') { *cp2++ = *cp++; while (*cp != '\0' && *cp != '"') *cp2++ = *cp++; if (*cp == '"') *cp2++ = *cp++; } else *cp2++ = *cp++; *cp2 = '\0'; while (any(*cp, " \t")) cp++; if (*cp == '\0') return(NOSTR); return(cp); } /* * Copy str1 to str2, return pointer to null in str2. */ char * copy(str1, str2) char *str1, *str2; { register char *s1, *s2; s1 = str1; s2 = str2; while (*s1) *s2++ = *s1++; *s2 = 0; return(s2); } /* * Is ch any of the characters in str? */ any(ch, str) char *str; { register char *f; register c; f = str; c = ch; while (*f) if (c == *f++) return(1); return(0); }