Annotation of researchv10no/lbin/mailx/head.c, revision 1.1.1.1

1.1       root        1: #ident "@(#)head.c     1.3 'attmail mail(1) command'"
                      2: #ident "@(#)mailx:head.c       1.3.1.1"
                      3: /*     Copyright (c) 1984 AT&T */
                      4: /*       All Rights Reserved   */
                      5: 
                      6: /*     THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T     */
                      7: /*     The copyright notice above does not evidence any        */
                      8: /*     actual or intended publication of such source code.     */
                      9: 
                     10: #ident "@(#)mailx:head.c       1.3"
                     11: 
                     12: #include "rcv.h"
                     13: 
                     14: /*
                     15:  * mailx -- a modified version of a University of California at Berkeley
                     16:  *     mail program
                     17:  *
                     18:  * Routines for processing and detecting headlines.
                     19:  */
                     20: 
                     21: static char    *copyin();
                     22: static int     isname();
                     23: static char    *nextword();
                     24: 
                     25: /*
                     26:  * Split a headline into its useful components.
                     27:  * Copy the line into dynamic string space, then set
                     28:  * pointers into the copied line in the passed headline
                     29:  * structure.  Actually, it scans.
                     30:  */
                     31: void
                     32: parse(line, hl, pbuf)
                     33:        char line[], pbuf[];
                     34:        struct headline *hl;
                     35: {
                     36:        register char *cp, *dp;
                     37:        char *sp;
                     38:        char word[LINESIZE];
                     39: 
                     40:        hl->l_from = NOSTR;
                     41:        hl->l_tty = NOSTR;
                     42:        hl->l_date = NOSTR;
                     43:        cp = line;
                     44:        sp = pbuf;
                     45: 
                     46:        /*
                     47:         * Skip the first "word" of the line, which should be "From"
                     48:         * anyway.
                     49:         */
                     50: 
                     51:        cp = nextword(cp, word);
                     52:        dp = nextword(cp, word);
                     53:        if (dp == NOSTR) return;
                     54:        if (!equal(word, ""))
                     55:                hl->l_from = copyin(word, &sp);
                     56:        if (isname(dp, "tty", 3)) {
                     57:                cp = nextword(dp, word);
                     58:                hl->l_tty = copyin(word, &sp);
                     59:                if (cp != NOSTR)
                     60:                        hl->l_date = copyin(cp, &sp);
                     61:        }
                     62:        else
                     63:                if (dp != NOSTR)
                     64:                        hl->l_date = copyin(dp, &sp);
                     65: }
                     66: 
                     67: /*
                     68:  * Copy the string on the left into the string on the right
                     69:  * and bump the right (reference) string pointer by the length.
                     70:  * Thus, dynamically allocate space in the right string, copying
                     71:  * the left string into it.
                     72:  */
                     73: 
                     74: static char *
                     75: copyin(src, space)
                     76:        char src[];
                     77:        char **space;
                     78: {
                     79:        register char *cp, *top;
                     80:        register int s;
                     81: 
                     82:        s = strlen(src);
                     83:        cp = *space;
                     84:        top = cp;
                     85:        strcpy(cp, src);
                     86:        cp += s + 1;
                     87:        *space = cp;
                     88:        return(top);
                     89: }
                     90: 
                     91: static
                     92: isname(as1, as2, acount)
                     93:        char *as1, *as2;
                     94: {
                     95:        register char *s1, *s2;
                     96:        register count;
                     97: 
                     98:        s1 = as1;
                     99:        s2 = as2;
                    100:        count = acount;
                    101:        if (count > 0)
                    102:                do
                    103:                        if (*s1++ != *s2++)
                    104:                                return(0);
                    105:                while (--count);
                    106:        return(1);
                    107: }
                    108: 
                    109: /*
                    110:  * Collect a liberal (space, tab delimited) word into the word buffer
                    111:  * passed.  Also, return a pointer to the next word following that,
                    112:  * or NOSTR if none follow.
                    113:  */
                    114: 
                    115: static char *
                    116: nextword(wp, wbuf)
                    117:        char wp[], wbuf[];
                    118: {
                    119:        register char *cp, *cp2;
                    120: 
                    121:        if ((cp = wp) == NOSTR) {
                    122:                copy("", wbuf);
                    123:                return(NOSTR);
                    124:        }
                    125:        cp2 = wbuf;
                    126:        while (!any(*cp, " \t") && *cp != '\0')
                    127:                if (*cp == '"') {
                    128:                        *cp2++ = *cp++;
                    129:                        while (*cp != '\0' && *cp != '"')
                    130:                                *cp2++ = *cp++;
                    131:                        if (*cp == '"')
                    132:                                *cp2++ = *cp++;
                    133:                } else
                    134:                        *cp2++ = *cp++;
                    135:        *cp2 = '\0';
                    136:        while (any(*cp, " \t"))
                    137:                cp++;
                    138:        if (*cp == '\0')
                    139:                return(NOSTR);
                    140:        return(cp);
                    141: }
                    142: 
                    143: /*
                    144:  * Copy str1 to str2, return pointer to null in str2.
                    145:  */
                    146: 
                    147: char *
                    148: copy(str1, str2)
                    149:        char *str1, *str2;
                    150: {
                    151:        register char *s1, *s2;
                    152: 
                    153:        s1 = str1;
                    154:        s2 = str2;
                    155:        while (*s1)
                    156:                *s2++ = *s1++;
                    157:        *s2 = 0;
                    158:        return(s2);
                    159: }
                    160: 
                    161: /*
                    162:  * Is ch any of the characters in str?
                    163:  */
                    164: 
                    165: any(ch, str)
                    166:        char *str;
                    167: {
                    168:        register char *f;
                    169:        register c;
                    170: 
                    171:        f = str;
                    172:        c = ch;
                    173:        while (*f)
                    174:                if (c == *f++)
                    175:                        return(1);
                    176:        return(0);
                    177: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.