Annotation of embedaddon/php/ext/date/lib/parse_iso_intervals.c, revision 1.1.1.3

1.1.1.2   misho       1: /* Generated by re2c 0.13.5 on Mon Dec  5 22:02:27 2011 */
1.1       misho       2: #line 1 "ext/date/lib/parse_iso_intervals.re"
                      3: /*
                      4:    +----------------------------------------------------------------------+
                      5:    | PHP Version 5                                                        |
                      6:    +----------------------------------------------------------------------+
1.1.1.3 ! misho       7:    | Copyright (c) 1997-2013 The PHP Group                                |
1.1       misho       8:    +----------------------------------------------------------------------+
                      9:    | This source file is subject to version 3.01 of the PHP license,      |
                     10:    | that is bundled with this package in the file LICENSE, and is        |
                     11:    | available through the world-wide-web at the following url:           |
                     12:    | http://www.php.net/license/3_01.txt                                  |
                     13:    | If you did not receive a copy of the PHP license and are unable to   |
                     14:    | obtain it through the world-wide-web, please send a note to          |
                     15:    | license@php.net so we can mail you a copy immediately.               |
                     16:    +----------------------------------------------------------------------+
                     17:    | Authors: Derick Rethans <derick@derickrethans.nl>                    |
                     18:    +----------------------------------------------------------------------+
                     19:  */
                     20: 
1.1.1.2   misho      21: /* $Id$ */
1.1       misho      22: 
                     23: #include "timelib.h"
                     24: 
                     25: #include <stdio.h>
                     26: #include <ctype.h>
                     27: 
                     28: #ifdef HAVE_STDLIB_H
                     29: #include <stdlib.h>
                     30: #endif
                     31: #ifdef HAVE_STRING_H
                     32: #include <string.h>
                     33: #else
                     34: #include <strings.h>
                     35: #endif
                     36: 
                     37: #if defined(_MSC_VER)
                     38: # define strtoll(s, f, b) _atoi64(s)
                     39: #elif !defined(HAVE_STRTOLL)
                     40: # if defined(HAVE_ATOLL)
                     41: #  define strtoll(s, f, b) atoll(s)
                     42: # else
                     43: #  define strtoll(s, f, b) strtol(s, f, b)
                     44: # endif
                     45: #endif
                     46: 
                     47: #define TIMELIB_UNSET   -99999
                     48: 
                     49: #define TIMELIB_SECOND  1
                     50: #define TIMELIB_MINUTE  2
                     51: #define TIMELIB_HOUR    3
                     52: #define TIMELIB_DAY     4
                     53: #define TIMELIB_MONTH   5
                     54: #define TIMELIB_YEAR    6
                     55: 
                     56: #define EOI      257
                     57: 
                     58: #define TIMELIB_PERIOD  260
                     59: #define TIMELIB_ISO_DATE 261
                     60: #define TIMELIB_ERROR   999
                     61: 
                     62: typedef unsigned char uchar;
                     63: 
                     64: #define   BSIZE           8192
                     65: 
                     66: #define   YYCTYPE      uchar
                     67: #define   YYCURSOR     cursor
                     68: #define   YYLIMIT      s->lim
                     69: #define   YYMARKER     s->ptr
                     70: #define   YYFILL(n)    return EOI;
                     71: 
                     72: #define   RET(i)       {s->cur = cursor; return i;}
                     73: 
                     74: #define timelib_string_free free
                     75: 
                     76: #define TIMELIB_INIT  s->cur = cursor; str = timelib_string(s); ptr = str
                     77: #define TIMELIB_DEINIT timelib_string_free(str)
                     78: 
                     79: #ifdef DEBUG_PARSER
                     80: #define DEBUG_OUTPUT(s) printf("%s\n", s);
                     81: #define YYDEBUG(s,c) { if (s != -1) { printf("state: %d ", s); printf("[%c]\n", c); } }
                     82: #else
                     83: #define DEBUG_OUTPUT(s)
                     84: #define YYDEBUG(s,c)
                     85: #endif
                     86: 
                     87: #include "timelib_structs.h"
                     88: 
                     89: typedef struct Scanner {
                     90:        int           fd;
                     91:        uchar        *lim, *str, *ptr, *cur, *tok, *pos;
                     92:        unsigned int  line, len;
                     93:        struct timelib_error_container *errors;
                     94: 
                     95:        struct timelib_time     *begin;
                     96:        struct timelib_time     *end;
                     97:        struct timelib_rel_time *period;
                     98:        int                      recurrences;
                     99: 
                    100:        int have_period;
                    101:        int have_recurrences;
                    102:        int have_date;
                    103:        int have_begin_date;
                    104:        int have_end_date;
                    105: } Scanner;
                    106: 
                    107: #define HOUR(a) (int)(a * 60)
                    108: 
                    109: static void add_warning(Scanner *s, char *error)
                    110: {
                    111:        s->errors->warning_count++;
                    112:        s->errors->warning_messages = realloc(s->errors->warning_messages, s->errors->warning_count * sizeof(timelib_error_message));
                    113:        s->errors->warning_messages[s->errors->warning_count - 1].position = s->tok ? s->tok - s->str : 0;
                    114:        s->errors->warning_messages[s->errors->warning_count - 1].character = s->tok ? *s->tok : 0;
                    115:        s->errors->warning_messages[s->errors->warning_count - 1].message = strdup(error);
                    116: }
                    117: 
                    118: static void add_error(Scanner *s, char *error)
                    119: {
                    120:        s->errors->error_count++;
                    121:        s->errors->error_messages = realloc(s->errors->error_messages, s->errors->error_count * sizeof(timelib_error_message));
                    122:        s->errors->error_messages[s->errors->error_count - 1].position = s->tok ? s->tok - s->str : 0;
                    123:        s->errors->error_messages[s->errors->error_count - 1].character = s->tok ? *s->tok : 0;
                    124:        s->errors->error_messages[s->errors->error_count - 1].message = strdup(error);
                    125: }
                    126: 
                    127: static char *timelib_string(Scanner *s)
                    128: {
                    129:        char *tmp = calloc(1, s->cur - s->tok + 1);
                    130:        memcpy(tmp, s->tok, s->cur - s->tok);
                    131: 
                    132:        return tmp;
                    133: }
                    134: 
                    135: static timelib_sll timelib_get_nr(char **ptr, int max_length)
                    136: {
                    137:        char *begin, *end, *str;
                    138:        timelib_sll tmp_nr = TIMELIB_UNSET;
                    139:        int len = 0;
                    140: 
                    141:        while ((**ptr < '0') || (**ptr > '9')) {
                    142:                if (**ptr == '\0') {
                    143:                        return TIMELIB_UNSET;
                    144:                }
                    145:                ++*ptr;
                    146:        }
                    147:        begin = *ptr;
                    148:        while ((**ptr >= '0') && (**ptr <= '9') && len < max_length) {
                    149:                ++*ptr;
                    150:                ++len;
                    151:        }
                    152:        end = *ptr;
                    153:        str = calloc(1, end - begin + 1);
                    154:        memcpy(str, begin, end - begin);
                    155:        tmp_nr = strtoll(str, NULL, 10);
                    156:        free(str);
                    157:        return tmp_nr;
                    158: }
                    159: 
                    160: static timelib_ull timelib_get_unsigned_nr(char **ptr, int max_length)
                    161: {
                    162:        timelib_ull dir = 1;
                    163: 
                    164:        while (((**ptr < '0') || (**ptr > '9')) && (**ptr != '+') && (**ptr != '-')) {
                    165:                if (**ptr == '\0') {
                    166:                        return TIMELIB_UNSET;
                    167:                }
                    168:                ++*ptr;
                    169:        }
                    170: 
                    171:        while (**ptr == '+' || **ptr == '-')
                    172:        {
                    173:                if (**ptr == '-') {
                    174:                        dir *= -1;
                    175:                }
                    176:                ++*ptr;
                    177:        }
                    178:        return dir * timelib_get_nr(ptr, max_length);
                    179: }
                    180: 
                    181: static long timelib_parse_tz_cor(char **ptr)
                    182: {
                    183:        char *begin = *ptr, *end;
                    184:        long  tmp;
                    185: 
                    186:        while (isdigit(**ptr) || **ptr == ':') {
                    187:                ++*ptr;
                    188:        }
                    189:        end = *ptr;
                    190:        switch (end - begin) {
                    191:                case 1:
                    192:                case 2:
                    193:                        return HOUR(strtol(begin, NULL, 10));
                    194:                        break;
                    195:                case 3:
                    196:                case 4:
                    197:                        if (begin[1] == ':') {
                    198:                                tmp = HOUR(strtol(begin, NULL, 10)) + strtol(begin + 2, NULL, 10);
                    199:                                return tmp;
                    200:                        } else if (begin[2] == ':') {
                    201:                                tmp = HOUR(strtol(begin, NULL, 10)) + strtol(begin + 3, NULL, 10);
                    202:                                return tmp;
                    203:                        } else {
                    204:                                tmp = strtol(begin, NULL, 10);
                    205:                                return HOUR(tmp / 100) + tmp % 100;
                    206:                        }
                    207:                case 5:
                    208:                        tmp = HOUR(strtol(begin, NULL, 10)) + strtol(begin + 3, NULL, 10);
                    209:                        return tmp;
                    210:        }
                    211:        return 0;
                    212: }
                    213: 
                    214: static void timelib_eat_spaces(char **ptr)
                    215: {
                    216:        while (**ptr == ' ' || **ptr == '\t') {
                    217:                ++*ptr;
                    218:        }
                    219: }
                    220: 
                    221: static void timelib_eat_until_separator(char **ptr)
                    222: {
                    223:        while (strchr(" \t.,:;/-0123456789", **ptr) == NULL) {
                    224:                ++*ptr;
                    225:        }
                    226: }
                    227: 
                    228: static long timelib_get_zone(char **ptr, int *dst, timelib_time *t, int *tz_not_found, const timelib_tzdb *tzdb)
                    229: {
                    230:        long retval = 0;
                    231: 
                    232:        *tz_not_found = 0;
                    233: 
                    234:        while (**ptr == ' ' || **ptr == '\t' || **ptr == '(') {
                    235:                ++*ptr;
                    236:        }
                    237:        if ((*ptr)[0] == 'G' && (*ptr)[1] == 'M' && (*ptr)[2] == 'T' && ((*ptr)[3] == '+' || (*ptr)[3] == '-')) {
                    238:                *ptr += 3;
                    239:        }
                    240:        if (**ptr == '+') {
                    241:                ++*ptr;
                    242:                t->is_localtime = 1;
                    243:                t->zone_type = TIMELIB_ZONETYPE_OFFSET;
                    244:                *tz_not_found = 0;
                    245:                t->dst = 0;
                    246: 
                    247:                retval = -1 * timelib_parse_tz_cor(ptr);
                    248:        } else if (**ptr == '-') {
                    249:                ++*ptr;
                    250:                t->is_localtime = 1;
                    251:                t->zone_type = TIMELIB_ZONETYPE_OFFSET;
                    252:                *tz_not_found = 0;
                    253:                t->dst = 0;
                    254: 
                    255:                retval = timelib_parse_tz_cor(ptr);
                    256:        }
                    257:        while (**ptr == ')') {
                    258:                ++*ptr;
                    259:        }
                    260:        return retval;
                    261: }
                    262: 
                    263: #define timelib_split_free(arg) {       \
                    264:        int i;                         \
                    265:        for (i = 0; i < arg.c; i++) {  \
                    266:                free(arg.v[i]);            \
                    267:        }                              \
                    268:        if (arg.v) {                   \
                    269:                free(arg.v);               \
                    270:        }                              \
                    271: }
                    272: 
                    273: /* date parser's scan function too large for VC6 - VC7.x
                    274:    drop the optimization solves the problem */
                    275: #ifdef PHP_WIN32
                    276: #pragma optimize( "", off )
                    277: #endif
                    278: static int scan(Scanner *s)
                    279: {
                    280:        uchar *cursor = s->cur;
                    281:        char *str, *ptr = NULL;
                    282:                
                    283: std:
                    284:        s->tok = cursor;
                    285:        s->len = 0;
                    286: #line 311 "ext/date/lib/parse_iso_intervals.re"
                    287: 
                    288: 
                    289: 
                    290: #line 291 "ext/date/lib/parse_iso_intervals.c"
                    291: {
                    292:        YYCTYPE yych;
                    293:        unsigned int yyaccept = 0;
                    294:        static const unsigned char yybm[] = {
                    295:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    296:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    297:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    298:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    299:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    300:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    301:                128, 128, 128, 128, 128, 128, 128, 128, 
                    302:                128, 128,   0,   0,   0,   0,   0,   0, 
                    303:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    304:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    305:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    306:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    307:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    308:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    309:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    310:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    311:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    312:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    313:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    314:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    315:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    316:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    317:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    318:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    319:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    320:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    321:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    322:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    323:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    324:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    325:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    326:                  0,   0,   0,   0,   0,   0,   0,   0, 
                    327:        };
                    328: 
                    329:        YYDEBUG(0, *YYCURSOR);
                    330:        if ((YYLIMIT - YYCURSOR) < 20) YYFILL(20);
                    331:        yych = *YYCURSOR;
                    332:        if (yych <= ',') {
                    333:                if (yych <= '\n') {
                    334:                        if (yych <= 0x00) goto yy9;
                    335:                        if (yych <= 0x08) goto yy11;
                    336:                        if (yych <= '\t') goto yy7;
                    337:                        goto yy9;
                    338:                } else {
                    339:                        if (yych == ' ') goto yy7;
                    340:                        if (yych <= '+') goto yy11;
                    341:                        goto yy7;
                    342:                }
                    343:        } else {
                    344:                if (yych <= 'O') {
                    345:                        if (yych <= '-') goto yy11;
                    346:                        if (yych <= '/') goto yy7;
                    347:                        if (yych <= '9') goto yy4;
                    348:                        goto yy11;
                    349:                } else {
                    350:                        if (yych <= 'P') goto yy5;
                    351:                        if (yych != 'R') goto yy11;
                    352:                }
                    353:        }
                    354:        YYDEBUG(2, *YYCURSOR);
                    355:        ++YYCURSOR;
                    356:        if ((yych = *YYCURSOR) <= '/') goto yy3;
                    357:        if (yych <= '9') goto yy98;
                    358: yy3:
                    359:        YYDEBUG(3, *YYCURSOR);
                    360: #line 424 "ext/date/lib/parse_iso_intervals.re"
                    361:        {
                    362:                add_error(s, "Unexpected character");
                    363:                goto std;
                    364:        }
                    365: #line 366 "ext/date/lib/parse_iso_intervals.c"
                    366: yy4:
                    367:        YYDEBUG(4, *YYCURSOR);
                    368:        yyaccept = 0;
                    369:        yych = *(YYMARKER = ++YYCURSOR);
                    370:        if (yych <= '/') goto yy3;
                    371:        if (yych <= '9') goto yy59;
                    372:        goto yy3;
                    373: yy5:
                    374:        YYDEBUG(5, *YYCURSOR);
                    375:        yyaccept = 1;
                    376:        yych = *(YYMARKER = ++YYCURSOR);
                    377:        if (yych <= '/') goto yy6;
                    378:        if (yych <= '9') goto yy12;
                    379:        if (yych == 'T') goto yy14;
                    380: yy6:
                    381:        YYDEBUG(6, *YYCURSOR);
                    382: #line 351 "ext/date/lib/parse_iso_intervals.re"
                    383:        {
                    384:                timelib_sll nr;
                    385:                int         in_time = 0;
                    386:                DEBUG_OUTPUT("period");
                    387:                TIMELIB_INIT;
                    388:                ptr++;
                    389:                do {
                    390:                        if ( *ptr == 'T' ) {
                    391:                                in_time = 1;
                    392:                                ptr++;
                    393:                        }
                    394:                        if ( *ptr == '\0' ) {
                    395:                                add_error(s, "Missing expected time part");
                    396:                                break;
                    397:                        }
                    398: 
                    399:                        nr = timelib_get_unsigned_nr((char **) &ptr, 12);
                    400:                        switch (*ptr) {
                    401:                                case 'Y': s->period->y = nr; break;
                    402:                                case 'W': s->period->d = nr * 7; break;
                    403:                                case 'D': s->period->d = nr; break;
                    404:                                case 'H': s->period->h = nr; break;
                    405:                                case 'S': s->period->s = nr; break;
                    406:                                case 'M': 
                    407:                                        if (in_time) {
                    408:                                                s->period->i = nr;
                    409:                                        } else {
                    410:                                                s->period->m = nr; 
                    411:                                        }
                    412:                                        break;
                    413:                                default:
                    414:                                        add_error(s, "Undefined period specifier");
                    415:                                        break;
                    416:                        }
                    417:                        ptr++;
                    418:                } while (*ptr);
                    419:                s->have_period = 1;
                    420:                TIMELIB_DEINIT;
                    421:                return TIMELIB_PERIOD;
                    422:        }
                    423: #line 424 "ext/date/lib/parse_iso_intervals.c"
                    424: yy7:
                    425:        YYDEBUG(7, *YYCURSOR);
                    426:        ++YYCURSOR;
                    427:        YYDEBUG(8, *YYCURSOR);
                    428: #line 413 "ext/date/lib/parse_iso_intervals.re"
                    429:        {
                    430:                goto std;
                    431:        }
                    432: #line 433 "ext/date/lib/parse_iso_intervals.c"
                    433: yy9:
                    434:        YYDEBUG(9, *YYCURSOR);
                    435:        ++YYCURSOR;
                    436:        YYDEBUG(10, *YYCURSOR);
                    437: #line 418 "ext/date/lib/parse_iso_intervals.re"
                    438:        {
                    439:                s->pos = cursor; s->line++;
                    440:                goto std;
                    441:        }
                    442: #line 443 "ext/date/lib/parse_iso_intervals.c"
                    443: yy11:
                    444:        YYDEBUG(11, *YYCURSOR);
                    445:        yych = *++YYCURSOR;
                    446:        goto yy3;
                    447: yy12:
                    448:        YYDEBUG(12, *YYCURSOR);
                    449:        yych = *++YYCURSOR;
                    450:        if (yych <= 'L') {
                    451:                if (yych <= '9') {
                    452:                        if (yych >= '0') goto yy25;
                    453:                } else {
                    454:                        if (yych == 'D') goto yy24;
                    455:                }
                    456:        } else {
                    457:                if (yych <= 'W') {
                    458:                        if (yych <= 'M') goto yy27;
                    459:                        if (yych >= 'W') goto yy26;
                    460:                } else {
                    461:                        if (yych == 'Y') goto yy28;
                    462:                }
                    463:        }
                    464: yy13:
                    465:        YYDEBUG(13, *YYCURSOR);
                    466:        YYCURSOR = YYMARKER;
                    467:        if (yyaccept <= 0) {
                    468:                goto yy3;
                    469:        } else {
                    470:                goto yy6;
                    471:        }
                    472: yy14:
                    473:        YYDEBUG(14, *YYCURSOR);
                    474:        yyaccept = 1;
                    475:        yych = *(YYMARKER = ++YYCURSOR);
                    476:        if (yybm[0+yych] & 128) {
                    477:                goto yy15;
                    478:        }
                    479:        goto yy6;
                    480: yy15:
                    481:        YYDEBUG(15, *YYCURSOR);
                    482:        ++YYCURSOR;
                    483:        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
                    484:        yych = *YYCURSOR;
                    485:        YYDEBUG(16, *YYCURSOR);
                    486:        if (yybm[0+yych] & 128) {
                    487:                goto yy15;
                    488:        }
                    489:        if (yych <= 'L') {
                    490:                if (yych == 'H') goto yy19;
                    491:                goto yy13;
                    492:        } else {
                    493:                if (yych <= 'M') goto yy18;
                    494:                if (yych != 'S') goto yy13;
                    495:        }
                    496: yy17:
                    497:        YYDEBUG(17, *YYCURSOR);
                    498:        yych = *++YYCURSOR;
                    499:        goto yy6;
                    500: yy18:
                    501:        YYDEBUG(18, *YYCURSOR);
                    502:        yyaccept = 1;
                    503:        yych = *(YYMARKER = ++YYCURSOR);
                    504:        if (yych <= '/') goto yy6;
                    505:        if (yych <= '9') goto yy22;
                    506:        goto yy6;
                    507: yy19:
                    508:        YYDEBUG(19, *YYCURSOR);
                    509:        yyaccept = 1;
                    510:        yych = *(YYMARKER = ++YYCURSOR);
                    511:        if (yych <= '/') goto yy6;
                    512:        if (yych >= ':') goto yy6;
                    513: yy20:
                    514:        YYDEBUG(20, *YYCURSOR);
                    515:        ++YYCURSOR;
                    516:        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
                    517:        yych = *YYCURSOR;
                    518:        YYDEBUG(21, *YYCURSOR);
                    519:        if (yych <= 'L') {
                    520:                if (yych <= '/') goto yy13;
                    521:                if (yych <= '9') goto yy20;
                    522:                goto yy13;
                    523:        } else {
                    524:                if (yych <= 'M') goto yy18;
                    525:                if (yych == 'S') goto yy17;
                    526:                goto yy13;
                    527:        }
                    528: yy22:
                    529:        YYDEBUG(22, *YYCURSOR);
                    530:        ++YYCURSOR;
                    531:        if (YYLIMIT <= YYCURSOR) YYFILL(1);
                    532:        yych = *YYCURSOR;
                    533:        YYDEBUG(23, *YYCURSOR);
                    534:        if (yych <= '/') goto yy13;
                    535:        if (yych <= '9') goto yy22;
                    536:        if (yych == 'S') goto yy17;
                    537:        goto yy13;
                    538: yy24:
                    539:        YYDEBUG(24, *YYCURSOR);
                    540:        yych = *++YYCURSOR;
                    541:        if (yych == 'T') goto yy14;
                    542:        goto yy6;
                    543: yy25:
                    544:        YYDEBUG(25, *YYCURSOR);
                    545:        yych = *++YYCURSOR;
                    546:        if (yych <= 'L') {
                    547:                if (yych <= '9') {
                    548:                        if (yych <= '/') goto yy13;
                    549:                        goto yy35;
                    550:                } else {
                    551:                        if (yych == 'D') goto yy24;
                    552:                        goto yy13;
                    553:                }
                    554:        } else {
                    555:                if (yych <= 'W') {
                    556:                        if (yych <= 'M') goto yy27;
                    557:                        if (yych <= 'V') goto yy13;
                    558:                } else {
                    559:                        if (yych == 'Y') goto yy28;
                    560:                        goto yy13;
                    561:                }
                    562:        }
                    563: yy26:
                    564:        YYDEBUG(26, *YYCURSOR);
                    565:        yyaccept = 1;
                    566:        yych = *(YYMARKER = ++YYCURSOR);
                    567:        if (yych <= '/') goto yy6;
                    568:        if (yych <= '9') goto yy33;
                    569:        if (yych == 'T') goto yy14;
                    570:        goto yy6;
                    571: yy27:
                    572:        YYDEBUG(27, *YYCURSOR);
                    573:        yyaccept = 1;
                    574:        yych = *(YYMARKER = ++YYCURSOR);
                    575:        if (yych <= '/') goto yy6;
                    576:        if (yych <= '9') goto yy31;
                    577:        if (yych == 'T') goto yy14;
                    578:        goto yy6;
                    579: yy28:
                    580:        YYDEBUG(28, *YYCURSOR);
                    581:        yyaccept = 1;
                    582:        yych = *(YYMARKER = ++YYCURSOR);
                    583:        if (yych <= '/') goto yy6;
                    584:        if (yych <= '9') goto yy29;
                    585:        if (yych == 'T') goto yy14;
                    586:        goto yy6;
                    587: yy29:
                    588:        YYDEBUG(29, *YYCURSOR);
                    589:        ++YYCURSOR;
                    590:        if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
                    591:        yych = *YYCURSOR;
                    592:        YYDEBUG(30, *YYCURSOR);
                    593:        if (yych <= 'D') {
                    594:                if (yych <= '/') goto yy13;
                    595:                if (yych <= '9') goto yy29;
                    596:                if (yych <= 'C') goto yy13;
                    597:                goto yy24;
                    598:        } else {
                    599:                if (yych <= 'M') {
                    600:                        if (yych <= 'L') goto yy13;
                    601:                        goto yy27;
                    602:                } else {
                    603:                        if (yych == 'W') goto yy26;
                    604:                        goto yy13;
                    605:                }
                    606:        }
                    607: yy31:
                    608:        YYDEBUG(31, *YYCURSOR);
                    609:        ++YYCURSOR;
                    610:        if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
                    611:        yych = *YYCURSOR;
                    612:        YYDEBUG(32, *YYCURSOR);
                    613:        if (yych <= 'C') {
                    614:                if (yych <= '/') goto yy13;
                    615:                if (yych <= '9') goto yy31;
                    616:                goto yy13;
                    617:        } else {
                    618:                if (yych <= 'D') goto yy24;
                    619:                if (yych == 'W') goto yy26;
                    620:                goto yy13;
                    621:        }
                    622: yy33:
                    623:        YYDEBUG(33, *YYCURSOR);
                    624:        ++YYCURSOR;
                    625:        if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
                    626:        yych = *YYCURSOR;
                    627:        YYDEBUG(34, *YYCURSOR);
                    628:        if (yych <= '/') goto yy13;
                    629:        if (yych <= '9') goto yy33;
                    630:        if (yych == 'D') goto yy24;
                    631:        goto yy13;
                    632: yy35:
                    633:        YYDEBUG(35, *YYCURSOR);
                    634:        yych = *++YYCURSOR;
                    635:        if (yych <= 'L') {
                    636:                if (yych <= '9') {
                    637:                        if (yych <= '/') goto yy13;
                    638:                } else {
                    639:                        if (yych == 'D') goto yy24;
                    640:                        goto yy13;
                    641:                }
                    642:        } else {
                    643:                if (yych <= 'W') {
                    644:                        if (yych <= 'M') goto yy27;
                    645:                        if (yych <= 'V') goto yy13;
                    646:                        goto yy26;
                    647:                } else {
                    648:                        if (yych == 'Y') goto yy28;
                    649:                        goto yy13;
                    650:                }
                    651:        }
                    652:        YYDEBUG(36, *YYCURSOR);
                    653:        yych = *++YYCURSOR;
                    654:        if (yych != '-') goto yy39;
                    655:        YYDEBUG(37, *YYCURSOR);
                    656:        yych = *++YYCURSOR;
                    657:        if (yych <= '/') goto yy13;
                    658:        if (yych <= '0') goto yy40;
                    659:        if (yych <= '1') goto yy41;
                    660:        goto yy13;
                    661: yy38:
                    662:        YYDEBUG(38, *YYCURSOR);
                    663:        ++YYCURSOR;
                    664:        if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
                    665:        yych = *YYCURSOR;
                    666: yy39:
                    667:        YYDEBUG(39, *YYCURSOR);
                    668:        if (yych <= 'L') {
                    669:                if (yych <= '9') {
                    670:                        if (yych <= '/') goto yy13;
                    671:                        goto yy38;
                    672:                } else {
                    673:                        if (yych == 'D') goto yy24;
                    674:                        goto yy13;
                    675:                }
                    676:        } else {
                    677:                if (yych <= 'W') {
                    678:                        if (yych <= 'M') goto yy27;
                    679:                        if (yych <= 'V') goto yy13;
                    680:                        goto yy26;
                    681:                } else {
                    682:                        if (yych == 'Y') goto yy28;
                    683:                        goto yy13;
                    684:                }
                    685:        }
                    686: yy40:
                    687:        YYDEBUG(40, *YYCURSOR);
                    688:        yych = *++YYCURSOR;
                    689:        if (yych <= '/') goto yy13;
                    690:        if (yych <= '9') goto yy42;
                    691:        goto yy13;
                    692: yy41:
                    693:        YYDEBUG(41, *YYCURSOR);
                    694:        yych = *++YYCURSOR;
                    695:        if (yych <= '/') goto yy13;
                    696:        if (yych >= '3') goto yy13;
                    697: yy42:
                    698:        YYDEBUG(42, *YYCURSOR);
                    699:        yych = *++YYCURSOR;
                    700:        if (yych != '-') goto yy13;
                    701:        YYDEBUG(43, *YYCURSOR);
                    702:        yych = *++YYCURSOR;
                    703:        if (yych <= '/') goto yy13;
                    704:        if (yych <= '0') goto yy44;
                    705:        if (yych <= '2') goto yy45;
                    706:        if (yych <= '3') goto yy46;
                    707:        goto yy13;
                    708: yy44:
                    709:        YYDEBUG(44, *YYCURSOR);
                    710:        yych = *++YYCURSOR;
                    711:        if (yych <= '/') goto yy13;
                    712:        if (yych <= '9') goto yy47;
                    713:        goto yy13;
                    714: yy45:
                    715:        YYDEBUG(45, *YYCURSOR);
                    716:        yych = *++YYCURSOR;
                    717:        if (yych <= '/') goto yy13;
                    718:        if (yych <= '9') goto yy47;
                    719:        goto yy13;
                    720: yy46:
                    721:        YYDEBUG(46, *YYCURSOR);
                    722:        yych = *++YYCURSOR;
                    723:        if (yych <= '/') goto yy13;
                    724:        if (yych >= '2') goto yy13;
                    725: yy47:
                    726:        YYDEBUG(47, *YYCURSOR);
                    727:        yych = *++YYCURSOR;
                    728:        if (yych != 'T') goto yy13;
                    729:        YYDEBUG(48, *YYCURSOR);
                    730:        yych = *++YYCURSOR;
                    731:        if (yych <= '/') goto yy13;
                    732:        if (yych <= '1') goto yy49;
                    733:        if (yych <= '2') goto yy50;
                    734:        goto yy13;
                    735: yy49:
                    736:        YYDEBUG(49, *YYCURSOR);
                    737:        yych = *++YYCURSOR;
                    738:        if (yych <= '/') goto yy13;
                    739:        if (yych <= '9') goto yy51;
                    740:        goto yy13;
                    741: yy50:
                    742:        YYDEBUG(50, *YYCURSOR);
                    743:        yych = *++YYCURSOR;
                    744:        if (yych <= '/') goto yy13;
                    745:        if (yych >= '5') goto yy13;
                    746: yy51:
                    747:        YYDEBUG(51, *YYCURSOR);
                    748:        yych = *++YYCURSOR;
                    749:        if (yych != ':') goto yy13;
                    750:        YYDEBUG(52, *YYCURSOR);
                    751:        yych = *++YYCURSOR;
                    752:        if (yych <= '/') goto yy13;
                    753:        if (yych >= '6') goto yy13;
                    754:        YYDEBUG(53, *YYCURSOR);
                    755:        yych = *++YYCURSOR;
                    756:        if (yych <= '/') goto yy13;
                    757:        if (yych >= ':') goto yy13;
                    758:        YYDEBUG(54, *YYCURSOR);
                    759:        yych = *++YYCURSOR;
                    760:        if (yych != ':') goto yy13;
                    761:        YYDEBUG(55, *YYCURSOR);
                    762:        yych = *++YYCURSOR;
                    763:        if (yych <= '/') goto yy13;
                    764:        if (yych >= '6') goto yy13;
                    765:        YYDEBUG(56, *YYCURSOR);
                    766:        yych = *++YYCURSOR;
                    767:        if (yych <= '/') goto yy13;
                    768:        if (yych >= ':') goto yy13;
                    769:        YYDEBUG(57, *YYCURSOR);
                    770:        ++YYCURSOR;
                    771:        YYDEBUG(58, *YYCURSOR);
                    772: #line 393 "ext/date/lib/parse_iso_intervals.re"
                    773:        {
                    774:                DEBUG_OUTPUT("combinedrep");
                    775:                TIMELIB_INIT;
                    776:                s->period->y = timelib_get_unsigned_nr((char **) &ptr, 4);
                    777:                ptr++;
                    778:                s->period->m = timelib_get_unsigned_nr((char **) &ptr, 2);
                    779:                ptr++;
                    780:                s->period->d = timelib_get_unsigned_nr((char **) &ptr, 2);
                    781:                ptr++;
                    782:                s->period->h = timelib_get_unsigned_nr((char **) &ptr, 2);
                    783:                ptr++;
                    784:                s->period->i = timelib_get_unsigned_nr((char **) &ptr, 2);
                    785:                ptr++;
                    786:                s->period->s = timelib_get_unsigned_nr((char **) &ptr, 2);
                    787:                s->have_period = 1;
                    788:                TIMELIB_DEINIT;
                    789:                return TIMELIB_PERIOD;
                    790:        }
                    791: #line 792 "ext/date/lib/parse_iso_intervals.c"
                    792: yy59:
                    793:        YYDEBUG(59, *YYCURSOR);
                    794:        yych = *++YYCURSOR;
                    795:        if (yych <= '/') goto yy13;
                    796:        if (yych >= ':') goto yy13;
                    797:        YYDEBUG(60, *YYCURSOR);
                    798:        yych = *++YYCURSOR;
                    799:        if (yych <= '/') goto yy13;
                    800:        if (yych >= ':') goto yy13;
                    801:        YYDEBUG(61, *YYCURSOR);
                    802:        yych = *++YYCURSOR;
                    803:        if (yych <= '/') {
                    804:                if (yych == '-') goto yy64;
                    805:                goto yy13;
                    806:        } else {
                    807:                if (yych <= '0') goto yy62;
                    808:                if (yych <= '1') goto yy63;
                    809:                goto yy13;
                    810:        }
                    811: yy62:
                    812:        YYDEBUG(62, *YYCURSOR);
                    813:        yych = *++YYCURSOR;
                    814:        if (yych <= '0') goto yy13;
                    815:        if (yych <= '9') goto yy85;
                    816:        goto yy13;
                    817: yy63:
                    818:        YYDEBUG(63, *YYCURSOR);
                    819:        yych = *++YYCURSOR;
                    820:        if (yych <= '/') goto yy13;
                    821:        if (yych <= '2') goto yy85;
                    822:        goto yy13;
                    823: yy64:
                    824:        YYDEBUG(64, *YYCURSOR);
                    825:        yych = *++YYCURSOR;
                    826:        if (yych <= '/') goto yy13;
                    827:        if (yych <= '0') goto yy65;
                    828:        if (yych <= '1') goto yy66;
                    829:        goto yy13;
                    830: yy65:
                    831:        YYDEBUG(65, *YYCURSOR);
                    832:        yych = *++YYCURSOR;
                    833:        if (yych <= '0') goto yy13;
                    834:        if (yych <= '9') goto yy67;
                    835:        goto yy13;
                    836: yy66:
                    837:        YYDEBUG(66, *YYCURSOR);
                    838:        yych = *++YYCURSOR;
                    839:        if (yych <= '/') goto yy13;
                    840:        if (yych >= '3') goto yy13;
                    841: yy67:
                    842:        YYDEBUG(67, *YYCURSOR);
                    843:        yych = *++YYCURSOR;
                    844:        if (yych != '-') goto yy13;
                    845:        YYDEBUG(68, *YYCURSOR);
                    846:        yych = *++YYCURSOR;
                    847:        if (yych <= '/') goto yy13;
                    848:        if (yych <= '0') goto yy69;
                    849:        if (yych <= '2') goto yy70;
                    850:        if (yych <= '3') goto yy71;
                    851:        goto yy13;
                    852: yy69:
                    853:        YYDEBUG(69, *YYCURSOR);
                    854:        yych = *++YYCURSOR;
                    855:        if (yych <= '0') goto yy13;
                    856:        if (yych <= '9') goto yy72;
                    857:        goto yy13;
                    858: yy70:
                    859:        YYDEBUG(70, *YYCURSOR);
                    860:        yych = *++YYCURSOR;
                    861:        if (yych <= '/') goto yy13;
                    862:        if (yych <= '9') goto yy72;
                    863:        goto yy13;
                    864: yy71:
                    865:        YYDEBUG(71, *YYCURSOR);
                    866:        yych = *++YYCURSOR;
                    867:        if (yych <= '/') goto yy13;
                    868:        if (yych >= '2') goto yy13;
                    869: yy72:
                    870:        YYDEBUG(72, *YYCURSOR);
                    871:        yych = *++YYCURSOR;
                    872:        if (yych != 'T') goto yy13;
                    873:        YYDEBUG(73, *YYCURSOR);
                    874:        yych = *++YYCURSOR;
                    875:        if (yych <= '/') goto yy13;
                    876:        if (yych <= '1') goto yy74;
                    877:        if (yych <= '2') goto yy75;
                    878:        goto yy13;
                    879: yy74:
                    880:        YYDEBUG(74, *YYCURSOR);
                    881:        yych = *++YYCURSOR;
                    882:        if (yych <= '/') goto yy13;
                    883:        if (yych <= '9') goto yy76;
                    884:        goto yy13;
                    885: yy75:
                    886:        YYDEBUG(75, *YYCURSOR);
                    887:        yych = *++YYCURSOR;
                    888:        if (yych <= '/') goto yy13;
                    889:        if (yych >= '5') goto yy13;
                    890: yy76:
                    891:        YYDEBUG(76, *YYCURSOR);
                    892:        yych = *++YYCURSOR;
                    893:        if (yych != ':') goto yy13;
                    894:        YYDEBUG(77, *YYCURSOR);
                    895:        yych = *++YYCURSOR;
                    896:        if (yych <= '/') goto yy13;
                    897:        if (yych >= '6') goto yy13;
                    898:        YYDEBUG(78, *YYCURSOR);
                    899:        yych = *++YYCURSOR;
                    900:        if (yych <= '/') goto yy13;
                    901:        if (yych >= ':') goto yy13;
                    902:        YYDEBUG(79, *YYCURSOR);
                    903:        yych = *++YYCURSOR;
                    904:        if (yych != ':') goto yy13;
                    905:        YYDEBUG(80, *YYCURSOR);
                    906:        yych = *++YYCURSOR;
                    907:        if (yych <= '/') goto yy13;
                    908:        if (yych >= '6') goto yy13;
                    909:        YYDEBUG(81, *YYCURSOR);
                    910:        yych = *++YYCURSOR;
                    911:        if (yych <= '/') goto yy13;
                    912:        if (yych >= ':') goto yy13;
                    913:        YYDEBUG(82, *YYCURSOR);
                    914:        yych = *++YYCURSOR;
                    915:        if (yych != 'Z') goto yy13;
                    916: yy83:
                    917:        YYDEBUG(83, *YYCURSOR);
                    918:        ++YYCURSOR;
                    919:        YYDEBUG(84, *YYCURSOR);
                    920: #line 327 "ext/date/lib/parse_iso_intervals.re"
                    921:        {
                    922:                timelib_time *current;
                    923: 
                    924:                if (s->have_date || s->have_period) {
                    925:                        current = s->end;
                    926:                        s->have_end_date = 1;
                    927:                } else {
                    928:                        current = s->begin;
                    929:                        s->have_begin_date = 1;
                    930:                }
                    931:                DEBUG_OUTPUT("datetimebasic | datetimeextended");
                    932:                TIMELIB_INIT;
                    933:                current->y = timelib_get_nr((char **) &ptr, 4);
                    934:                current->m = timelib_get_nr((char **) &ptr, 2);
                    935:                current->d = timelib_get_nr((char **) &ptr, 2);
                    936:                current->h = timelib_get_nr((char **) &ptr, 2);
                    937:                current->i = timelib_get_nr((char **) &ptr, 2);
                    938:                current->s = timelib_get_nr((char **) &ptr, 2);
                    939:                s->have_date = 1;
                    940:                TIMELIB_DEINIT;
                    941:                return TIMELIB_ISO_DATE;
                    942:        }
                    943: #line 944 "ext/date/lib/parse_iso_intervals.c"
                    944: yy85:
                    945:        YYDEBUG(85, *YYCURSOR);
                    946:        yych = *++YYCURSOR;
                    947:        if (yych <= '/') goto yy13;
                    948:        if (yych <= '0') goto yy86;
                    949:        if (yych <= '2') goto yy87;
                    950:        if (yych <= '3') goto yy88;
                    951:        goto yy13;
                    952: yy86:
                    953:        YYDEBUG(86, *YYCURSOR);
                    954:        yych = *++YYCURSOR;
                    955:        if (yych <= '0') goto yy13;
                    956:        if (yych <= '9') goto yy89;
                    957:        goto yy13;
                    958: yy87:
                    959:        YYDEBUG(87, *YYCURSOR);
                    960:        yych = *++YYCURSOR;
                    961:        if (yych <= '/') goto yy13;
                    962:        if (yych <= '9') goto yy89;
                    963:        goto yy13;
                    964: yy88:
                    965:        YYDEBUG(88, *YYCURSOR);
                    966:        yych = *++YYCURSOR;
                    967:        if (yych <= '/') goto yy13;
                    968:        if (yych >= '2') goto yy13;
                    969: yy89:
                    970:        YYDEBUG(89, *YYCURSOR);
                    971:        yych = *++YYCURSOR;
                    972:        if (yych != 'T') goto yy13;
                    973:        YYDEBUG(90, *YYCURSOR);
                    974:        yych = *++YYCURSOR;
                    975:        if (yych <= '/') goto yy13;
                    976:        if (yych <= '1') goto yy91;
                    977:        if (yych <= '2') goto yy92;
                    978:        goto yy13;
                    979: yy91:
                    980:        YYDEBUG(91, *YYCURSOR);
                    981:        yych = *++YYCURSOR;
                    982:        if (yych <= '/') goto yy13;
                    983:        if (yych <= '9') goto yy93;
                    984:        goto yy13;
                    985: yy92:
                    986:        YYDEBUG(92, *YYCURSOR);
                    987:        yych = *++YYCURSOR;
                    988:        if (yych <= '/') goto yy13;
                    989:        if (yych >= '5') goto yy13;
                    990: yy93:
                    991:        YYDEBUG(93, *YYCURSOR);
                    992:        yych = *++YYCURSOR;
                    993:        if (yych <= '/') goto yy13;
                    994:        if (yych >= '6') goto yy13;
                    995:        YYDEBUG(94, *YYCURSOR);
                    996:        yych = *++YYCURSOR;
                    997:        if (yych <= '/') goto yy13;
                    998:        if (yych >= ':') goto yy13;
                    999:        YYDEBUG(95, *YYCURSOR);
                   1000:        yych = *++YYCURSOR;
                   1001:        if (yych <= '/') goto yy13;
                   1002:        if (yych >= '6') goto yy13;
                   1003:        YYDEBUG(96, *YYCURSOR);
                   1004:        yych = *++YYCURSOR;
                   1005:        if (yych <= '/') goto yy13;
                   1006:        if (yych >= ':') goto yy13;
                   1007:        YYDEBUG(97, *YYCURSOR);
                   1008:        yych = *++YYCURSOR;
                   1009:        if (yych == 'Z') goto yy83;
                   1010:        goto yy13;
                   1011: yy98:
                   1012:        YYDEBUG(98, *YYCURSOR);
                   1013:        ++YYCURSOR;
                   1014:        if (YYLIMIT <= YYCURSOR) YYFILL(1);
                   1015:        yych = *YYCURSOR;
                   1016:        YYDEBUG(99, *YYCURSOR);
                   1017:        if (yych <= '/') goto yy100;
                   1018:        if (yych <= '9') goto yy98;
                   1019: yy100:
                   1020:        YYDEBUG(100, *YYCURSOR);
                   1021: #line 316 "ext/date/lib/parse_iso_intervals.re"
                   1022:        {
                   1023:                DEBUG_OUTPUT("recurrences");
                   1024:                TIMELIB_INIT;
                   1025:                ptr++;
                   1026:                s->recurrences = timelib_get_unsigned_nr((char **) &ptr, 9);
                   1027:                TIMELIB_DEINIT;
                   1028:                s->have_recurrences = 1;
                   1029:                return TIMELIB_PERIOD;
                   1030:        }
                   1031: #line 1032 "ext/date/lib/parse_iso_intervals.c"
                   1032: }
                   1033: #line 428 "ext/date/lib/parse_iso_intervals.re"
                   1034: 
                   1035: }
                   1036: #ifdef PHP_WIN32
                   1037: #pragma optimize( "", on )
                   1038: #endif
                   1039: 
                   1040: #define YYMAXFILL 20
                   1041: 
                   1042: void timelib_strtointerval(char *s, int len, 
                   1043:                            timelib_time **begin, timelib_time **end, 
                   1044:                                                   timelib_rel_time **period, int *recurrences, 
                   1045:                                                   struct timelib_error_container **errors)
                   1046: {
                   1047:        Scanner in;
                   1048:        int t;
                   1049:        char *e = s + len - 1;
                   1050: 
                   1051:        memset(&in, 0, sizeof(in));
                   1052:        in.errors = malloc(sizeof(struct timelib_error_container));
                   1053:        in.errors->warning_count = 0;
                   1054:        in.errors->warning_messages = NULL;
                   1055:        in.errors->error_count = 0;
                   1056:        in.errors->error_messages = NULL;
                   1057: 
                   1058:        if (len > 0) {
                   1059:                while (isspace(*s) && s < e) {
                   1060:                        s++;
                   1061:                }
                   1062:                while (isspace(*e) && e > s) {
                   1063:                        e--;
                   1064:                }
                   1065:        }
                   1066:        if (e - s < 0) {
                   1067:                add_error(&in, "Empty string");
                   1068:                if (errors) {
                   1069:                        *errors = in.errors;
                   1070:                } else {
                   1071:                        timelib_error_container_dtor(in.errors);
                   1072:                }
                   1073:                return;
                   1074:        }
                   1075:        e++;
                   1076: 
                   1077:        /* init cursor */
                   1078:        in.str = malloc((e - s) + YYMAXFILL);
                   1079:        memset(in.str, 0, (e - s) + YYMAXFILL);
                   1080:        memcpy(in.str, s, (e - s));
                   1081:        in.lim = in.str + (e - s) + YYMAXFILL;
                   1082:        in.cur = in.str;
                   1083: 
                   1084:        /* init value containers */
                   1085:        in.begin = timelib_time_ctor();
                   1086:        in.begin->y = TIMELIB_UNSET;
                   1087:        in.begin->d = TIMELIB_UNSET;
                   1088:        in.begin->m = TIMELIB_UNSET;
                   1089:        in.begin->h = TIMELIB_UNSET;
                   1090:        in.begin->i = TIMELIB_UNSET;
                   1091:        in.begin->s = TIMELIB_UNSET;
                   1092:        in.begin->f = 0;
                   1093:        in.begin->z = 0;
                   1094:        in.begin->dst = 0;
                   1095:        in.begin->is_localtime = 0;
                   1096:        in.begin->zone_type = TIMELIB_ZONETYPE_OFFSET;
                   1097: 
                   1098:        in.end = timelib_time_ctor();
                   1099:        in.end->y = TIMELIB_UNSET;
                   1100:        in.end->d = TIMELIB_UNSET;
                   1101:        in.end->m = TIMELIB_UNSET;
                   1102:        in.end->h = TIMELIB_UNSET;
                   1103:        in.end->i = TIMELIB_UNSET;
                   1104:        in.end->s = TIMELIB_UNSET;
                   1105:        in.end->f = 0;
                   1106:        in.end->z = 0;
                   1107:        in.end->dst = 0;
                   1108:        in.end->is_localtime = 0;
                   1109:        in.end->zone_type = TIMELIB_ZONETYPE_OFFSET;
                   1110: 
                   1111:        in.period = timelib_rel_time_ctor();
                   1112:        in.period->y = 0;
                   1113:        in.period->d = 0;
                   1114:        in.period->m = 0;
                   1115:        in.period->h = 0;
                   1116:        in.period->i = 0;
                   1117:        in.period->s = 0;
                   1118:        in.period->weekday = 0;
                   1119:        in.period->weekday_behavior = 0;
                   1120:        in.period->first_last_day_of = 0;
                   1121:        in.period->days = TIMELIB_UNSET;
                   1122: 
                   1123:        in.recurrences = 1;
                   1124: 
                   1125:        do {
                   1126:                t = scan(&in);
                   1127: #ifdef DEBUG_PARSER
                   1128:                printf("%d\n", t);
                   1129: #endif
                   1130:        } while(t != EOI);
                   1131: 
                   1132:        free(in.str);
                   1133:        if (errors) {
                   1134:                *errors = in.errors;
                   1135:        } else {
                   1136:                timelib_error_container_dtor(in.errors);
                   1137:        }
                   1138:        if (in.have_begin_date) {
                   1139:                *begin = in.begin;
                   1140:        } else {
                   1141:                timelib_time_dtor(in.begin);
                   1142:        }
                   1143:        if (in.have_end_date) {
                   1144:                *end   = in.end;
                   1145:        } else {
                   1146:                timelib_time_dtor(in.end);
                   1147:        }
                   1148:        if (in.have_period) {
                   1149:                *period = in.period;
                   1150:        } else {
                   1151:                timelib_rel_time_dtor(in.period);
                   1152:        }
                   1153:        if (in.have_recurrences) {
                   1154:                *recurrences = in.recurrences;
                   1155:        }
                   1156: }
                   1157: 
                   1158: 
                   1159: /*
                   1160:  * vim: syntax=c
                   1161:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>