Annotation of 43BSDReno/contrib/mh/zotnet/tws/dtimep.lex, revision 1.1

1.1     ! root        1: %{
        !             2: #ifndef lint
        !             3: static char rcsid[] =
        !             4: #ifdef FLEX_SCANNER
        !             5:     "@(#) $Header: dtimep.lex,v 1.14 89/12/16 00:29:17 leres Locked $ (LBL) (flex generated scanner)";
        !             6: #else
        !             7:     "@(#) $Header: dtimep.lex,v 1.14 89/12/16 00:29:17 leres Locked $ (LBL) (lex generated scanner)";
        !             8: #endif
        !             9: #endif
        !            10: %}
        !            11: /*
        !            12: %e 2000
        !            13: %p 5000
        !            14: %n 1000
        !            15: %a 4000
        !            16:  */
        !            17: 
        !            18: %START Z
        !            19: sun    (sun(day)?)
        !            20: mon    (mon(day)?)
        !            21: tue    (tue(sday)?)
        !            22: wed    (wed(nesday)?)
        !            23: thu    (thu(rsday)?)
        !            24: fri    (fri(day)?)
        !            25: sat    (sat(urday)?)
        !            26: 
        !            27: DAY    ({sun}|{mon}|{tue}|{wed}|{thu}|{fri}|{sat})
        !            28: 
        !            29: jan    (jan(uary)?)
        !            30: feb    (feb(ruary)?)
        !            31: mar    (mar(ch)?)
        !            32: apr    (apr(il)?)
        !            33: may    (may)
        !            34: jun    (jun(e)?)
        !            35: jul    (jul(y)?)
        !            36: aug    (aug(ust)?)
        !            37: sep    (sep(tember)?)
        !            38: oct    (oct(ober)?)
        !            39: nov    (nov(ember)?)
        !            40: dec    (dec(ember)?)
        !            41: 
        !            42: MONTH  ({jan}|{feb}|{mar}|{apr}|{may}|{jun}|{jul}|{aug}|{sep}|{oct}|{nov}|{dec})
        !            43: 
        !            44: w      ([ \t]*)
        !            45: W      ([ \t]+)
        !            46: D      ([0-9]?[0-9])
        !            47: d      [0-9]
        !            48: %{
        !            49: #include "tws.h"
        !            50: #include <ctype.h>
        !            51: 
        !            52: /*
        !            53:  * Patchable flag that says how to interpret NN/NN/NN dates. When
        !            54:  * true, we do it European style: DD/MM/YY. When false, we do it
        !            55:  * American style: MM/DD/YY.
        !            56:  */
        !            57: int europeandate = 0;
        !            58: 
        !            59: /*
        !            60:  * Table to convert month names to numeric month.  We use the
        !            61:  * fact that the low order 5 bits of the sum of the 2nd & 3rd
        !            62:  * characters of the name is a hash with no collisions for the 12
        !            63:  * valid month names.  (The mask to 5 bits maps any combination of
        !            64:  * upper and lower case into the same hash value).
        !            65:  */
        !            66: static int month_map[] = {
        !            67:        0,
        !            68:        6,      /* 1 - Jul */
        !            69:        3,      /* 2 - Apr */
        !            70:        5,      /* 3 - Jun */
        !            71:        0,
        !            72:        10,     /* 5 - Nov */
        !            73:        0,
        !            74:        1,      /* 7 - Feb */
        !            75:        11,     /* 8 - Dec */
        !            76:        0,
        !            77:        0,
        !            78:        0,
        !            79:        0,
        !            80:        0,
        !            81:        0,
        !            82:        0,      /*15 - Jan */
        !            83:        0,
        !            84:        0,
        !            85:        0,
        !            86:        2,      /*19 - Mar */
        !            87:        0,
        !            88:        8,      /*21 - Sep */
        !            89:        0,
        !            90:        9,      /*23 - Oct */
        !            91:        0,
        !            92:        0,
        !            93:        4,      /*26 - May */
        !            94:        0,
        !            95:        7       /*28 - Aug */
        !            96: };
        !            97: /*
        !            98:  * Same trick for day-of-week using the hash function
        !            99:  *  (c1 & 7) + (c2 & 4)
        !           100:  */
        !           101: static int day_map[] = {
        !           102:        0,
        !           103:        0,
        !           104:        0,
        !           105:        6,      /* 3 - Sat */
        !           106:        4,      /* 4 - Thu */
        !           107:        0,
        !           108:        5,      /* 6 - Fri */
        !           109:        0,      /* 7 - Sun */
        !           110:        2,      /* 8 - Tue */
        !           111:        1       /* 9 - Mon */,
        !           112:        0,
        !           113:        3       /*11 - Wed */
        !           114: };
        !           115: #define SETDAY { tw.tw_wday= day_map[(cp[0] & 7) + (cp[1] & 4)];\
        !           116:                tw.tw_flags &= ~TW_SDAY; tw.tw_flags |= TW_SEXP;\
        !           117:                cp += 2; }
        !           118: #define SETMONTH { tw.tw_mon = month_map[(cp[0] + cp[1]) & 0x1f]; gotdate++;\
        !           119:                 cp += 2;\
        !           120:                 SKIPD;}
        !           121: #define CVT2   (i=(*cp++ - '0'),isdigit(*cp)? i*10 + (*cp++ - '0') : i)
        !           122: #define SKIPD  { while ( !isdigit(*cp++) ) ;  --cp; }
        !           123: #define EXPZONE        { tw.tw_flags &= ~TW_SZONE; tw.tw_flags |= TW_SZEXP; }
        !           124: #define ZONE(x)        { tw.tw_zone=(x); EXPZONE; }
        !           125: #define ZONED(x) { ZONE(x); tw.tw_flags |= TW_DST; }
        !           126: #define        LC(c)   (isupper(c) ? tolower(c) : (c))
        !           127: 
        !           128: #ifdef FLEX_SCANNER
        !           129: /* We get passed a string and return a pointer to a static tws struct */
        !           130: #undef YY_DECL
        !           131: #define YY_DECL struct tws *dparsetime(str) char *str;
        !           132: 
        !           133: /* We assume that we're never passed more than max_size characters */
        !           134: #undef YY_INPUT
        !           135: #define YY_INPUT(buf,result,max_size) \
        !           136:        if (gstr) { \
        !           137:                register char *xp; \
        !           138:                xp = gstr; \
        !           139:                while (isspace(*xp)) \
        !           140:                        xp++; \
        !           141:                gstr = xp; \
        !           142:                while (*xp != '\0') \
        !           143:                        ++xp; \
        !           144:                result = xp - gstr; \
        !           145:                bcopy(gstr, buf, result); \
        !           146:                gstr = 0; \
        !           147:        } else \
        !           148:                result = YY_NULL;
        !           149: 
        !           150: /* Date strings aren't usually very long */
        !           151: #undef YY_READ_BUF_SIZE
        !           152: #define YY_READ_BUF_SIZE 128
        !           153: 
        !           154: /* Use mh error reporting routine */
        !           155: #undef YY_FATAL_ERROR
        !           156: #define YY_FATAL_ERROR(s) adios("dparsetime()", s);
        !           157: 
        !           158: /* We need a pointer to the matched text we can modify */
        !           159: #undef YY_USER_ACTION
        !           160: #define YY_USER_ACTION cp = yytext
        !           161: 
        !           162: /* Used to initialize */
        !           163: static struct tws ztw = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        !           164: 
        !           165: /* Global for use by YY_INPUT() macro */
        !           166: static char *gstr;
        !           167: #endif
        !           168: 
        !           169: %}
        !           170: 
        !           171: %%
        !           172:                                        register int i, gotdate;
        !           173:                                        register char *cp;
        !           174:                                        static struct tws tw;
        !           175:                                        static void zonehack();
        !           176: 
        !           177:                                        BEGIN(INITIAL);
        !           178:                                        yy_init = 1;
        !           179:                                        tw = ztw;
        !           180:                                        gstr = str;
        !           181:                                        gotdate = 0;
        !           182: 
        !           183: {DAY}","?{w}                           SETDAY;
        !           184: "("{DAY}")"(","?)                      {
        !           185:                                        cp++;
        !           186:                                        SETDAY;
        !           187:                                        }
        !           188: 
        !           189: {D}"/"{D}"/"(19)?[0-9][0-9]{w}         {
        !           190:                                        if (europeandate) {
        !           191:                                                /* European: DD/MM/YY */
        !           192:                                                tw.tw_mday = CVT2;
        !           193:                                                cp++;
        !           194:                                                tw.tw_mon  = CVT2 - 1;
        !           195:                                        } else {
        !           196:                                                /* American: MM/DD/YY */
        !           197:                                                tw.tw_mon  = CVT2 - 1;
        !           198:                                                cp++;
        !           199:                                                tw.tw_mday = CVT2;
        !           200:                                        }
        !           201:                                        cp++;
        !           202:                                        for (i = 0; isdigit(*cp); )
        !           203:                                                i = i*10 + (*cp++ - '0');
        !           204:                                        tw.tw_year = i % 100;
        !           205:                                        gotdate++;
        !           206:                                        }
        !           207: {D}{w}(-)?{w}{MONTH}{w}(-)?{w}(19)?{D}{w}(\,{w}|at{W})? {
        !           208:                                        tw.tw_mday = CVT2;
        !           209:                                        while (!isalpha(*cp++))
        !           210:                                                ;
        !           211:                                        SETMONTH;
        !           212:                                        for (i = 0; isdigit(*cp); )
        !           213:                                                i = i*10 + (*cp++ - '0');
        !           214:                                        tw.tw_year = i % 100;
        !           215:                                        }
        !           216: {MONTH}{W}{D}","{W}(19)?{D}{w}         {
        !           217:                                        cp++;
        !           218:                                        SETMONTH;
        !           219:                                        tw.tw_mday = CVT2;
        !           220:                                        SKIPD;
        !           221:                                        for (i = 0; isdigit(*cp); )
        !           222:                                                i = i*10 + (*cp++ - '0');
        !           223:                                        tw.tw_year = i % 100;
        !           224:                                        }
        !           225: 
        !           226: {MONTH}{W}{D}{w}                       {
        !           227:                                        cp++;
        !           228:                                        SETMONTH;
        !           229:                                        tw.tw_mday = CVT2;
        !           230:                                        }
        !           231: 
        !           232: {D}:{D}:{D}{w}                         {
        !           233:                                        tw.tw_hour = CVT2; cp++;
        !           234:                                        tw.tw_min  = CVT2; cp++;
        !           235:                                        tw.tw_sec  = CVT2;
        !           236:                                        BEGIN Z;
        !           237:                                        }
        !           238: {D}:{D}{w}                             {
        !           239:                                        tw.tw_hour = CVT2; cp++;
        !           240:                                        tw.tw_min  = CVT2;
        !           241:                                        BEGIN Z;
        !           242:                                        }
        !           243: {D}:{D}{w}am{w}                                {
        !           244:                                        tw.tw_hour = CVT2; cp++;
        !           245:                                        if (tw.tw_hour == 12)
        !           246:                                                tw.tw_hour = 0;
        !           247:                                        tw.tw_min  = CVT2;
        !           248:                                        BEGIN Z;
        !           249:                                        }
        !           250: {D}:{D}{w}pm{w}                                {
        !           251:                                        tw.tw_hour = CVT2; cp++;
        !           252:                                        if (tw.tw_hour != 12)
        !           253:                                                tw.tw_hour += 12;
        !           254:                                        tw.tw_min  = CVT2;
        !           255:                                        BEGIN Z;
        !           256:                                        }
        !           257: [0-2]{d}{d}{d}{d}{d}{w}                        {
        !           258:                                        tw.tw_hour = CVT2;
        !           259:                                        tw.tw_min  = CVT2;
        !           260:                                        tw.tw_sec  = CVT2;
        !           261:                                        BEGIN Z;
        !           262:                                        }
        !           263: 19[6-9]{d}{w}                          {
        !           264:                                        /*
        !           265:                                         * Luckly, 4 digit times in the range
        !           266:                                         * 1960-1999 aren't legal as hour
        !           267:                                         * and minutes. This rule must come
        !           268:                                         * the 4 digit hour and minute rule.
        !           269:                                         */
        !           270:                                        cp += 2;
        !           271:                                        tw.tw_year = CVT2;
        !           272:                                        }
        !           273: [0-2]{d}{d}{d}{w}                      {
        !           274:                                        tw.tw_hour = CVT2;
        !           275:                                        tw.tw_min  = CVT2;
        !           276:                                        BEGIN Z;
        !           277:                                        }
        !           278: <Z>"-"?ut                              ZONE(0 * 60);
        !           279: <Z>"-"?gmt                             ZONE(0 * 60);
        !           280: <Z>"-"?jst                             ZONE(2 * 60);
        !           281: <Z>"-"?jdt                             ZONED(2 * 60);
        !           282: <Z>"-"?est                             ZONE(-5 * 60);
        !           283: <Z>"-"?edt                             ZONED(-5 * 60);
        !           284: <Z>"-"?cst                             ZONE(-6 * 60);
        !           285: <Z>"-"?cdt                             ZONED(-6 * 60);
        !           286: <Z>"-"?mst                             ZONE(-7 * 60);
        !           287: <Z>"-"?mdt                             ZONED(-7 * 60);
        !           288: <Z>"-"?pst                             ZONE(-8 * 60);
        !           289: <Z>"-"?pdt                             ZONED(-8 * 60);
        !           290: <Z>"-"?nst                             ZONE(-(3 * 60 + 30));
        !           291: <Z>"-"?ast                             ZONE(-4 * 60);
        !           292: <Z>"-"?adt                             ZONED(-4 * 60);
        !           293: <Z>"-"?yst                             ZONE(-9 * 60);
        !           294: <Z>"-"?ydt                             ZONED(-9 * 60);
        !           295: <Z>"-"?hst                             ZONE(-10 * 60);
        !           296: <Z>"-"?hdt                             ZONED(-10 * 60);
        !           297: <Z>"-"?bst                             ZONED(-1 * 60);
        !           298: <Z>[a-i]                               {
        !           299:                                        tw.tw_zone = 60 * (('a'-1) - LC(*cp));
        !           300:                                        EXPZONE; 
        !           301:                                        }
        !           302: <Z>[k-m]                               {
        !           303:                                        tw.tw_zone = 60 * ('a' - LC(*cp));
        !           304:                                        EXPZONE; 
        !           305:                                        }
        !           306: <Z>[n-y]                               {
        !           307:                                        tw.tw_zone = 60 * (LC(*cp) - 'm');
        !           308:                                        EXPZONE; 
        !           309:                                        }
        !           310: <Z>"+"[0-1]{d}{d}{d}                   {
        !           311:                                        cp++;
        !           312:                                        tw.tw_zone = ((cp[0] * 10 + cp[1])
        !           313:                                                     -('0' * 10   + '0'))*60
        !           314:                                                    +((cp[2] * 10 + cp[3])
        !           315:                                                     -('0' * 10   + '0'));
        !           316: #ifdef DSTXXX
        !           317:                                        zonehack (&tw);
        !           318: #endif DSTXXX
        !           319:                                        cp += 4;
        !           320:                                        EXPZONE; 
        !           321:                                        }
        !           322: <Z>"-"[0-1]{d}{d}{d}                   {
        !           323:                                        cp++;
        !           324:                                        tw.tw_zone = (('0' * 10   + '0')
        !           325:                                                     -(cp[0] * 10 + cp[1]))*60
        !           326:                                                    +(('0' * 10   + '0')
        !           327:                                                     -(cp[2] * 10 + cp[3]));
        !           328: #ifdef DSTXXX
        !           329:                                        zonehack (&tw);
        !           330: #endif DSTXXX
        !           331:                                        cp += 4;
        !           332:                                        EXPZONE; 
        !           333:                                        }
        !           334: 
        !           335: \n                                     |
        !           336: {W}                                    ;
        !           337: 
        !           338: <INITIAL,Z><<EOF>>                     return(&tw);
        !           339: 
        !           340: .                                      {
        !           341:                                        /*
        !           342:                                         * We jammed; it's an error if we
        !           343:                                         * didn't parse anything.
        !           344:                                         */
        !           345:                                        if (!gotdate || tw.tw_year == 0)
        !           346:                                                return(0);
        !           347:                                        return(&tw);
        !           348:                                        }
        !           349: 
        !           350: %%
        !           351: 
        !           352: #ifdef DSTXXX
        !           353: #include <sys/types.h>
        !           354: #ifndef        BSD42
        !           355: #include <time.h>
        !           356: #else  BSD42
        !           357: #include <sys/time.h>
        !           358: #endif BSD42
        !           359: 
        !           360: static void
        !           361: zonehack(tw)
        !           362:     register struct tws *tw;
        !           363: {
        !           364:     register struct tm *tm;
        !           365: 
        !           366:     if (twclock (tw) == -1L)
        !           367:        return;
        !           368: 
        !           369:     tm = localtime (&tw -> tw_clock);
        !           370:     if (tm -> tm_isdst) {
        !           371:        tw -> tw_flags |= TW_DST;
        !           372:        tw -> tw_zone -= 60;
        !           373:     }
        !           374: }
        !           375: #endif DSTXXX

unix.superglobalmegacorp.com

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