parse_iso_intervals.c 23 KB

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