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

1.1     ! root        1: /* $Header$ */
        !             2: 
        !             3: #include <ctype.h>
        !             4: #include "date.h"
        !             5: #include "null.h"
        !             6: #include "yesno.h"
        !             7: /*
        !             8:  * date template character codes
        !             9:  */
        !            10: #define        L       1                       /* a lower case chararacter */
        !            11: #define U      2                       /* an upper case character */
        !            12: #define        S       3                       /* a space */
        !            13: #define        D       4                       /* a digit */
        !            14: #define        O       5                       /* an optional digit or space */
        !            15: #define        C       6                       /* a colon */
        !            16: #define        N       7                       /* a newline */
        !            17: /*
        !            18:  * date templates
        !            19:  */
        !            20: static char ctypes[] =
        !            21:        {U,L,L,S,U,L,L,S,O,D,S,D,D,C,D,D,C,D,D,S,D,D,D,D,0};
        !            22: static char tmztypes[] =
        !            23:        {U,L,L,S,U,L,L,S,O,D,S,D,D,C,D,D,C,D,D,S,U,U,U,S,D,D,D,D,0};
        !            24: static char *mon_tab[] =
        !            25:        {
        !            26:        "illegal month",
        !            27:        "Jan",
        !            28:        "Feb",
        !            29:        "Mar",
        !            30:        "Apr",
        !            31:        "May",
        !            32:        "Jun",
        !            33:        "Jul",
        !            34:        "Aug",
        !            35:        "Sep",
        !            36:        "Oct",
        !            37:        "Nov",
        !            38:        "Dec"
        !            39:        };
        !            40: /*
        !            41:  * cmatch() matchs a date against a given template. Returns constant 1 if
        !            42:  * there is a match, otherwise 0.
        !            43:  */
        !            44: static
        !            45: cmatch(date, template)
        !            46:        register char *date;            /* date string */
        !            47:        register char *template;        /* template array */
        !            48: {
        !            49:        register int c;                 /* comparison character */
        !            50: 
        !            51:        for (c = *date++; c != '\0' && *template != 0; c= *date++)
        !            52:                switch (*template++)
        !            53:                        {
        !            54:                case L:
        !            55:                        if (!islower(c))
        !            56:                                return(0);
        !            57:                        break;
        !            58:                case U:
        !            59:                        if (!isupper(c))
        !            60:                                return(0);
        !            61:                        break;
        !            62:                case S:
        !            63:                        if (c != ' ')
        !            64:                                return(0);
        !            65:                        break;
        !            66:                case D:
        !            67:                        if (!isdigit(c))
        !            68:                                return(0);
        !            69:                        break;
        !            70:                case O:
        !            71:                        if (c != ' ' && !isdigit(c))
        !            72:                                return(0);
        !            73:                        break;
        !            74:                case C:
        !            75:                        if (c != ':')
        !            76:                                return(0);
        !            77:                        break;
        !            78:                case N:
        !            79:                        if (c != '\n')
        !            80:                                return(0);
        !            81:                        break;
        !            82:                }
        !            83:        if (c != '\0' || *template != 0)
        !            84:                return(0);
        !            85:        return(1);
        !            86: }
        !            87: 
        !            88: 
        !            89: 
        !            90: /*
        !            91:  * isdate() tests if date is a ctime(3) generated date string.
        !            92:  * The ctypes template is used as the criterion of correctness. Also
        !            93:  * a possible trailing timezone is checked by the tmztype template.
        !            94:  * Returns constant 1 if valid, otherwise 0.
        !            95:  */
        !            96: isdate(date)
        !            97:        char *date;                     /* date string */
        !            98: {
        !            99:        int cmatch();                   /* match date against template */
        !           100: 
        !           101:        if (cmatch(date, ctypes) == 1)
        !           102:                return(1);
        !           103:        return(cmatch(date, tmztypes));
        !           104: }
        !           105: 
        !           106: 
        !           107: 
        !           108: /*
        !           109:  * parsedate() breaks down the time returned by ctime(3) into a DATE
        !           110:  * struct. Returns constant NO if a bad date, otherwise YES.
        !           111:  */
        !           112: parsedate(cdate, dt)
        !           113:        char *cdate;                    /* ctime(3) generated date string */
        !           114:        DATE *dt;                       /* pointer to broken-down time struct */
        !           115: {
        !           116:        int atoi();                     /* convert alpha string to integer */
        !           117:        int cmatch();                   /* match date against template */
        !           118:        int strncmp();                  /* compare n characters in string */
        !           119: 
        !           120:        if (cmatch(cdate, ctypes) == 1)
        !           121:                {
        !           122:                dt->t_year = atoi(cdate+20);
        !           123:                }
        !           124:        else if (cmatch(cdate, tmztypes) == 1)
        !           125:                {
        !           126:                dt->t_year = atoi(cdate+24);
        !           127:                }
        !           128:        else    {
        !           129:                return(NO);
        !           130:                }
        !           131:        for (dt->t_mon = 12; dt->t_mon > 0; dt->t_mon--)
        !           132:                if (strncmp(mon_tab[dt->t_mon], cdate+4, 3) == 0)
        !           133:                        break;
        !           134:        if (dt->t_mon <= 0)
        !           135:                return(NO);
        !           136:        dt->t_day = atoi(cdate+8);
        !           137:        dt->t_hour = atoi(cdate+11);
        !           138:        dt->t_min = atoi(cdate+14);
        !           139:        dt->t_sec = atoi(cdate+17);
        !           140:        return(YES);
        !           141: }

unix.superglobalmegacorp.com

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