Annotation of embedaddon/php/ext/date/lib/parse_iso_intervals.c, revision 1.1
1.1 ! misho 1: /* Generated by re2c 0.13.5 on Mon Dec 5 22:02:31 2011 */
! 2: #line 1 "ext/date/lib/parse_iso_intervals.re"
! 3: /*
! 4: +----------------------------------------------------------------------+
! 5: | PHP Version 5 |
! 6: +----------------------------------------------------------------------+
! 7: | Copyright (c) 1997-2010 The PHP Group |
! 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:
! 21: /* $Id: parse_iso_intervals.c 320478 2011-12-06 06:04:24Z derick $ */
! 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>