Coverage Report

Created: 2026-10-28 06:20

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