2#line 1 "ext/date/lib/parse_iso_intervals.re"
33# define strtoll(s, f, b) _atoi64(s)
34#elif !defined(HAVE_STRTOLL)
35# if defined(HAVE_ATOLL)
36# define strtoll(s, f, b) atoll(s)
38# define strtoll(s, f, b) strtol(s, f, b)
44#define TIMELIB_PERIOD 260
45#define TIMELIB_ISO_DATE 261
46#define TIMELIB_ERROR 999
48typedef unsigned char uchar;
53#define YYCURSOR cursor
55#define YYMARKER s->ptr
56#define YYFILL(n) return EOI;
58#define RET(i) {s->cur = cursor; return i;}
60#define timelib_string_free timelib_free
62#define TIMELIB_INIT s->cur = cursor; str = timelib_string(s); ptr = str
63#define TIMELIB_DEINIT timelib_string_free(str)
66#define DEBUG_OUTPUT(s) printf("%s\n", s);
67#define YYDEBUG(s,c) { if (s != -1) { printf("state: %d ", s); printf("[%c]\n", c); } }
69#define DEBUG_OUTPUT(s)
93 s->errors->error_count++;
95 s->errors->error_messages[
s->errors->error_count - 1].position =
s->tok ?
s->tok -
s->str : 0;
96 s->errors->error_messages[
s->errors->error_count - 1].character =
s->tok ? *
s->tok : 0;
100static char *timelib_string(
Scanner *
s)
108static timelib_sll timelib_get_nr(
const char **
ptr,
int max_length)
115 while ((**
ptr <
'0') || (**
ptr >
'9')) {
122 while ((**
ptr >=
'0') && (**
ptr <=
'9') &&
len < max_length) {
134static timelib_ull timelib_get_unsigned_nr(
const char **
ptr,
int max_length)
138 while (((**
ptr <
'0') || (**
ptr >
'9')) && (**
ptr !=
'+') && (**
ptr !=
'-')) {
145 while (**
ptr ==
'+' || **
ptr ==
'-')
152 return dir * timelib_get_nr(
ptr, max_length);
155#define timelib_split_free(arg) { \
157 for (i = 0; i < arg.c; i++) { \
158 timelib_free(arg.v[i]); \
161 timelib_free(arg.v); \
168#pragma optimize( "", off )
179#line 204 "ext/date/lib/parse_iso_intervals.re"
186 unsigned int yyaccept = 0;
187 static const unsigned char yybm[] = {
188 0, 0, 0, 0, 0, 0, 0, 0,
189 0, 0, 0, 0, 0, 0, 0, 0,
190 0, 0, 0, 0, 0, 0, 0, 0,
191 0, 0, 0, 0, 0, 0, 0, 0,
192 0, 0, 0, 0, 0, 0, 0, 0,
193 0, 0, 0, 0, 0, 0, 0, 0,
194 128, 128, 128, 128, 128, 128, 128, 128,
195 128, 128, 0, 0, 0, 0, 0, 0,
196 0, 0, 0, 0, 0, 0, 0, 0,
197 0, 0, 0, 0, 0, 0, 0, 0,
198 0, 0, 0, 0, 0, 0, 0, 0,
199 0, 0, 0, 0, 0, 0, 0, 0,
200 0, 0, 0, 0, 0, 0, 0, 0,
201 0, 0, 0, 0, 0, 0, 0, 0,
202 0, 0, 0, 0, 0, 0, 0, 0,
203 0, 0, 0, 0, 0, 0, 0, 0,
204 0, 0, 0, 0, 0, 0, 0, 0,
205 0, 0, 0, 0, 0, 0, 0, 0,
206 0, 0, 0, 0, 0, 0, 0, 0,
207 0, 0, 0, 0, 0, 0, 0, 0,
208 0, 0, 0, 0, 0, 0, 0, 0,
209 0, 0, 0, 0, 0, 0, 0, 0,
210 0, 0, 0, 0, 0, 0, 0, 0,
211 0, 0, 0, 0, 0, 0, 0, 0,
212 0, 0, 0, 0, 0, 0, 0, 0,
213 0, 0, 0, 0, 0, 0, 0, 0,
214 0, 0, 0, 0, 0, 0, 0, 0,
215 0, 0, 0, 0, 0, 0, 0, 0,
216 0, 0, 0, 0, 0, 0, 0, 0,
217 0, 0, 0, 0, 0, 0, 0, 0,
218 0, 0, 0, 0, 0, 0, 0, 0,
219 0, 0, 0, 0, 0, 0, 0, 0,
226 if (yych <= 0x00)
goto yy2;
227 if (yych <= 0x08)
goto yy4;
228 if (yych <=
'\t')
goto yy6;
230 if (yych ==
' ')
goto yy6;
231 if (yych <=
'+')
goto yy4;
236 if (yych <=
'-')
goto yy4;
237 if (yych <=
'/')
goto yy6;
238 if (yych <=
'9')
goto yy8;
241 if (yych <=
'P')
goto yy9;
242 if (yych ==
'R')
goto yy11;
250#line 311 "ext/date/lib/parse_iso_intervals.re"
252 s->pos = cursor;
s->line++;
261#line 317 "ext/date/lib/parse_iso_intervals.re"
263 add_error(
s,
"Unexpected character");
271#line 306 "ext/date/lib/parse_iso_intervals.re"
280 if (yych <=
'/')
goto yy5;
281 if (yych <=
'9')
goto yy12;
287 if (yych <=
'/')
goto yy10;
288 if (yych <=
'9')
goto yy14;
289 if (yych ==
'T')
goto yy15;
292#line 244 "ext/date/lib/parse_iso_intervals.re"
304 if ( *
ptr ==
'\0' ) {
305 add_error(
s,
"Missing expected time part");
309 nr = timelib_get_unsigned_nr(&
ptr, 12);
311 case 'Y':
s->period->y = nr;
break;
312 case 'W':
s->period->d += nr * 7;
break;
313 case 'D':
s->period->d += nr;
break;
314 case 'H':
s->period->h = nr;
break;
315 case 'S':
s->period->s = nr;
break;
324 add_error(
s,
"Undefined period specifier");
328 }
while (!
s->errors->error_count && *
ptr);
337 if (yybm[0+yych] & 128) {
344 if (yych <=
'/')
goto yy13;
345 if (yych <=
'9')
goto yy19;
359 if (yych <=
'/')
goto yy13;
362 if (yych ==
'D')
goto yy21;
367 if (yych <=
'M')
goto yy22;
368 if (yych <=
'V')
goto yy13;
371 if (yych ==
'Y')
goto yy24;
379 if (yych <=
'/')
goto yy10;
380 if (yych <=
'9')
goto yy25;
388 if (yybm[0+yych] & 128) {
392#line 209 "ext/date/lib/parse_iso_intervals.re"
397 s->recurrences = timelib_get_unsigned_nr(&
ptr, 9);
399 s->have_recurrences = 1;
406 if (yych <=
'/')
goto yy13;
407 if (yych <=
'9')
goto yy27;
414 if (yych <=
'/')
goto yy13;
417 if (yych !=
'D')
goto yy13;
421 if (yych <=
'M')
goto yy22;
422 if (yych <=
'V')
goto yy13;
425 if (yych ==
'Y')
goto yy24;
432 if (yych ==
'T')
goto yy15;
438 if (yych <=
'/')
goto yy10;
439 if (yych <=
'9')
goto yy29;
440 if (yych ==
'T')
goto yy15;
446 if (yych <=
'/')
goto yy10;
447 if (yych <=
'9')
goto yy31;
448 if (yych ==
'T')
goto yy15;
454 if (yych <=
'/')
goto yy10;
455 if (yych <=
'9')
goto yy33;
456 if (yych ==
'T')
goto yy15;
465 if (yych <=
'/')
goto yy13;
466 if (yych <=
'9')
goto yy25;
467 if (yych <=
'G')
goto yy13;
471 if (yych <=
'L')
goto yy13;
474 if (yych ==
'S')
goto yy37;
482 if (yych ==
'-')
goto yy38;
485 if (yych <=
'0')
goto yy39;
486 if (yych <=
'1')
goto yy40;
494 if (yych <=
'/')
goto yy13;
497 if (yych ==
'D')
goto yy21;
502 if (yych <=
'M')
goto yy22;
503 if (yych <=
'V')
goto yy13;
506 if (yych ==
'Y')
goto yy24;
517 if (yych <=
'/')
goto yy13;
518 if (yych <=
'9')
goto yy29;
521 if (yych <=
'D')
goto yy21;
522 if (yych ==
'W')
goto yy23;
531 if (yych <=
'/')
goto yy13;
532 if (yych <=
'9')
goto yy31;
533 if (yych ==
'D')
goto yy21;
542 if (yych <=
'/')
goto yy13;
543 if (yych <=
'9')
goto yy33;
544 if (yych <=
'C')
goto yy13;
548 if (yych <=
'L')
goto yy13;
551 if (yych ==
'W')
goto yy23;
559 if (yych <=
'/')
goto yy10;
560 if (yych <=
'9')
goto yy42;
566 if (yych <=
'/')
goto yy10;
567 if (yych <=
'9')
goto yy44;
576 if (yych <=
'/')
goto yy13;
577 if (yych <=
'0')
goto yy46;
578 if (yych <=
'1')
goto yy47;
583 if (yych <=
'0')
goto yy13;
584 if (yych <=
'9')
goto yy48;
589 if (yych <=
'/')
goto yy13;
590 if (yych <=
'2')
goto yy48;
595 if (yych ==
'-')
goto yy49;
604 if (yych <=
'/')
goto yy13;
605 if (yych <=
'9')
goto yy42;
608 if (yych <=
'M')
goto yy36;
609 if (yych ==
'S')
goto yy37;
618 if (yych <=
'/')
goto yy13;
619 if (yych <=
'9')
goto yy44;
620 if (yych ==
'S')
goto yy37;
625 if (yych <=
'0')
goto yy13;
626 if (yych <=
'9')
goto yy52;
631 if (yych <=
'/')
goto yy13;
632 if (yych <=
'2')
goto yy52;
637 if (yych <=
'/')
goto yy13;
638 if (yych <=
'0')
goto yy53;
639 if (yych <=
'2')
goto yy54;
640 if (yych <=
'3')
goto yy55;
645 if (yych <=
'/')
goto yy13;
646 if (yych <=
'0')
goto yy56;
647 if (yych <=
'1')
goto yy57;
658 if (yych <=
'/')
goto yy13;
661 if (yych ==
'D')
goto yy21;
666 if (yych <=
'M')
goto yy22;
667 if (yych <=
'V')
goto yy13;
670 if (yych ==
'Y')
goto yy24;
677 if (yych ==
'-')
goto yy58;
682 if (yych <=
'0')
goto yy13;
683 if (yych <=
'9')
goto yy59;
688 if (yych <=
'/')
goto yy13;
689 if (yych <=
'9')
goto yy59;
694 if (yych <=
'/')
goto yy13;
695 if (yych <=
'1')
goto yy59;
700 if (yych <=
'/')
goto yy13;
701 if (yych <=
'9')
goto yy60;
706 if (yych <=
'/')
goto yy13;
707 if (yych <=
'2')
goto yy60;
712 if (yych <=
'/')
goto yy13;
713 if (yych <=
'0')
goto yy61;
714 if (yych <=
'2')
goto yy62;
715 if (yych <=
'3')
goto yy63;
720 if (yych ==
'T')
goto yy64;
725 if (yych ==
'-')
goto yy65;
730 if (yych <=
'0')
goto yy13;
731 if (yych <=
'9')
goto yy66;
736 if (yych <=
'/')
goto yy13;
737 if (yych <=
'9')
goto yy66;
742 if (yych <=
'/')
goto yy13;
743 if (yych <=
'1')
goto yy66;
748 if (yych <=
'/')
goto yy13;
749 if (yych <=
'1')
goto yy67;
750 if (yych <=
'2')
goto yy68;
755 if (yych <=
'/')
goto yy13;
756 if (yych <=
'2')
goto yy69;
757 if (yych <=
'3')
goto yy70;
762 if (yych ==
'T')
goto yy71;
767 if (yych <=
'/')
goto yy13;
768 if (yych <=
'9')
goto yy72;
773 if (yych <=
'/')
goto yy13;
774 if (yych <=
'4')
goto yy72;
779 if (yych <=
'/')
goto yy13;
780 if (yych <=
'9')
goto yy73;
785 if (yych <=
'/')
goto yy13;
786 if (yych <=
'1')
goto yy73;
791 if (yych <=
'/')
goto yy13;
792 if (yych <=
'1')
goto yy74;
793 if (yych <=
'2')
goto yy75;
798 if (yych <=
'/')
goto yy13;
799 if (yych <=
'5')
goto yy76;
804 if (yych ==
'T')
goto yy77;
809 if (yych <=
'/')
goto yy13;
810 if (yych <=
'9')
goto yy78;
815 if (yych <=
'/')
goto yy13;
816 if (yych <=
'4')
goto yy78;
821 if (yych <=
'/')
goto yy13;
822 if (yych <=
'9')
goto yy79;
827 if (yych <=
'/')
goto yy13;
828 if (yych <=
'1')
goto yy80;
829 if (yych <=
'2')
goto yy81;
834 if (yych ==
':')
goto yy82;
839 if (yych <=
'/')
goto yy13;
840 if (yych <=
'5')
goto yy83;
845 if (yych <=
'/')
goto yy13;
846 if (yych <=
'9')
goto yy84;
851 if (yych <=
'/')
goto yy13;
852 if (yych <=
'4')
goto yy84;
857 if (yych <=
'/')
goto yy13;
858 if (yych <=
'5')
goto yy85;
863 if (yych <=
'/')
goto yy13;
864 if (yych <=
'9')
goto yy86;
869 if (yych ==
':')
goto yy87;
874 if (yych <=
'/')
goto yy13;
875 if (yych <=
'9')
goto yy88;
880 if (yych ==
'Z')
goto yy89;
885 if (yych <=
'/')
goto yy13;
886 if (yych <=
'5')
goto yy91;
891 if (yych ==
':')
goto yy79;
897#line 220 "ext/date/lib/parse_iso_intervals.re"
901 if (
s->have_date ||
s->have_period) {
903 s->have_end_date = 1;
906 s->have_begin_date = 1;
924 if (yych <=
'/')
goto yy13;
925 if (yych >=
':')
goto yy13;
928 if (yych !=
':')
goto yy13;
931 if (yych <=
'/')
goto yy13;
932 if (yych >=
'6')
goto yy13;
935 if (yych <=
'/')
goto yy13;
936 if (yych >=
':')
goto yy13;
940#line 286 "ext/date/lib/parse_iso_intervals.re"
944 s->period->y = timelib_get_unsigned_nr(&
ptr, 4);
946 s->period->m = timelib_get_unsigned_nr(&
ptr, 2);
948 s->period->d = timelib_get_unsigned_nr(&
ptr, 2);
950 s->period->h = timelib_get_unsigned_nr(&
ptr, 2);
952 s->period->i = timelib_get_unsigned_nr(&
ptr, 2);
954 s->period->s = timelib_get_unsigned_nr(&
ptr, 2);
961#line 321 "ext/date/lib/parse_iso_intervals.re"
965#pragma optimize( "", on )
978 const char *e =
s +
len - 1;
980 memset(&in, 0,
sizeof(in));
988 while (isspace(*
s) &&
s < e) {
991 while (isspace(*e) && e >
s) {
996 add_error(&in,
"Empty string");
printf(string $format, mixed ... $values)
dir(string $directory, $context=null)
memset(ptr, 0, type->size)
void timelib_strtointerval(const char *s, size_t len, timelib_time **begin, timelib_time **end, timelib_rel_time **period, int *recurrences, timelib_error_container **errors)
unsigned const char * end
unsigned const char * pos
timelib_error_container * errors
timelib_rel_time * period
timelib_error_message * error_messages
timelib_error_message * warning_messages
unsigned int is_localtime
timelib_time * timelib_time_ctor(void)
void timelib_error_container_dtor(timelib_error_container *errors)
void timelib_time_dtor(timelib_time *t)
void timelib_rel_time_dtor(timelib_rel_time *t)
timelib_rel_time * timelib_rel_time_ctor(void)
unsigned long long timelib_ull
struct _timelib_error_container timelib_error_container
#define TIMELIB_ZONETYPE_OFFSET
struct _timelib_error_message timelib_error_message
struct _timelib_time timelib_time
struct _timelib_rel_time timelib_rel_time
signed long long timelib_sll