Annotation of 43BSD/contrib/spms/src/bin/plog/from.c, revision 1.1

1.1     ! root        1: /* $Header$ */
        !             2: 
        !             3: /*
        !             4:  * Author: Peter J. Nicklin
        !             5:  */
        !             6: #include <ctype.h>
        !             7: #include <stdio.h>
        !             8: #include "date.h"
        !             9: #include "from.h"
        !            10: #include "null.h"
        !            11: #include "yesno.h"
        !            12: 
        !            13: #define INCRFROM       1000            /* amount to increase From ptr array */
        !            14: #define MAXFROM                1000            /* initial size of From pointer array */
        !            15: 
        !            16: static FROM **Fromp;                   /* pointer to "From " pointer array */
        !            17: static int Ifrom;                      /* current "From " ptr array index */
        !            18: static int Maxfrom = MAXFROM;          /* maximum number of "From " lines */
        !            19: static int Nfrom;                      /* number of "From " lines */
        !            20: 
        !            21: /*
        !            22:  * fromcmp() compares the dates of two "From " lines and returns an integer
        !            23:  * less than, equal to, or greater than zero, according to the chronological
        !            24:  * order of the dates.
        !            25:  */
        !            26: static int
        !            27: fromcmp(f1, f2)
        !            28:        register FROM **f1;             /* FROM struct pointer */
        !            29:        register FROM **f2;             /* FROM struct pointer */
        !            30: {
        !            31:        register int d;                 /* relative time */
        !            32: 
        !            33:        if ((d = (*f1)->bdt.t_year - (*f2)->bdt.t_year) < 0 || d > 0)
        !            34:                return(d);
        !            35:        else if ((d = (*f1)->bdt.t_mon - (*f2)->bdt.t_mon) < 0 || d > 0)
        !            36:                return(d);
        !            37:        else if ((d = (*f1)->bdt.t_day - (*f2)->bdt.t_day) < 0 || d > 0)
        !            38:                return(d);
        !            39:        else if ((d = (*f1)->bdt.t_hour - (*f2)->bdt.t_hour) < 0 || d > 0)
        !            40:                return(d);
        !            41:        else if ((d = (*f1)->bdt.t_min - (*f2)->bdt.t_min) < 0 || d > 0)
        !            42:                return(d);
        !            43:        return((*f1)->bdt.t_sec - (*f2)->bdt.t_sec);
        !            44: }
        !            45: 
        !            46: 
        !            47: 
        !            48: /*
        !            49:  * isfrom() returns a pointer to a "From " line struct if a "From " line,
        !            50:  * otherwise NULL.
        !            51:  */
        !            52: FROM *
        !            53: isfrom(linebuf)
        !            54:        char *linebuf;                  /* line to be examined */
        !            55: {
        !            56:        static FROM from;               /* "From " line struct */
        !            57:        static char frombuf[BUFSIZ];    /* parsed "From " line buffer */
        !            58:        char *strcpy();                 /* string copy */
        !            59:        int  isdate();                  /* is string a ctime(3) date? */
        !            60:        int strncmp();                  /* compare strings for n chars */
        !            61:        void parsefrom();               /* parse "From " line */
        !            62: 
        !            63:        if (strncmp(linebuf, "From ", 5) != 0)
        !            64:                return(0);
        !            65:        /*
        !            66:         * save a copy of linebuf in frombuf because parsefrom()
        !            67:         * breaks up the buffer into several strings and assigns
        !            68:         * from struct pointers to those strings
        !            69:         */
        !            70:        strcpy(frombuf, linebuf);
        !            71:        parsefrom(frombuf, &from);
        !            72:        if (!isdate(from.date))
        !            73:                return(NULL);
        !            74:        return(&from);
        !            75: }
        !            76: 
        !            77: 
        !            78: 
        !            79: /*
        !            80:  * initfrom() creates a "From " pointer array and initializes it with
        !            81:  * a dummy from struct to take care of spurious lines of information
        !            82:  * before the first "From " line in the file. Returns a pointer to the
        !            83:  * from struct, or NULL if out of memory.
        !            84:  */
        !            85: FROM *
        !            86: initfrom()
        !            87: {
        !            88:        char *calloc();                 /* zeroed memory allocation */
        !            89:        char *malloc();                 /* memory allocator */
        !            90: 
        !            91:        if ((Fromp=(FROM **) malloc((unsigned)Maxfrom*sizeof(FROM *))) == NULL)
        !            92:                return((FROM *) NULL);
        !            93:        Ifrom = 0;
        !            94:        if ((Fromp[Ifrom] = (FROM *) calloc(1, sizeof(FROM))) == NULL)
        !            95:                return((FROM *) NULL);
        !            96:        Nfrom = 1;
        !            97:        return(Fromp[Ifrom]);
        !            98: }
        !            99: 
        !           100: 
        !           101: 
        !           102: /*
        !           103:  * nextword() collects a liberal (blank, tab delimited) word and returns a
        !           104:  * pointer to the next word or string.
        !           105:  */
        !           106: char *
        !           107: nextword(word, bp)
        !           108:        register char *bp;              /* buffer pointer */
        !           109:        char **word;                    /* word or string */
        !           110: {
        !           111:        for (; *bp != '\0' && isspace(*bp); bp++)
        !           112:                continue;
        !           113:        *word = bp;
        !           114:        for (; *bp != '\0' && !isspace(*bp); bp++)
        !           115:                continue;
        !           116:        *bp++ = '\0';
        !           117:        for (; *bp != '\0' && isspace(*bp); bp++)
        !           118:                continue;
        !           119:        return(bp);
        !           120: }
        !           121: 
        !           122: 
        !           123: 
        !           124: /*
        !           125:  * outfrom() copies an input stream to an output stream in chronological
        !           126:  * order of "From " messages. Returns YES if successful, otherwise NO.
        !           127:  */
        !           128: outfrom(ifp, ofp)
        !           129:        register FILE *ifp;             /* input stream */
        !           130:        register FILE *ofp;             /* output stream */
        !           131: {
        !           132:        register int c;                 /* current character */
        !           133:        register int i;                 /* "From " pointer array index */
        !           134:        register int n;                 /* character counter */
        !           135: 
        !           136:        for (i = 0; i < Nfrom; i++)
        !           137:                {
        !           138:                fseek(ifp, Fromp[i]->m_seek, 0);
        !           139:                for (n = Fromp[i]->m_len; n > 0; n--)
        !           140:                        {
        !           141:                        c = getc(ifp);
        !           142:                        if (putc(c, ofp) == EOF)
        !           143:                                return(NO);
        !           144:                        }
        !           145:                }
        !           146:        return(YES);
        !           147: }
        !           148: 
        !           149: 
        !           150: 
        !           151: /*
        !           152:  * parsefrom splits a "From " line into its components and sets from
        !           153:  * struct pointers into frombuf.
        !           154:  */
        !           155: void
        !           156: parsefrom(frombuf, from)
        !           157:        char *frombuf;                  /* "From " line buffer */
        !           158:        FROM *from;                     /* "From " line struct */
        !           159: {
        !           160:        register char *dp;              /* date pointer */
        !           161:        register char *fb;              /* frombuf pointer */
        !           162:        char *nextword();               /* get word & go to next word */
        !           163:        char *skipword();               /* skip to next word */
        !           164:        char *strcpy();                 /* string copy */
        !           165:        int strncmp();                  /* compare strings for n chars */
        !           166: 
        !           167:        fb = frombuf;
        !           168:        fb = nextword(&from->from, skipword(fb));
        !           169:        if (strncmp("tty", fb, 3) == 0)
        !           170:                fb = nextword(&from->tty, skipword(fb));
        !           171:        from->date = fb;
        !           172:        for (dp = fb; *dp != '\n' && *dp != '\0'; dp++)
        !           173:                continue;
        !           174:        *dp = '\0';
        !           175: }
        !           176: 
        !           177: 
        !           178: 
        !           179: /*
        !           180:  * savefrom() saves a "From " struct somewhere and appends it to the From
        !           181:  * pointer array. The array is extended if necessary. Returns a pointer
        !           182:  * to the somewhere, or NULL if out of memory.
        !           183:  */
        !           184: FROM *
        !           185: savefrom(f)
        !           186:        FROM *f;                        /* "From " line struct */
        !           187: {
        !           188:        char *malloc();                 /* memory allocator */
        !           189:        char *realloc();                /* reallocate memory block */
        !           190: 
        !           191:        if (Nfrom > Maxfrom)
        !           192:                {
        !           193:                Maxfrom += INCRFROM;
        !           194:                if ((Fromp = (FROM **) realloc((char *)Fromp,
        !           195:                     (unsigned)Maxfrom*sizeof(FROM *))) == NULL)
        !           196:                        return((FROM *) NULL);
        !           197:                }
        !           198:        if ((Fromp[++Ifrom] = (FROM *) malloc(sizeof(FROM))) == NULL)
        !           199:                return((FROM *) NULL);
        !           200:        Nfrom++;
        !           201: 
        !           202:        Fromp[Ifrom]->bdt.t_sec = f->bdt.t_sec;
        !           203:        Fromp[Ifrom]->bdt.t_min = f->bdt.t_min;
        !           204:        Fromp[Ifrom]->bdt.t_hour = f->bdt.t_hour;
        !           205:        Fromp[Ifrom]->bdt.t_day = f->bdt.t_day;
        !           206:        Fromp[Ifrom]->bdt.t_mon = f->bdt.t_mon;
        !           207:        Fromp[Ifrom]->bdt.t_year = f->bdt.t_year;
        !           208:        Fromp[Ifrom]->m_seek = f->m_seek;
        !           209:        Fromp[Ifrom]->m_len = 0;
        !           210:        return(Fromp[Ifrom]);
        !           211: }
        !           212: 
        !           213: 
        !           214: 
        !           215: /*
        !           216:  * sortfrom() sorts "From " lines chronologically.
        !           217:  */
        !           218: void
        !           219: sortfrom()
        !           220: {
        !           221:        int fromcmp();                  /* compare "From " lines by date */
        !           222: 
        !           223:        qsort((char *) Fromp, Nfrom, sizeof(FROM *), fromcmp);
        !           224: }

unix.superglobalmegacorp.com

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