PHP  
 PHP: Test and Code Coverage Analysis
downloads | QA | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
 

LCOV - code coverage report
Current view: top level - lcov_data/ext/date/lib - parse_iso_intervals.c (source / functions) Hit Total Coverage
Test: PHP Code Coverage Lines: 188 382 49.2 %
Date: 2014-07-29 Functions: 0 0 -
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* Generated by re2c 0.13.5 on Wed Nov 27 11:10:58 2013 */
       2             : #line 1 "ext/date/lib/parse_iso_intervals.re"
       3             : /*
       4             :    +----------------------------------------------------------------------+
       5             :    | PHP Version 5                                                        |
       6             :    +----------------------------------------------------------------------+
       7             :    | Copyright (c) 1997-2014 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$ */
      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      526817 :         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      526817 :         if ((YYLIMIT - YYCURSOR) < 20) YYFILL(20);
     331      351218 :         yych = *YYCURSOR;
     332      351218 :         if (yych <= ',') {
     333      175600 :                 if (yych <= '\n') {
     334      175599 :                         if (yych <= 0x00) goto yy9;
     335           0 :                         if (yych <= 0x08) goto yy11;
     336           0 :                         if (yych <= '\t') goto yy7;
     337           0 :                         goto yy9;
     338             :                 } else {
     339           1 :                         if (yych == ' ') goto yy7;
     340           0 :                         if (yych <= '+') goto yy11;
     341           0 :                         goto yy7;
     342             :                 }
     343             :         } else {
     344      175618 :                 if (yych <= 'O') {
     345          21 :                         if (yych <= '-') goto yy11;
     346          21 :                         if (yych <= '/') goto yy7;
     347          15 :                         if (yych <= '9') goto yy4;
     348           2 :                         goto yy11;
     349             :                 } else {
     350      175597 :                         if (yych <= 'P') goto yy5;
     351           6 :                         if (yych != 'R') goto yy11;
     352             :                 }
     353             :         }
     354             :         YYDEBUG(2, *YYCURSOR);
     355           1 :         ++YYCURSOR;
     356           1 :         if ((yych = *YYCURSOR) <= '/') goto yy3;
     357           1 :         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          13 :         yyaccept = 0;
     369          13 :         yych = *(YYMARKER = ++YYCURSOR);
     370          13 :         if (yych <= '/') goto yy3;
     371          13 :         if (yych <= '9') goto yy59;
     372           2 :         goto yy3;
     373             : yy5:
     374             :         YYDEBUG(5, *YYCURSOR);
     375      175591 :         yyaccept = 1;
     376      175591 :         yych = *(YYMARKER = ++YYCURSOR);
     377      175591 :         if (yych <= '/') goto yy6;
     378      175591 :         if (yych <= '9') goto yy12;
     379          53 :         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 (!s->errors->error_count && *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           7 :         ++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      175599 :         ++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           7 :         yych = *++YYCURSOR;
     446           7 :         goto yy3;
     447             : yy12:
     448             :         YYDEBUG(12, *YYCURSOR);
     449      175538 :         yych = *++YYCURSOR;
     450      175538 :         if (yych <= 'L') {
     451        1510 :                 if (yych <= '9') {
     452        1439 :                         if (yych >= '0') goto yy25;
     453             :                 } else {
     454          71 :                         if (yych == 'D') goto yy24;
     455             :                 }
     456             :         } else {
     457      174028 :                 if (yych <= 'W') {
     458           0 :                         if (yych <= 'M') goto yy27;
     459           0 :                         if (yych >= 'W') goto yy26;
     460             :                 } else {
     461      174028 :                         if (yych == 'Y') goto yy28;
     462             :                 }
     463             :         }
     464             : yy13:
     465             :         YYDEBUG(13, *YYCURSOR);
     466           1 :         YYCURSOR = YYMARKER;
     467           1 :         if (yyaccept <= 0) {
     468           1 :                 goto yy3;
     469             :         } else {
     470           0 :                 goto yy6;
     471             :         }
     472             : yy14:
     473             :         YYDEBUG(14, *YYCURSOR);
     474        1297 :         yyaccept = 1;
     475        1297 :         yych = *(YYMARKER = ++YYCURSOR);
     476        1297 :         if (yybm[0+yych] & 128) {
     477        1297 :                 goto yy15;
     478             :         }
     479           0 :         goto yy6;
     480             : yy15:
     481             :         YYDEBUG(15, *YYCURSOR);
     482        1576 :         ++YYCURSOR;
     483        1576 :         if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
     484        1576 :         yych = *YYCURSOR;
     485             :         YYDEBUG(16, *YYCURSOR);
     486        1576 :         if (yybm[0+yych] & 128) {
     487         279 :                 goto yy15;
     488             :         }
     489        1297 :         if (yych <= 'L') {
     490        1282 :                 if (yych == 'H') goto yy19;
     491           0 :                 goto yy13;
     492             :         } else {
     493          15 :                 if (yych <= 'M') goto yy18;
     494          13 :                 if (yych != 'S') goto yy13;
     495             :         }
     496             : yy17:
     497             :         YYDEBUG(17, *YYCURSOR);
     498        1246 :         yych = *++YYCURSOR;
     499        1246 :         goto yy6;
     500             : yy18:
     501             :         YYDEBUG(18, *YYCURSOR);
     502        1239 :         yyaccept = 1;
     503        1239 :         yych = *(YYMARKER = ++YYCURSOR);
     504        1239 :         if (yych <= '/') goto yy6;
     505        1233 :         if (yych <= '9') goto yy22;
     506           0 :         goto yy6;
     507             : yy19:
     508             :         YYDEBUG(19, *YYCURSOR);
     509        1282 :         yyaccept = 1;
     510        1282 :         yych = *(YYMARKER = ++YYCURSOR);
     511        1282 :         if (yych <= '/') goto yy6;
     512        1237 :         if (yych >= ':') goto yy6;
     513             : yy20:
     514             :         YYDEBUG(20, *YYCURSOR);
     515        1723 :         ++YYCURSOR;
     516        1723 :         if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
     517        1723 :         yych = *YYCURSOR;
     518             :         YYDEBUG(21, *YYCURSOR);
     519        1723 :         if (yych <= 'L') {
     520         486 :                 if (yych <= '/') goto yy13;
     521         486 :                 if (yych <= '9') goto yy20;
     522           0 :                 goto yy13;
     523             :         } else {
     524        1237 :                 if (yych <= 'M') goto yy18;
     525           0 :                 if (yych == 'S') goto yy17;
     526           0 :                 goto yy13;
     527             :         }
     528             : yy22:
     529             :         YYDEBUG(22, *YYCURSOR);
     530        1893 :         ++YYCURSOR;
     531        1893 :         if (YYLIMIT <= YYCURSOR) YYFILL(1);
     532        1893 :         yych = *YYCURSOR;
     533             :         YYDEBUG(23, *YYCURSOR);
     534        1893 :         if (yych <= '/') goto yy13;
     535        1893 :         if (yych <= '9') goto yy22;
     536        1233 :         if (yych == 'S') goto yy17;
     537           0 :         goto yy13;
     538             : yy24:
     539             :         YYDEBUG(24, *YYCURSOR);
     540      175536 :         yych = *++YYCURSOR;
     541      175536 :         if (yych == 'T') goto yy14;
     542      174294 :         goto yy6;
     543             : yy25:
     544             :         YYDEBUG(25, *YYCURSOR);
     545        1439 :         yych = *++YYCURSOR;
     546        1439 :         if (yych <= 'L') {
     547        1439 :                 if (yych <= '9') {
     548        1348 :                         if (yych <= '/') goto yy13;
     549        1348 :                         goto yy35;
     550             :                 } else {
     551          91 :                         if (yych == 'D') goto yy24;
     552           0 :                         goto yy13;
     553             :                 }
     554             :         } else {
     555           0 :                 if (yych <= 'W') {
     556           0 :                         if (yych <= 'M') goto yy27;
     557           0 :                         if (yych <= 'V') goto yy13;
     558             :                 } else {
     559           0 :                         if (yych == 'Y') goto yy28;
     560           0 :                         goto yy13;
     561             :                 }
     562             :         }
     563             : yy26:
     564             :         YYDEBUG(26, *YYCURSOR);
     565           0 :         yyaccept = 1;
     566           0 :         yych = *(YYMARKER = ++YYCURSOR);
     567           0 :         if (yych <= '/') goto yy6;
     568           0 :         if (yych <= '9') goto yy33;
     569           0 :         if (yych == 'T') goto yy14;
     570           0 :         goto yy6;
     571             : yy27:
     572             :         YYDEBUG(27, *YYCURSOR);
     573      174034 :         yyaccept = 1;
     574      174034 :         yych = *(YYMARKER = ++YYCURSOR);
     575      174034 :         if (yych <= '/') goto yy6;
     576      174034 :         if (yych <= '9') goto yy31;
     577           2 :         if (yych == 'T') goto yy14;
     578           0 :         goto yy6;
     579             : yy28:
     580             :         YYDEBUG(28, *YYCURSOR);
     581      174036 :         yyaccept = 1;
     582      174036 :         yych = *(YYMARKER = ++YYCURSOR);
     583      174036 :         if (yych <= '/') goto yy6;
     584      174036 :         if (yych <= '9') goto yy29;
     585           0 :         if (yych == 'T') goto yy14;
     586           0 :         goto yy6;
     587             : yy29:
     588             :         YYDEBUG(29, *YYCURSOR);
     589      196829 :         ++YYCURSOR;
     590      196829 :         if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
     591      196829 :         yych = *YYCURSOR;
     592             :         YYDEBUG(30, *YYCURSOR);
     593      196829 :         if (yych <= 'D') {
     594       22795 :                 if (yych <= '/') goto yy13;
     595       22795 :                 if (yych <= '9') goto yy29;
     596           2 :                 if (yych <= 'C') goto yy13;
     597           2 :                 goto yy24;
     598             :         } else {
     599      174034 :                 if (yych <= 'M') {
     600      174034 :                         if (yych <= 'L') goto yy13;
     601      174034 :                         goto yy27;
     602             :                 } else {
     603           0 :                         if (yych == 'W') goto yy26;
     604           0 :                         goto yy13;
     605             :                 }
     606             :         }
     607             : yy31:
     608             :         YYDEBUG(31, *YYCURSOR);
     609      289456 :         ++YYCURSOR;
     610      289456 :         if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
     611      289456 :         yych = *YYCURSOR;
     612             :         YYDEBUG(32, *YYCURSOR);
     613      289456 :         if (yych <= 'C') {
     614      115424 :                 if (yych <= '/') goto yy13;
     615      115424 :                 if (yych <= '9') goto yy31;
     616           0 :                 goto yy13;
     617             :         } else {
     618      174032 :                 if (yych <= 'D') goto yy24;
     619           0 :                 if (yych == 'W') goto yy26;
     620           0 :                 goto yy13;
     621             :         }
     622             : yy33:
     623             :         YYDEBUG(33, *YYCURSOR);
     624           0 :         ++YYCURSOR;
     625           0 :         if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
     626           0 :         yych = *YYCURSOR;
     627             :         YYDEBUG(34, *YYCURSOR);
     628           0 :         if (yych <= '/') goto yy13;
     629           0 :         if (yych <= '9') goto yy33;
     630           0 :         if (yych == 'D') goto yy24;
     631           0 :         goto yy13;
     632             : yy35:
     633             :         YYDEBUG(35, *YYCURSOR);
     634        1348 :         yych = *++YYCURSOR;
     635        1348 :         if (yych <= 'L') {
     636        1348 :                 if (yych <= '9') {
     637         448 :                         if (yych <= '/') goto yy13;
     638             :                 } else {
     639         900 :                         if (yych == 'D') goto yy24;
     640           0 :                         goto yy13;
     641             :                 }
     642             :         } else {
     643           0 :                 if (yych <= 'W') {
     644           0 :                         if (yych <= 'M') goto yy27;
     645           0 :                         if (yych <= 'V') goto yy13;
     646           0 :                         goto yy26;
     647             :                 } else {
     648           0 :                         if (yych == 'Y') goto yy28;
     649           0 :                         goto yy13;
     650             :                 }
     651             :         }
     652             :         YYDEBUG(36, *YYCURSOR);
     653         448 :         yych = *++YYCURSOR;
     654         448 :         if (yych != '-') goto yy39;
     655             :         YYDEBUG(37, *YYCURSOR);
     656           0 :         yych = *++YYCURSOR;
     657           0 :         if (yych <= '/') goto yy13;
     658           0 :         if (yych <= '0') goto yy40;
     659           0 :         if (yych <= '1') goto yy41;
     660           0 :         goto yy13;
     661             : yy38:
     662             :         YYDEBUG(38, *YYCURSOR);
     663          16 :         ++YYCURSOR;
     664          16 :         if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
     665          16 :         yych = *YYCURSOR;
     666             : yy39:
     667             :         YYDEBUG(39, *YYCURSOR);
     668         464 :         if (yych <= 'L') {
     669         456 :                 if (yych <= '9') {
     670          16 :                         if (yych <= '/') goto yy13;
     671          16 :                         goto yy38;
     672             :                 } else {
     673         440 :                         if (yych == 'D') goto yy24;
     674           0 :                         goto yy13;
     675             :                 }
     676             :         } else {
     677           8 :                 if (yych <= 'W') {
     678           0 :                         if (yych <= 'M') goto yy27;
     679           0 :                         if (yych <= 'V') goto yy13;
     680           0 :                         goto yy26;
     681             :                 } else {
     682           8 :                         if (yych == 'Y') goto yy28;
     683           0 :                         goto yy13;
     684             :                 }
     685             :         }
     686             : yy40:
     687             :         YYDEBUG(40, *YYCURSOR);
     688           0 :         yych = *++YYCURSOR;
     689           0 :         if (yych <= '/') goto yy13;
     690           0 :         if (yych <= '9') goto yy42;
     691           0 :         goto yy13;
     692             : yy41:
     693             :         YYDEBUG(41, *YYCURSOR);
     694           0 :         yych = *++YYCURSOR;
     695           0 :         if (yych <= '/') goto yy13;
     696           0 :         if (yych >= '3') goto yy13;
     697             : yy42:
     698             :         YYDEBUG(42, *YYCURSOR);
     699           0 :         yych = *++YYCURSOR;
     700           0 :         if (yych != '-') goto yy13;
     701             :         YYDEBUG(43, *YYCURSOR);
     702           0 :         yych = *++YYCURSOR;
     703           0 :         if (yych <= '/') goto yy13;
     704           0 :         if (yych <= '0') goto yy44;
     705           0 :         if (yych <= '2') goto yy45;
     706           0 :         if (yych <= '3') goto yy46;
     707           0 :         goto yy13;
     708             : yy44:
     709             :         YYDEBUG(44, *YYCURSOR);
     710           0 :         yych = *++YYCURSOR;
     711           0 :         if (yych <= '/') goto yy13;
     712           0 :         if (yych <= '9') goto yy47;
     713           0 :         goto yy13;
     714             : yy45:
     715             :         YYDEBUG(45, *YYCURSOR);
     716           0 :         yych = *++YYCURSOR;
     717           0 :         if (yych <= '/') goto yy13;
     718           0 :         if (yych <= '9') goto yy47;
     719           0 :         goto yy13;
     720             : yy46:
     721             :         YYDEBUG(46, *YYCURSOR);
     722           0 :         yych = *++YYCURSOR;
     723           0 :         if (yych <= '/') goto yy13;
     724           0 :         if (yych >= '2') goto yy13;
     725             : yy47:
     726             :         YYDEBUG(47, *YYCURSOR);
     727           0 :         yych = *++YYCURSOR;
     728           0 :         if (yych != 'T') goto yy13;
     729             :         YYDEBUG(48, *YYCURSOR);
     730           0 :         yych = *++YYCURSOR;
     731           0 :         if (yych <= '/') goto yy13;
     732           0 :         if (yych <= '1') goto yy49;
     733           0 :         if (yych <= '2') goto yy50;
     734           0 :         goto yy13;
     735             : yy49:
     736             :         YYDEBUG(49, *YYCURSOR);
     737           0 :         yych = *++YYCURSOR;
     738           0 :         if (yych <= '/') goto yy13;
     739           0 :         if (yych <= '9') goto yy51;
     740           0 :         goto yy13;
     741             : yy50:
     742             :         YYDEBUG(50, *YYCURSOR);
     743           0 :         yych = *++YYCURSOR;
     744           0 :         if (yych <= '/') goto yy13;
     745           0 :         if (yych >= '5') goto yy13;
     746             : yy51:
     747             :         YYDEBUG(51, *YYCURSOR);
     748           0 :         yych = *++YYCURSOR;
     749           0 :         if (yych != ':') goto yy13;
     750             :         YYDEBUG(52, *YYCURSOR);
     751           0 :         yych = *++YYCURSOR;
     752           0 :         if (yych <= '/') goto yy13;
     753           0 :         if (yych >= '6') goto yy13;
     754             :         YYDEBUG(53, *YYCURSOR);
     755           0 :         yych = *++YYCURSOR;
     756           0 :         if (yych <= '/') goto yy13;
     757           0 :         if (yych >= ':') goto yy13;
     758             :         YYDEBUG(54, *YYCURSOR);
     759           0 :         yych = *++YYCURSOR;
     760           0 :         if (yych != ':') goto yy13;
     761             :         YYDEBUG(55, *YYCURSOR);
     762           0 :         yych = *++YYCURSOR;
     763           0 :         if (yych <= '/') goto yy13;
     764           0 :         if (yych >= '6') goto yy13;
     765             :         YYDEBUG(56, *YYCURSOR);
     766           0 :         yych = *++YYCURSOR;
     767           0 :         if (yych <= '/') goto yy13;
     768           0 :         if (yych >= ':') goto yy13;
     769             :         YYDEBUG(57, *YYCURSOR);
     770           0 :         ++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          11 :         yych = *++YYCURSOR;
     795          11 :         if (yych <= '/') goto yy13;
     796          11 :         if (yych >= ':') goto yy13;
     797             :         YYDEBUG(60, *YYCURSOR);
     798          10 :         yych = *++YYCURSOR;
     799          10 :         if (yych <= '/') goto yy13;
     800          10 :         if (yych >= ':') goto yy13;
     801             :         YYDEBUG(61, *YYCURSOR);
     802          10 :         yych = *++YYCURSOR;
     803          10 :         if (yych <= '/') {
     804          10 :                 if (yych == '-') goto yy64;
     805           0 :                 goto yy13;
     806             :         } else {
     807           0 :                 if (yych <= '0') goto yy62;
     808           0 :                 if (yych <= '1') goto yy63;
     809           0 :                 goto yy13;
     810             :         }
     811             : yy62:
     812             :         YYDEBUG(62, *YYCURSOR);
     813           0 :         yych = *++YYCURSOR;
     814           0 :         if (yych <= '0') goto yy13;
     815           0 :         if (yych <= '9') goto yy85;
     816           0 :         goto yy13;
     817             : yy63:
     818             :         YYDEBUG(63, *YYCURSOR);
     819           0 :         yych = *++YYCURSOR;
     820           0 :         if (yych <= '/') goto yy13;
     821           0 :         if (yych <= '2') goto yy85;
     822           0 :         goto yy13;
     823             : yy64:
     824             :         YYDEBUG(64, *YYCURSOR);
     825          10 :         yych = *++YYCURSOR;
     826          10 :         if (yych <= '/') goto yy13;
     827          10 :         if (yych <= '0') goto yy65;
     828           0 :         if (yych <= '1') goto yy66;
     829           0 :         goto yy13;
     830             : yy65:
     831             :         YYDEBUG(65, *YYCURSOR);
     832          10 :         yych = *++YYCURSOR;
     833          10 :         if (yych <= '0') goto yy13;
     834          10 :         if (yych <= '9') goto yy67;
     835           0 :         goto yy13;
     836             : yy66:
     837             :         YYDEBUG(66, *YYCURSOR);
     838           0 :         yych = *++YYCURSOR;
     839           0 :         if (yych <= '/') goto yy13;
     840           0 :         if (yych >= '3') goto yy13;
     841             : yy67:
     842             :         YYDEBUG(67, *YYCURSOR);
     843          10 :         yych = *++YYCURSOR;
     844          10 :         if (yych != '-') goto yy13;
     845             :         YYDEBUG(68, *YYCURSOR);
     846          10 :         yych = *++YYCURSOR;
     847          10 :         if (yych <= '/') goto yy13;
     848          10 :         if (yych <= '0') goto yy69;
     849           6 :         if (yych <= '2') goto yy70;
     850           0 :         if (yych <= '3') goto yy71;
     851           0 :         goto yy13;
     852             : yy69:
     853             :         YYDEBUG(69, *YYCURSOR);
     854           4 :         yych = *++YYCURSOR;
     855           4 :         if (yych <= '0') goto yy13;
     856           4 :         if (yych <= '9') goto yy72;
     857           0 :         goto yy13;
     858             : yy70:
     859             :         YYDEBUG(70, *YYCURSOR);
     860           6 :         yych = *++YYCURSOR;
     861           6 :         if (yych <= '/') goto yy13;
     862           6 :         if (yych <= '9') goto yy72;
     863           0 :         goto yy13;
     864             : yy71:
     865             :         YYDEBUG(71, *YYCURSOR);
     866           0 :         yych = *++YYCURSOR;
     867           0 :         if (yych <= '/') goto yy13;
     868           0 :         if (yych >= '2') goto yy13;
     869             : yy72:
     870             :         YYDEBUG(72, *YYCURSOR);
     871          10 :         yych = *++YYCURSOR;
     872          10 :         if (yych != 'T') goto yy13;
     873             :         YYDEBUG(73, *YYCURSOR);
     874          10 :         yych = *++YYCURSOR;
     875          10 :         if (yych <= '/') goto yy13;
     876          10 :         if (yych <= '1') goto yy74;
     877           0 :         if (yych <= '2') goto yy75;
     878           0 :         goto yy13;
     879             : yy74:
     880             :         YYDEBUG(74, *YYCURSOR);
     881          10 :         yych = *++YYCURSOR;
     882          10 :         if (yych <= '/') goto yy13;
     883          10 :         if (yych <= '9') goto yy76;
     884           0 :         goto yy13;
     885             : yy75:
     886             :         YYDEBUG(75, *YYCURSOR);
     887           0 :         yych = *++YYCURSOR;
     888           0 :         if (yych <= '/') goto yy13;
     889           0 :         if (yych >= '5') goto yy13;
     890             : yy76:
     891             :         YYDEBUG(76, *YYCURSOR);
     892          10 :         yych = *++YYCURSOR;
     893          10 :         if (yych != ':') goto yy13;
     894             :         YYDEBUG(77, *YYCURSOR);
     895          10 :         yych = *++YYCURSOR;
     896          10 :         if (yych <= '/') goto yy13;
     897          10 :         if (yych >= '6') goto yy13;
     898             :         YYDEBUG(78, *YYCURSOR);
     899          10 :         yych = *++YYCURSOR;
     900          10 :         if (yych <= '/') goto yy13;
     901          10 :         if (yych >= ':') goto yy13;
     902             :         YYDEBUG(79, *YYCURSOR);
     903          10 :         yych = *++YYCURSOR;
     904          10 :         if (yych != ':') goto yy13;
     905             :         YYDEBUG(80, *YYCURSOR);
     906          10 :         yych = *++YYCURSOR;
     907          10 :         if (yych <= '/') goto yy13;
     908          10 :         if (yych >= '6') goto yy13;
     909             :         YYDEBUG(81, *YYCURSOR);
     910          10 :         yych = *++YYCURSOR;
     911          10 :         if (yych <= '/') goto yy13;
     912          10 :         if (yych >= ':') goto yy13;
     913             :         YYDEBUG(82, *YYCURSOR);
     914          10 :         yych = *++YYCURSOR;
     915          10 :         if (yych != 'Z') goto yy13;
     916             : yy83:
     917             :         YYDEBUG(83, *YYCURSOR);
     918          10 :         ++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           0 :         yych = *++YYCURSOR;
     947           0 :         if (yych <= '/') goto yy13;
     948           0 :         if (yych <= '0') goto yy86;
     949           0 :         if (yych <= '2') goto yy87;
     950           0 :         if (yych <= '3') goto yy88;
     951           0 :         goto yy13;
     952             : yy86:
     953             :         YYDEBUG(86, *YYCURSOR);
     954           0 :         yych = *++YYCURSOR;
     955           0 :         if (yych <= '0') goto yy13;
     956           0 :         if (yych <= '9') goto yy89;
     957           0 :         goto yy13;
     958             : yy87:
     959             :         YYDEBUG(87, *YYCURSOR);
     960           0 :         yych = *++YYCURSOR;
     961           0 :         if (yych <= '/') goto yy13;
     962           0 :         if (yych <= '9') goto yy89;
     963           0 :         goto yy13;
     964             : yy88:
     965             :         YYDEBUG(88, *YYCURSOR);
     966           0 :         yych = *++YYCURSOR;
     967           0 :         if (yych <= '/') goto yy13;
     968           0 :         if (yych >= '2') goto yy13;
     969             : yy89:
     970             :         YYDEBUG(89, *YYCURSOR);
     971           0 :         yych = *++YYCURSOR;
     972           0 :         if (yych != 'T') goto yy13;
     973             :         YYDEBUG(90, *YYCURSOR);
     974           0 :         yych = *++YYCURSOR;
     975           0 :         if (yych <= '/') goto yy13;
     976           0 :         if (yych <= '1') goto yy91;
     977           0 :         if (yych <= '2') goto yy92;
     978           0 :         goto yy13;
     979             : yy91:
     980             :         YYDEBUG(91, *YYCURSOR);
     981           0 :         yych = *++YYCURSOR;
     982           0 :         if (yych <= '/') goto yy13;
     983           0 :         if (yych <= '9') goto yy93;
     984           0 :         goto yy13;
     985             : yy92:
     986             :         YYDEBUG(92, *YYCURSOR);
     987           0 :         yych = *++YYCURSOR;
     988           0 :         if (yych <= '/') goto yy13;
     989           0 :         if (yych >= '5') goto yy13;
     990             : yy93:
     991             :         YYDEBUG(93, *YYCURSOR);
     992           0 :         yych = *++YYCURSOR;
     993           0 :         if (yych <= '/') goto yy13;
     994           0 :         if (yych >= '6') goto yy13;
     995             :         YYDEBUG(94, *YYCURSOR);
     996           0 :         yych = *++YYCURSOR;
     997           0 :         if (yych <= '/') goto yy13;
     998           0 :         if (yych >= ':') goto yy13;
     999             :         YYDEBUG(95, *YYCURSOR);
    1000           0 :         yych = *++YYCURSOR;
    1001           0 :         if (yych <= '/') goto yy13;
    1002           0 :         if (yych >= '6') goto yy13;
    1003             :         YYDEBUG(96, *YYCURSOR);
    1004           0 :         yych = *++YYCURSOR;
    1005           0 :         if (yych <= '/') goto yy13;
    1006           0 :         if (yych >= ':') goto yy13;
    1007             :         YYDEBUG(97, *YYCURSOR);
    1008           0 :         yych = *++YYCURSOR;
    1009           0 :         if (yych == 'Z') goto yy83;
    1010           0 :         goto yy13;
    1011             : yy98:
    1012             :         YYDEBUG(98, *YYCURSOR);
    1013           1 :         ++YYCURSOR;
    1014           1 :         if (YYLIMIT <= YYCURSOR) YYFILL(1);
    1015           1 :         yych = *YYCURSOR;
    1016             :         YYDEBUG(99, *YYCURSOR);
    1017           1 :         if (yych <= '/') goto yy100;
    1018           0 :         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             :  */

Generated by: LCOV version 1.10

Generated at Tue, 29 Jul 2014 09:53:17 +0000 (3 days ago)

Copyright © 2005-2014 The PHP Group
All rights reserved.