summaryrefslogtreecommitdiff
path: root/ext/date/lib/parse_date.re
diff options
context:
space:
mode:
Diffstat (limited to 'ext/date/lib/parse_date.re')
-rw-r--r--ext/date/lib/parse_date.re1547
1 files changed, 0 insertions, 1547 deletions
diff --git a/ext/date/lib/parse_date.re b/ext/date/lib/parse_date.re
deleted file mode 100644
index a3fdcfa894..0000000000
--- a/ext/date/lib/parse_date.re
+++ /dev/null
@@ -1,1547 +0,0 @@
-/*
- +----------------------------------------------------------------------+
- | PHP Version 5 |
- +----------------------------------------------------------------------+
- | Copyright (c) 1997-2005 The PHP Group |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.0 of the PHP license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available through the world-wide-web at the following url: |
- | http://www.php.net/license/3_0.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Authors: Derick Rethans <derick@derickrethans.nl> |
- +----------------------------------------------------------------------+
- */
-
-/* $Id$ */
-
-#include "timelib.h"
-
-#include <stdio.h>
-
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#else
-#include <strings.h>
-#endif
-
-#if defined(_MSC_VER)
-# define strtoll(s, f, b) _atoi64(s)
-#elif !defined(HAVE_STRTOLL)
-# if defined(HAVE_ATOLL)
-# define strtoll(s, f, b) atoll(s)
-# else
-# define strtoll(s, f, b) strtol(s, f, b)
-# endif
-#endif
-
-#define TIMELIB_SECOND 1
-#define TIMELIB_MINUTE 2
-#define TIMELIB_HOUR 3
-#define TIMELIB_DAY 4
-#define TIMELIB_MONTH 5
-#define TIMELIB_YEAR 6
-#define TIMELIB_WEEKDAY 7
-
-#define EOI 257
-#define TIME 258
-#define DATE 259
-
-#define TIMELIB_XMLRPC_SOAP 260
-#define TIMELIB_TIME12 261
-#define TIMELIB_TIME24 262
-#define TIMELIB_GNU_NOCOLON 263
-#define TIMELIB_GNU_NOCOLON_TZ 264
-#define TIMELIB_ISO_NOCOLON 265
-
-#define TIMELIB_AMERICAN 266
-#define TIMELIB_ISO_DATE 267
-#define TIMELIB_DATE_FULL 268
-#define TIMELIB_DATE_TEXT 269
-#define TIMELIB_DATE_NOCOLON 270
-#define TIMELIB_PG_YEARDAY 271
-#define TIMELIB_PG_TEXT 272
-#define TIMELIB_PG_REVERSE 273
-#define TIMELIB_CLF 274
-#define TIMELIB_DATE_NO_DAY 275
-#define TIMELIB_SHORTDATE_WITH_TIME 276
-#define TIMELIB_DATE_FULL_POINTED 277
-#define TIMELIB_TIME24_WITH_ZONE 278
-#define TIMELIB_ISO_WEEK 279
-
-#define TIMELIB_TIMEZONE 300
-#define TIMELIB_AGO 301
-
-#define TIMELIB_RELATIVE 310
-
-#define TIMELIB_ERROR 999
-
-typedef unsigned char uchar;
-
-#define BSIZE 8192
-
-#define YYCTYPE uchar
-#define YYCURSOR cursor
-#define YYLIMIT s->lim
-#define YYMARKER s->ptr
-#define YYFILL(n) return EOI;
-
-#define RET(i) {s->cur = cursor; return i;}
-
-#define timelib_string_free free
-
-#define TIMELIB_HAVE_TIME() { if (s->time->have_time) { return TIMELIB_ERROR; } else { s->time->have_time = 1; s->time->h = 0; s->time->i = 0; s->time->s = 0; s->time->f = 0; } }
-#define TIMELIB_UNHAVE_TIME() { s->time->have_time = 0; s->time->h = 0; s->time->i = 0; s->time->s = 0; s->time->f = 0; }
-#define TIMELIB_HAVE_DATE() { if (s->time->have_date) { return TIMELIB_ERROR; } else { s->time->have_date = 1; } }
-#define TIMELIB_UNHAVE_DATE() { s->time->have_date = 0; s->time->d = 0; s->time->m = 0; s->time->y = 0; }
-#define TIMELIB_HAVE_RELATIVE() { s->time->have_relative = 1; }
-#define TIMELIB_HAVE_WEEKDAY_RELATIVE() { s->time->have_weekday_relative = 1; }
-#define TIMELIB_HAVE_TZ() { s->cur = cursor; if (s->time->have_zone) { return TIMELIB_ERROR; } else { s->time.have_zone = 1; } }
-
-#define TIMELIB_INIT s->cur = cursor; str = timelib_string(s); ptr = str
-#define TIMELIB_DEINIT timelib_string_free(str)
-#define TIMELIB_ADJUST_RELATIVE_WEEKDAY() if (in->time.have_weekday_relative && (in.rel.d > 0)) { in.rel.d -= 7; }
-
-#define TIMELIB_PROCESS_YEAR(x) { \
- if ((x) == -1) { \
- /* (x) = 0; */ \
- } else if ((x) < 100) { \
- if ((x) < 70) { \
- (x) += 2000; \
- } else { \
- (x) += 1900; \
- } \
- } \
-}
-
-#ifdef DEBUG_PARSER
-#define DEBUG_OUTPUT(s) printf("%s\n", s);
-#define YYDEBUG(s,c) { if (s != -1) { printf("state: %d ", s); printf("[%c]\n", c); } }
-#else
-#define DEBUG_OUTPUT(s)
-#define YYDEBUG(s,c)
-#endif
-
-#include "timelib_structs.h"
-
-typedef struct timelib_elems {
- unsigned int c; /* Number of elements */
- char **v; /* Values */
-} timelib_elems;
-
-typedef struct Scanner {
- int fd;
- uchar *lim, *str, *ptr, *cur, *tok, *pos;
- unsigned int line, len;
- int errors;
-
- struct timelib_time *time;
-} Scanner;
-
-typedef struct _timelib_lookup_table {
- const char *name;
- int type;
- int value;
-} timelib_lookup_table;
-
-typedef struct _timelib_relunit {
- const char *name;
- int unit;
- int multiplier;
-} timelib_relunit;
-
-#define HOUR(a) (int)(a * 60)
-
-/* The timezone table. */
-static timelib_tz_lookup_table timelib_timezone_lookup[] = {
- { "a", 0, HOUR (- 1), NULL },
- { "adt", 1, HOUR ( 4), "America/Halifax" }, /* Atlantic Daylight */
- { "ahst", 0, HOUR ( 10), "America/Anchorage" }, /* Alaska-Hawaii Standard */
- { "akdt", 0, HOUR ( 10), "America/Anchorage" }, /* Alaska Daylight */
- { "akst", 0, HOUR ( 10), "America/Anchorage" }, /* Alaska Standard */
- { "ast", 0, HOUR ( 4), "America/Halifax" }, /* Atlantic Standard */
- { "at", 0, HOUR ( 2), "Atlantic/Azores" }, /* Azores */
- { "b", 0, HOUR (- 2), NULL },
- { "bst", 1, HOUR ( 0), "Europe/London" }, /* British Summer */
- { "bt", 0, -HOUR ( 3), "Asia/Baghdad" }, /* Baghdad, USSR Zone 2 */
- { "c", 0, HOUR (- 3), NULL },
- { "cadt", 1, -HOUR (9.5), "Australia/Adelaide" }, /* Central Australian Daylight */
- { "cast", 0, -HOUR (9.5), "Australia/Adelaide" }, /* Central Australian Standard */
- { "cat", 0, HOUR ( 10), "America/Anchorage" }, /* Central Alaska */
- { "cct", 0, -HOUR ( 8), "Asia/Shanghai" }, /* China Coast, USSR Zone 7 */
- { "cdt", 1, HOUR ( 6), "America/Chicago" }, /* Central Daylight */
- { "cest", 1, -HOUR ( 1), "Europe/Berlin" }, /* Central European Summer */
- { "cet", 0, -HOUR ( 1), "Europe/Berlin" }, /* Central European */
- { "cst", 0, HOUR ( 6), "America/Chicago" }, /* Central Standard */
- { "d", 0, HOUR (- 4), NULL },
- { "e", 0, HOUR (- 5), NULL },
- { "eadt", 1, -HOUR ( 10), "Australia/Sydney" }, /* Eastern Australian Daylight */
- { "east", 0, -HOUR ( 10), "Australia/Sydney" }, /* Eastern Australian Standard */
- { "edt", 1, HOUR ( 5), "America/New_York" }, /* Eastern Daylight */
- { "eest", 1, HOUR ( 2), "Europe/Helsinki" }, /* Eastern European Summer */
- { "eet", 0, -HOUR ( 2), "Europe/Bucharest" }, /* Eastern Europe, USSR Zone 1 */
- { "est", 0, HOUR ( 5), "America/New_York" }, /* Eastern Standard */
- { "f", 0, HOUR (- 6), NULL },
- { "fst", 1, -HOUR ( 1), "Europe/Paris" }, /* French Summer */
- { "fwt", 0, -HOUR ( 1), "Europe/Paris" }, /* French Winter */
- { "g", 0, HOUR (- 7), NULL },
- { "gmt", 0, HOUR ( 0), "GMT" }, /* Greenwich Mean */
- { "gst", 0, -HOUR ( 10), "Pacific/Guam" }, /* Guam Standard, USSR Zone 9 */
- { "h", 0, HOUR (- 8), NULL },
- { "hdt", 1, HOUR ( 10), "Pacific/Honolulu" }, /* Hawaii Daylight */
- { "hst", 0, HOUR ( 10), "Pacific/Honolulu" }, /* Hawaii Standard */
- { "i", 0, HOUR (- 9), NULL },
- { "idle", 0, -HOUR ( 12), "NZ" }, /* International Date Line East */
- { "idlw", 0, HOUR ( 12), NULL }, /* International Date Line West */
- { "ist", 0, -HOUR (5.5), "Asia/Calcutta" }, /* Indian Standard */
- { "it", 0, -HOUR (3.5), "Asia/Tehran" }, /* Iran */
- { "jst", 0, -HOUR ( 9), "Asia/Tokyo" }, /* Japan Standard, USSR Zone 8 */
- { "jt", 0, -HOUR (7.5), NULL }, /* Java (3pm in Cronusland!) */
- { "k", 0, HOUR (-10), NULL },
- { "l", 0, HOUR (-11), NULL },
- { "m", 0, HOUR (-12), NULL },
- { "mdt", 1, HOUR ( 7), "America/Phoenix" }, /* Mountain Daylight */
- { "mest", 1, -HOUR ( 1), "MET" }, /* Middle European Summer */
- { "mesz", 1, -HOUR ( 1), "MET" }, /* Middle European Summer */
- { "met", 0, -HOUR ( 1), "MET" }, /* Middle European */
- { "mewt", 0, -HOUR ( 1), "MET" }, /* Middle European Winter */
- { "msd", 1, HOUR ( 3), "Europe/Moscow" }, /* Moscow Summer */
- { "msk", 0, HOUR ( 3), "Europe/Moscow" }, /* Moscow */
- { "mst", 0, HOUR ( 7), "America/Phoenix" }, /* Mountain Standard */
- { "n", 0, HOUR ( 1), NULL },
- { "ndt", 1, HOUR (3.5), "America/St_Johns" }, /* Newfoundland Daylight */
- { "nft", 0, HOUR (3.5), "America/St_Johns" }, /* Newfoundland */
- { "nst", 0, HOUR (3.5), "America/St_Johns" }, /* Newfoundland Standard */
- { "nt", 0, HOUR ( 11), NULL }, /* Nome */
- { "nzdt", 1, -HOUR ( 12), "NZ" }, /* New Zealand Daylight */
- { "nzst", 0, -HOUR ( 12), "NZ" }, /* New Zealand Standard */
- { "nzt", 0, -HOUR ( 12), "NZ" }, /* New Zealand */
- { "o", 0, HOUR ( 2), NULL },
- { "p", 0, HOUR ( 3), NULL },
- { "pdt", 1, HOUR ( 8), "America/Los_Angeles" }, /* Pacific Daylight */
- { "pst", 0, HOUR ( 8), "America/Los_Angeles" }, /* Pacific Standard */
- { "q", 0, HOUR ( 4), NULL },
- { "r", 0, HOUR ( 5), NULL },
- { "s", 0, HOUR ( 6), NULL },
- { "slst", 1, -HOUR ( 1), "Europe/Oslo" }, /* Skien Local Summer Time */
- { "slt", 0, -HOUR ( 1), "Europe/Oslo" }, /* Skien Local Time */
- { "sst", 1, -HOUR ( 1), "Europe/Stockholm" }, /* Swedish Summer */
- { "swt", 0, -HOUR ( 1), "Europe/Stockholm" }, /* Swedish Winter */
- { "t", 0, HOUR ( 7), NULL },
- { "u", 0, HOUR ( 8), NULL },
- { "ut", 0, HOUR ( 0), "UTC" }, /* Universal (Coordinated) */
- { "utc", 0, HOUR ( 0), "UTC" },
- { "v", 0, HOUR ( 9), NULL },
- { "w", 0, HOUR ( 10), NULL },
- { "wadt", 1, -HOUR ( 7), "Australia/Perth" }, /* West Australian Daylight */
- { "wast", 0, -HOUR ( 7), "Australia/Perth" }, /* West Australian Standard */
- { "wat", 0, HOUR ( 1), "Africa/Dakar" }, /* West Africa */
- { "wet", 0, HOUR ( 0), "Europe/London" }, /* Western European */
- { "x", 0, HOUR ( 11), NULL },
- { "y", 0, HOUR ( 12), NULL },
- { "ydt", 1, HOUR ( 9), "America/Anchorage" }, /* Yukon Daylight */
- { "yst", 0, HOUR ( 9), "America/Anchorage" }, /* Yukon Standard */
- { "z", 0, HOUR ( 0), NULL },
- { "zp4", 0, -HOUR ( 4), NULL }, /* USSR Zone 3 */
- { "zp5", 0, -HOUR ( 5), NULL }, /* USSR Zone 4 */
- { "zp6", 0, -HOUR ( 6), NULL }, /* USSR Zone 5 */
-#if 0
- /* For completeness. BST is also British Summer, and GST is
- * also Guam Standard. */
- { "bst", 0, HOUR ( 3), NULL }, /* Brazil Standard */
- { "gst", 0, HOUR ( 3), NULL }, /* Greenland Standard */
-
- /* For completeness. NST is also Newfoundland Standard, and SST is
- * also Swedish Summer. */
- { "nst", 0, -HOUR (6.5), NULL },/* North Sumatra */
- { "sst", 0, -HOUR (7), NULL }, /* South Sumatra, USSR Zone 6 */
-#endif
-};
-
-static timelib_relunit const timelib_relunit_lookup[] = {
- { "sec", TIMELIB_SECOND, 1 },
- { "secs", TIMELIB_SECOND, 1 },
- { "second", TIMELIB_SECOND, 1 },
- { "seconds", TIMELIB_SECOND, 1 },
- { "min", TIMELIB_MINUTE, 1 },
- { "mins", TIMELIB_MINUTE, 1 },
- { "minute", TIMELIB_MINUTE, 1 },
- { "minutes", TIMELIB_MINUTE, 1 },
- { "hour", TIMELIB_HOUR, 1 },
- { "hours", TIMELIB_HOUR, 1 },
- { "day", TIMELIB_DAY, 1 },
- { "days", TIMELIB_DAY, 1 },
- { "week", TIMELIB_DAY, 7 },
- { "weeks", TIMELIB_DAY, 7 },
- { "fortnight", TIMELIB_DAY, 14 },
- { "fortnights", TIMELIB_DAY, 14 },
- { "forthnight", TIMELIB_DAY, 14 },
- { "forthnights", TIMELIB_DAY, 14 },
- { "month", TIMELIB_MONTH, 1 },
- { "months", TIMELIB_MONTH, 1 },
- { "year", TIMELIB_YEAR, 1 },
- { "years", TIMELIB_YEAR, 1 },
-
- { "monday", TIMELIB_WEEKDAY, 1 },
- { "tuesday", TIMELIB_WEEKDAY, 2 },
- { "wednesday", TIMELIB_WEEKDAY, 3 },
- { "thursday", TIMELIB_WEEKDAY, 4 },
- { "friday", TIMELIB_WEEKDAY, 5 },
- { "saturday", TIMELIB_WEEKDAY, 6 },
- { "sunday", TIMELIB_WEEKDAY, 0 },
-
- { NULL, 0, 0 }
-};
-
-/* The relative text table. */
-static timelib_lookup_table const timelib_reltext_lookup[] = {
- { "first", 0, 1 },
- { "next", 0, 1 },
- { "second", 0, 2 },
- { "third", 0, 3 },
- { "fourth", 0, 4 },
- { "fifth", 0, 5 },
- { "sixth", 0, 6 },
- { "seventh", 0, 7 },
- { "eight", 0, 8 },
- { "ninth", 0, 9 },
- { "tenth", 0, 10 },
- { "eleventh", 0, 11 },
- { "twelfth", 0, 12 },
- { "last", 0, -1 },
- { "previous", 0, -1 },
- { "this", 0, 0 },
- { NULL, 0, 0 }
-};
-
-/* The month table. */
-static timelib_lookup_table const timelib_month_lookup[] = {
- { "jan", 0, 1 },
- { "feb", 0, 2 },
- { "mar", 0, 3 },
- { "apr", 0, 4 },
- { "may", 0, 5 },
- { "jun", 0, 6 },
- { "jul", 0, 7 },
- { "aug", 0, 8 },
- { "sep", 0, 9 },
- { "sept", 0, 9 },
- { "oct", 0, 10 },
- { "nov", 0, 11 },
- { "dec", 0, 12 },
- { "i", 0, 1 },
- { "ii", 0, 2 },
- { "iii", 0, 3 },
- { "iv", 0, 4 },
- { "v", 0, 5 },
- { "vi", 0, 6 },
- { "vii", 0, 7 },
- { "viii", 0, 8 },
- { "ix", 0, 9 },
- { "x", 0, 10 },
- { "xi", 0, 11 },
- { "xii", 0, 12 },
-
- { "january", 0, 1 },
- { "february", 0, 2 },
- { "march", 0, 3 },
- { "april", 0, 4 },
- { "may", 0, 5 },
- { "june", 0, 6 },
- { "july", 0, 7 },
- { "august", 0, 8 },
- { "september", 0, 9 },
- { "october", 0, 10 },
- { "november", 0, 11 },
- { "december", 0, 12 },
- { NULL, 0, 0 }
-};
-
-#if 0
-static char* timelib_ltrim(char *s)
-{
- char *ptr = s;
- while (ptr[0] == ' ') {
- ptr++;
- }
- return ptr;
-}
-#endif
-
-#if 0
-uchar *fill(Scanner *s, uchar *cursor){
- if(!s->eof){
- unsigned int cnt = s->tok - s->bot;
- if(cnt){
- memcpy(s->bot, s->tok, s->lim - s->tok);
- s->tok = s->bot;
- s->ptr -= cnt;
- cursor -= cnt;
- s->pos -= cnt;
- s->lim -= cnt;
- }
- if((s->top - s->lim) < BSIZE){
- uchar *buf = (uchar*) malloc(((s->lim - s->bot) + BSIZE)*sizeof(uchar));
- memcpy(buf, s->tok, s->lim - s->tok);
- s->tok = buf;
- s->ptr = &buf[s->ptr - s->bot];
- cursor = &buf[cursor - s->bot];
- s->pos = &buf[s->pos - s->bot];
- s->lim = &buf[s->lim - s->bot];
- s->top = &s->lim[BSIZE];
- free(s->bot);
- s->bot = buf;
- }
- if((cnt = read(s->fd, (char*) s->lim, BSIZE)) != BSIZE){
- s->eof = &s->lim[cnt]; *(s->eof)++ = '\n';
- }
- s->lim += cnt;
- }
- return cursor;
-}
-#endif
-
-static timelib_sll timelib_meridian(char **ptr, timelib_sll h)
-{
- timelib_sll retval = 0;
-
- while (!strchr("AaPp", **ptr)) {
- ++*ptr;
- }
- if (**ptr == 'a' || **ptr == 'A') {
- if (h == 12) {
- retval = -12;
- }
- } else if (h != 12) {
- retval = 12;
- }
- ++*ptr;
- if (**ptr == '.') {
- *ptr += 3;
- } else {
- ++*ptr;
- }
- return retval;
-}
-
-static char *timelib_string(Scanner *s)
-{
- char *tmp = calloc(1, s->cur - s->tok + 1);
- memcpy(tmp, s->tok, s->cur - s->tok);
-
- return tmp;
-}
-
-static timelib_sll timelib_get_nr(char **ptr, int max_length)
-{
- char *begin, *end, *str;
- timelib_sll tmp_nr = -1;
- int len = 0;
-
- while ((**ptr < '0') || (**ptr > '9')) {
- if (**ptr == '\0') {
- return -1;
- }
- ++*ptr;
- }
- begin = *ptr;
- while ((**ptr >= '0') && (**ptr <= '9') && len < max_length) {
- ++*ptr;
- ++len;
- }
- end = *ptr;
- str = calloc(1, end - begin + 1);
- memcpy(str, begin, end - begin);
- tmp_nr = strtoll(str, NULL, 10);
- free(str);
- return tmp_nr;
-}
-
-static double timelib_get_frac_nr(char **ptr, int max_length)
-{
- char *begin, *end, *str;
- double tmp_nr = -1;
- int len = 0;
-
- while ((**ptr != '.') && ((**ptr < '0') || (**ptr > '9'))) {
- if (**ptr == '\0') {
- return -1;
- }
- ++*ptr;
- }
- begin = *ptr;
- while (((**ptr == '.') || ((**ptr >= '0') && (**ptr <= '9'))) && len < max_length) {
- ++*ptr;
- ++len;
- }
- end = *ptr;
- str = calloc(1, end - begin + 1);
- memcpy(str, begin, end - begin);
- tmp_nr = strtod(str, NULL);
- free(str);
- return tmp_nr;
-}
-
-static timelib_ull timelib_get_unsigned_nr(char **ptr, int max_length)
-{
- timelib_ull dir = 1;
-
- while (((**ptr < '0') || (**ptr > '9')) && (**ptr != '+') && (**ptr != '-')) {
- if (**ptr == '\0') {
- return -1;
- }
- ++*ptr;
- }
- if (**ptr == '+') {
- ++*ptr;
- } else if (**ptr == '-') {
- dir = -1;
- ++*ptr;
- }
- return dir * timelib_get_nr(ptr, max_length);
-}
-
-static long timelib_parse_tz_cor(char **ptr)
-{
- char *begin = *ptr, *end;
- long tmp;
-
- while (**ptr != '\0') {
- ++*ptr;
- }
- end = *ptr;
- switch (end - begin) {
- case 1:
- case 2:
- return HOUR(strtol(begin, NULL, 10));
- break;
- case 3:
- case 4:
- tmp = strtol(begin, NULL, 10);
- return HOUR(tmp / 100) + tmp % 100;
- case 5:
- tmp = HOUR(strtol(begin, NULL, 10)) +
- strtol(begin + 3, NULL, 10);
- return tmp;
- }
- return 0;
-}
-
-static timelib_sll timelib_lookup_relative_text(char **ptr)
-{
- char *word;
- char *begin = *ptr, *end;
- timelib_sll value = 0;
- const timelib_lookup_table *tp;
-
- while ((**ptr >= 'A' && **ptr <= 'Z') || (**ptr >= 'a' && **ptr <= 'z')) {
- ++*ptr;
- }
- end = *ptr;
- word = calloc(1, end - begin + 1);
- memcpy(word, begin, end - begin);
-
- for (tp = timelib_reltext_lookup; tp->name; tp++) {
- if (strcasecmp(word, tp->name) == 0) {
- value = tp->value;
- }
- }
-
- free(word);
- return value;
-}
-
-static timelib_sll timelib_get_relative_text(char **ptr)
-{
- while (**ptr == ' ' || **ptr == '-' || **ptr == '/') {
- ++*ptr;
- }
- return timelib_lookup_relative_text(ptr);
-}
-
-static long timelib_lookup_month(char **ptr)
-{
- char *word;
- char *begin = *ptr, *end;
- long value = 0;
- const timelib_lookup_table *tp;
-
- while ((**ptr >= 'A' && **ptr <= 'Z') || (**ptr >= 'a' && **ptr <= 'z')) {
- ++*ptr;
- }
- end = *ptr;
- word = calloc(1, end - begin + 1);
- memcpy(word, begin, end - begin);
-
- for (tp = timelib_month_lookup; tp->name; tp++) {
- if (strcasecmp(word, tp->name) == 0) {
- value = tp->value;
- }
- }
-
- free(word);
- return value;
-}
-
-static long timelib_get_month(char **ptr)
-{
- while (**ptr == ' ' || **ptr == '-' || **ptr == '.' || **ptr == '/') {
- ++*ptr;
- }
- return timelib_lookup_month(ptr);
-}
-
-static void timelib_eat_spaces(char **ptr)
-{
- while (**ptr == ' ') {
- ++*ptr;
- }
-}
-
-static const timelib_relunit* timelib_lookup_relunit(char **ptr)
-{
- char *word;
- char *begin = *ptr, *end;
- const timelib_relunit *tp, *value = NULL;
-
- while (**ptr != '\0' && **ptr != ' ') {
- ++*ptr;
- }
- end = *ptr;
- word = calloc(1, end - begin + 1);
- memcpy(word, begin, end - begin);
-
- for (tp = timelib_relunit_lookup; tp->name; tp++) {
- if (strcasecmp(word, tp->name) == 0) {
- value = tp;
- break;
- }
- }
-
- free(word);
- return value;
-}
-
-static void timelib_set_relative(char **ptr, timelib_sll amount, Scanner *s)
-{
- const timelib_relunit* relunit;
-
- relunit = timelib_lookup_relunit(ptr);
- switch (relunit->unit) {
- case TIMELIB_SECOND: s->time->relative.s += amount * relunit->multiplier; break;
- case TIMELIB_MINUTE: s->time->relative.i += amount * relunit->multiplier; break;
- case TIMELIB_HOUR: s->time->relative.h += amount * relunit->multiplier; break;
- case TIMELIB_DAY: s->time->relative.d += amount * relunit->multiplier; break;
- case TIMELIB_MONTH: s->time->relative.m += amount * relunit->multiplier; break;
- case TIMELIB_YEAR: s->time->relative.y += amount * relunit->multiplier; break;
-
- case TIMELIB_WEEKDAY:
- TIMELIB_HAVE_WEEKDAY_RELATIVE();
- TIMELIB_UNHAVE_TIME();
- s->time->relative.d += (amount > 0 ? amount - 1 : amount) * 7;
- s->time->relative.weekday = relunit->multiplier;
- break;
- }
-}
-
-static timelib_tz_lookup_table* zone_search(const char *word, int left, int right)
-{
- int mid, cmp;
-
- if (left > right) {
- return NULL; /* not found */
- }
-
- mid = (left + right) / 2;
-
- cmp = strcasecmp(word, timelib_timezone_lookup[mid].name);
- if (cmp < 0) {
- return zone_search(word, left, mid - 1);
- } else if (cmp > 0) {
- return zone_search(word, mid + 1, right);
- } else { /* (cmp == 0) */
- return (timelib_tz_lookup_table*)&timelib_timezone_lookup[mid];
- }
-}
-
-static long timelib_lookup_zone(char **ptr, int *dst, char **tz_abbr, int *found)
-{
- char *word;
- char *begin = *ptr, *end;
- long value = 0;
- timelib_tz_lookup_table *tp;
-
- while (**ptr != '\0') {
- ++*ptr;
- }
- end = *ptr;
- word = calloc(1, end - begin + 1);
- memcpy(word, begin, end - begin);
-
- if ((tp = zone_search(word, 0, sizeof(timelib_timezone_lookup)/sizeof(*timelib_timezone_lookup)-1))) {
- value = tp->value;
- *dst = tp->type;
- *found = 1;
- } else {
- *found = 0;
- }
-
- *tz_abbr = word;
- return value;
-}
-
-static long timelib_get_zone(char **ptr, int *dst, timelib_time *t, int *tz_not_found)
-{
- timelib_tzinfo *res;
-
- *tz_not_found = 0;
-
- while (**ptr == ' ') {
- ++*ptr;
- }
- if (**ptr == '+') {
- ++*ptr;
- t->is_localtime = 1;
- t->zone_type = TIMELIB_ZONETYPE_OFFSET;
- *tz_not_found = 0;
- t->dst = 0;
-
- return -1 * timelib_parse_tz_cor(ptr);
- } else if (**ptr == '-') {
- ++*ptr;
- t->is_localtime = 1;
- t->zone_type = TIMELIB_ZONETYPE_OFFSET;
- *tz_not_found = 0;
- t->dst = 0;
-
- return timelib_parse_tz_cor(ptr);
- } else {
- int found = 0;
- long offset;
- char *tz_abbr;
-
- t->is_localtime = 1;
- t->zone_type = TIMELIB_ZONETYPE_ABBR;
- offset = timelib_lookup_zone(ptr, dst, &tz_abbr, &found);
-#if 0
- /* If we found a TimeZone identifier, use it */
- if (tz_name) {
- t->tz_info = timelib_parse_tzfile(tz_name);
- t->zone_type = TIMELIB_ZONETYPE_ID;
- }
-#endif
- /* If we have a TimeZone identifier to start with, use it */
- if (strstr(tz_abbr, "/")) {
- if ((res = timelib_parse_tzfile(tz_abbr)) != NULL) {
- t->tz_info = res;
- t->zone_type = TIMELIB_ZONETYPE_ID;
- found++;
- }
- }
- if (t->zone_type != TIMELIB_ZONETYPE_ID) {
- timelib_time_tz_abbr_update(t, tz_abbr);
- }
- free(tz_abbr);
- *tz_not_found = (found == 0);
- return offset;
- }
-}
-
-#define timelib_split_free(arg) { \
- int i; \
- for (i = 0; i < arg.c; i++) { \
- free(arg.v[i]); \
- } \
- if (arg.v) { \
- free(arg.v); \
- } \
-}
-
-static int scan(Scanner *s)
-{
- uchar *cursor = s->cur;
- char *str, *ptr = NULL;
-
-std:
- s->tok = cursor;
- s->len = 0;
-/*!re2c
-any = [\000-\377];
-
-space = [ ]+;
-frac = "."[0-9]+;
-
-ago = 'ago';
-
-hour24 = [01]?[0-9] | "2"[0-3];
-hour24lz = [01][0-9] | "2"[0-3];
-hour12 = "0"?[1-9] | "1"[0-2];
-minute = [0-5]?[0-9];
-minutelz = [0-5][0-9];
-second = minute | "60";
-secondlz = minutelz | "60";
-meridian = [AaPp] "."? [Mm] "."?;
-tz = [A-Za-z]{1,4} | [A-Z][a-z]+([_/][A-Z][a-z]+)+;
-tzcorrection = [+-] hour24 ":"? minutelz?;
-
-month = "0"? [0-9] | "1"[0-2];
-day = [0-2]?[0-9] | "3"[01];
-year = [0-9]{1,4};
-year2 = [0-9]{2};
-year4 = [0-9]{4};
-
-dayofyear = "00"[1-9] | "0"[1-9][0-9] | [1-2][0-9][0-9] | "3"[0-5][0-9] | "36"[0-6];
-weekofyear = "0"[1-9] | [1-4][0-9] | "5"[0-3];
-
-monthlz = "0" [1-9] | "1" [0-2];
-daylz = "0" [1-9] | [1-2][0-9] | "3" [01];
-
-dayfull = 'sunday' | 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday';
-dayabbr = 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat' | 'sun';
-daytext = dayfull | dayabbr;
-
-monthfull = 'january' | 'february' | 'march' | 'april' | 'may' | 'june' | 'july' | 'august' | 'september' | 'october' | 'november' | 'december';
-monthabbr = 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec';
-monthroman = "I" | "II" | "III" | "IV" | "V" | "VI" | "VII" | "VIII" | "IX" | "X" | "XI" | "XII";
-monthtext = monthfull | monthabbr | monthroman;
-
-/* Time formats */
-timeshort12 = hour12[:.]minutelz space? meridian;
-timelong12 = hour12[:.]minute[:.]secondlz space? meridian;
-
-timeshort24 = hour24[:.]minute;
-timelong24 = hour24[:.]minute[:.]second;
-iso8601long = hour24 [:.] minute [:.] second frac;
-
-/* iso8601shorttz = hour24 [:] minutelz space? (tzcorrection | tz); */
-iso8601normtz = hour24 [:.] minute [:.] secondlz space? (tzcorrection | tz);
-/* iso8601longtz = hour24 [:] minute [:] secondlz frac space? (tzcorrection | tz); */
-
-gnunocolon = hour24lz minutelz;
-/* gnunocolontz = hour24lz minutelz space? (tzcorrection | tz); */
-iso8601nocolon = hour24lz minutelz secondlz;
-/* iso8601nocolontz = hour24lz minutelz secondlz space? (tzcorrection | tz); */
-
-/* Date formats */
-americanshort = month "/" day;
-american = month "/" day "/" year;
-iso8601dateslash = year4 "/" monthlz "/" daylz "/"?;
-dateslash = year4 "/" month "/" day;
-gnudateshort = year "-" month "-" day;
-iso8601date = year4 "-" monthlz "-" daylz;
-pointeddate = day "." month "." year;
-datefull = day ([ -.])* monthtext ([ -.])* year;
-datenoday = monthtext ([ -.])* year4;
-datenodayrev = year4 ([ -.])* monthtext;
-datetextual = monthtext ([ -.])* day [,.stndrh ]* year;
-datenoyear = monthtext ([ -.])* day [,.stndrh ]*;
-datenoyearrev = day ([ -.])* monthtext;
-datenocolon = year4 monthlz daylz;
-
-/* Special formats */
-soap = year4 "-" monthlz "-" daylz "T" hour24lz ":" minutelz ":" secondlz frac tzcorrection;
-xmlrpc = year4 monthlz daylz "T" hour24 ":" minutelz ":" secondlz;
-xmlrpcnocolon = year4 monthlz daylz 't' hour24 minutelz secondlz;
-wddx = year4 "-" monthlz "-" daylz "T" hour24 ":" minutelz ":" secondlz;
-pgydotd = year4 "."? dayofyear;
-pgtextshort = monthabbr "-" daylz "-" year;
-pgtextreverse = year "-" monthabbr "-" daylz;
-isoweekday = year4 "W" weekofyear [0-7];
-isoweek = year4 "W" weekofyear;
-
-/* Common Log Format: 10/Oct/2000:13:55:36 -0700 */
-clf = day "/" monthabbr "/" year4 ":" hour24lz ":" minutelz ":" secondlz space tzcorrection;
-
-/* Timestamp format: @1126396800 */
-timestamp = "@" "-"? [1-9] [0-9]*;
-
-/* To fix some ambiguities */
-dateshortwithtimeshort = datenoyear timeshort24;
-dateshortwithtimelong = datenoyear timelong24;
-dateshortwithtimelongtz = datenoyear iso8601normtz;
-
-/*
- * Relative regexps
- */
-reltextnumber = 'first'|'next'|'second'|'third'|'fourth'|'fifth'|'sixth'|'seventh'|'eight'|'ninth'|'tenth'|'eleventh'|'twelfth'|'last'|'previous'|'this';
-reltextunit = (('sec'|'second'|'min'|'minute'|'hour'|'day'|'week'|'fortnight'|'forthnight'|'month'|'year') 's'?) | dayfull;
-
-relnumber = ([+-]?[0-9]+);
-relative = (relnumber space? reltextunit)+;
-relativetext = (reltextnumber space? reltextunit)+;
-
-*/
-
-/*!re2c
- /* so that vim highlights correctly */
- "yesterday"
- {
- DEBUG_OUTPUT("yesterday");
- TIMELIB_INIT;
- TIMELIB_HAVE_RELATIVE();
- TIMELIB_UNHAVE_TIME();
-
- s->time->relative.d = -1;
- TIMELIB_DEINIT;
- return TIMELIB_RELATIVE;
- }
-
- "now"
- {
- DEBUG_OUTPUT("now");
- TIMELIB_INIT;
-
- TIMELIB_DEINIT;
- return TIMELIB_RELATIVE;
- }
-
- "today"
- {
- DEBUG_OUTPUT("today");
- TIMELIB_INIT;
- TIMELIB_UNHAVE_TIME();
-
- TIMELIB_DEINIT;
- return TIMELIB_RELATIVE;
- }
-
- "tomorrow"
- {
- DEBUG_OUTPUT("tomorrow");
- TIMELIB_INIT;
- TIMELIB_HAVE_RELATIVE();
- TIMELIB_UNHAVE_TIME();
-
- s->time->relative.d = 1;
- TIMELIB_DEINIT;
- return TIMELIB_RELATIVE;
- }
-
- timestamp
- {
- timelib_ull i;
-
- TIMELIB_INIT;
- TIMELIB_HAVE_RELATIVE();
- TIMELIB_UNHAVE_DATE();
- TIMELIB_UNHAVE_TIME();
-
- i = timelib_get_unsigned_nr((char **) &ptr, 24);
- s->time->y = 1970;
- s->time->m = 1;
- s->time->d = 1;
- s->time->h = s->time->i = s->time->s = 0;
- s->time->f = 0.0;
- s->time->relative.s += i;
- s->time->is_localtime = 1;
- s->time->zone_type = TIMELIB_ZONETYPE_OFFSET;
- s->time->z = 0;
-
- TIMELIB_DEINIT;
- return TIMELIB_RELATIVE;
- }
-
- timeshort12 | timelong12
- {
- DEBUG_OUTPUT("timeshort12 | timelong12");
- TIMELIB_INIT;
- TIMELIB_HAVE_TIME();
- s->time->h = timelib_get_nr((char **) &ptr, 2);
- s->time->i = timelib_get_nr((char **) &ptr, 2);
- if (*ptr == ':') {
- s->time->s = timelib_get_nr((char **) &ptr, 2);
- }
- s->time->h += timelib_meridian((char **) &ptr, s->time->h);
- TIMELIB_DEINIT;
- return TIMELIB_TIME12;
- }
-
- timeshort24 | timelong24 /* | iso8601short | iso8601norm */ | iso8601long /*| iso8601shorttz | iso8601normtz | iso8601longtz*/
- {
- int tz_not_found;
- DEBUG_OUTPUT("timeshort24 | timelong24 | iso8601long");
- TIMELIB_INIT;
- TIMELIB_HAVE_TIME();
- s->time->h = timelib_get_nr((char **) &ptr, 2);
- s->time->i = timelib_get_nr((char **) &ptr, 2);
- if (*ptr == ':' || *ptr == '.') {
- s->time->s = timelib_get_nr((char **) &ptr, 2);
-
- if (*ptr == '.') {
- s->time->f = timelib_get_frac_nr((char **) &ptr, 8);
- }
- }
-
- if (*ptr != '\0') {
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found);
- s->errors += tz_not_found;
- }
- TIMELIB_DEINIT;
- return TIMELIB_TIME24_WITH_ZONE;
- }
-
- gnunocolon
- {
- DEBUG_OUTPUT("gnunocolon");
- TIMELIB_INIT;
- switch (s->time->have_time) {
- case 0:
- s->time->h = timelib_get_nr((char **) &ptr, 2);
- s->time->i = timelib_get_nr((char **) &ptr, 2);
- s->time->s = 0;
- break;
- case 1:
- s->time->y = timelib_get_nr((char **) &ptr, 4);
- break;
- default:
- TIMELIB_DEINIT;
- return TIMELIB_ERROR;
- }
- s->time->have_time++;
- TIMELIB_DEINIT;
- return TIMELIB_GNU_NOCOLON;
- }
-/*
- gnunocolontz
- {
- DEBUG_OUTPUT("gnunocolontz");
- TIMELIB_INIT;
- switch (s->time->have_time) {
- case 0:
- s->time->h = timelib_get_nr((char **) &ptr, 2);
- s->time->i = timelib_get_nr((char **) &ptr, 2);
- s->time->s = 0;
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time);
- break;
- case 1:
- s->time->y = timelib_get_nr((char **) &ptr, 4);
- break;
- default:
- TIMELIB_DEINIT;
- return TIMELIB_ERROR;
- }
- s->time->have_time++;
- TIMELIB_DEINIT;
- return TIMELIB_GNU_NOCOLON_TZ;
- }
-*/
- iso8601nocolon /*| iso8601nocolontz*/
- {
- int tz_not_found;
- DEBUG_OUTPUT("iso8601nocolon");
- TIMELIB_INIT;
- TIMELIB_HAVE_TIME();
- s->time->h = timelib_get_nr((char **) &ptr, 2);
- s->time->i = timelib_get_nr((char **) &ptr, 2);
- s->time->s = timelib_get_nr((char **) &ptr, 2);
-
- if (*ptr != '\0') {
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found);
- s->errors += tz_not_found;
- }
- TIMELIB_DEINIT;
- return TIMELIB_ISO_NOCOLON;
- }
-
- americanshort | american
- {
- DEBUG_OUTPUT("americanshort | american");
- TIMELIB_INIT;
- TIMELIB_HAVE_DATE();
- s->time->m = timelib_get_nr((char **) &ptr, 2);
- s->time->d = timelib_get_nr((char **) &ptr, 2);
- if (*ptr == '/') {
- s->time->y = timelib_get_nr((char **) &ptr, 4);
- TIMELIB_PROCESS_YEAR(s->time->y);
- }
- TIMELIB_DEINIT;
- return TIMELIB_AMERICAN;
- }
-
- iso8601date | iso8601dateslash | dateslash
- {
- DEBUG_OUTPUT("iso8601date | iso8601dateslash | dateslash");
- TIMELIB_INIT;
- TIMELIB_HAVE_DATE();
- s->time->y = timelib_get_nr((char **) &ptr, 4);
- s->time->m = timelib_get_nr((char **) &ptr, 2);
- s->time->d = timelib_get_nr((char **) &ptr, 2);
- TIMELIB_DEINIT;
- return TIMELIB_ISO_DATE;
- }
-
- gnudateshort
- {
- DEBUG_OUTPUT("gnudateshort");
- TIMELIB_INIT;
- TIMELIB_HAVE_DATE();
- s->time->y = timelib_get_nr((char **) &ptr, 4);
- s->time->m = timelib_get_nr((char **) &ptr, 2);
- s->time->d = timelib_get_nr((char **) &ptr, 2);
- TIMELIB_PROCESS_YEAR(s->time->y);
- TIMELIB_DEINIT;
- return TIMELIB_ISO_DATE;
- }
-
- datefull
- {
- DEBUG_OUTPUT("datefull");
- TIMELIB_INIT;
- TIMELIB_HAVE_DATE();
- s->time->d = timelib_get_nr((char **) &ptr, 2);
- s->time->m = timelib_get_month((char **) &ptr);
- s->time->y = timelib_get_nr((char **) &ptr, 4);
- TIMELIB_PROCESS_YEAR(s->time->y);
- TIMELIB_DEINIT;
- return TIMELIB_DATE_FULL;
- }
-
- pointeddate
- {
- DEBUG_OUTPUT("pointed date");
- TIMELIB_INIT;
- TIMELIB_HAVE_DATE();
- s->time->d = timelib_get_nr((char **) &ptr, 2);
- s->time->m = timelib_get_nr((char **) &ptr, 2);
- s->time->y = timelib_get_nr((char **) &ptr, 4);
- TIMELIB_PROCESS_YEAR(s->time->y);
- TIMELIB_DEINIT;
- return TIMELIB_DATE_FULL_POINTED;
- }
-
- datenoday
- {
- DEBUG_OUTPUT("datenoday");
- TIMELIB_INIT;
- TIMELIB_HAVE_DATE();
- s->time->m = timelib_get_month((char **) &ptr);
- s->time->y = timelib_get_nr((char **) &ptr, 4);
- s->time->d = 1;
- TIMELIB_PROCESS_YEAR(s->time->y);
- TIMELIB_DEINIT;
- return TIMELIB_DATE_NO_DAY;
- }
-
- datenodayrev
- {
- DEBUG_OUTPUT("datenodayrev");
- TIMELIB_INIT;
- TIMELIB_HAVE_DATE();
- s->time->y = timelib_get_nr((char **) &ptr, 4);
- s->time->m = timelib_get_month((char **) &ptr);
- s->time->d = 1;
- TIMELIB_PROCESS_YEAR(s->time->y);
- TIMELIB_DEINIT;
- return TIMELIB_DATE_NO_DAY;
- }
-
- datetextual | datenoyear
- {
- DEBUG_OUTPUT("datetextual | datenoyear");
- TIMELIB_INIT;
- TIMELIB_HAVE_DATE();
- s->time->m = timelib_get_month((char **) &ptr);
- s->time->d = timelib_get_nr((char **) &ptr, 2);
- s->time->y = timelib_get_nr((char **) &ptr, 4);
- TIMELIB_PROCESS_YEAR(s->time->y);
- TIMELIB_DEINIT;
- return TIMELIB_DATE_TEXT;
- }
-
- datenoyearrev
- {
- DEBUG_OUTPUT("datenoyearrev");
- TIMELIB_INIT;
- TIMELIB_HAVE_DATE();
- s->time->d = timelib_get_nr((char **) &ptr, 2);
- s->time->m = timelib_get_month((char **) &ptr);
- TIMELIB_DEINIT;
- return TIMELIB_DATE_TEXT;
- }
-
- datenocolon
- {
- DEBUG_OUTPUT("datenocolon");
- TIMELIB_INIT;
- TIMELIB_HAVE_DATE();
- s->time->y = timelib_get_nr((char **) &ptr, 4);
- s->time->m = timelib_get_nr((char **) &ptr, 2);
- s->time->d = timelib_get_nr((char **) &ptr, 2);
- TIMELIB_DEINIT;
- return TIMELIB_DATE_NOCOLON;
- }
-
- xmlrpc | xmlrpcnocolon | soap | wddx
- {
- int tz_not_found;
- DEBUG_OUTPUT("xmlrpc | xmlrpcnocolon | soap | wddx");
- TIMELIB_INIT;
- TIMELIB_HAVE_TIME();
- TIMELIB_HAVE_DATE();
- s->time->y = timelib_get_nr((char **) &ptr, 4);
- s->time->m = timelib_get_nr((char **) &ptr, 2);
- s->time->d = timelib_get_nr((char **) &ptr, 2);
- s->time->h = timelib_get_nr((char **) &ptr, 2);
- s->time->i = timelib_get_nr((char **) &ptr, 2);
- s->time->s = timelib_get_nr((char **) &ptr, 2);
- if (*ptr == '.') {
- s->time->f = timelib_get_frac_nr((char **) &ptr, 9);
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found);
- s->errors += tz_not_found;
- }
- TIMELIB_DEINIT;
- return TIMELIB_XMLRPC_SOAP;
- }
-
- pgydotd
- {
- DEBUG_OUTPUT("pgydotd");
- TIMELIB_INIT;
- TIMELIB_HAVE_DATE();
- s->time->y = timelib_get_nr((char **) &ptr, 4);
- s->time->d = timelib_get_nr((char **) &ptr, 3);
- s->time->m = 1;
- TIMELIB_PROCESS_YEAR(s->time->y);
- TIMELIB_DEINIT;
- return TIMELIB_PG_YEARDAY;
- }
-
- isoweekday
- {
- timelib_sll w, d;
- DEBUG_OUTPUT("isoweekday");
- TIMELIB_INIT;
- TIMELIB_HAVE_DATE();
- TIMELIB_HAVE_RELATIVE();
-
- s->time->y = timelib_get_nr((char **) &ptr, 4);
- w = timelib_get_nr((char **) &ptr, 2);
- d = timelib_get_nr((char **) &ptr, 1);
- s->time->m = 1;
- s->time->d = 1;
- s->time->relative.d = timelib_daynr_from_weeknr(s->time->y, w, d);
-
- TIMELIB_DEINIT;
- return TIMELIB_ISO_WEEK;
- }
-
- isoweek
- {
- timelib_sll w, d;
- DEBUG_OUTPUT("isoweek");
- TIMELIB_INIT;
- TIMELIB_HAVE_DATE();
- TIMELIB_HAVE_RELATIVE();
-
- s->time->y = timelib_get_nr((char **) &ptr, 4);
- w = timelib_get_nr((char **) &ptr, 2);
- d = 1;
- s->time->m = 1;
- s->time->d = 1;
- s->time->relative.d = timelib_daynr_from_weeknr(s->time->y, w, d);
-
- TIMELIB_DEINIT;
- return TIMELIB_ISO_WEEK;
- }
-
- pgtextshort
- {
- DEBUG_OUTPUT("pgtextshort");
- TIMELIB_INIT;
- TIMELIB_HAVE_DATE();
- s->time->m = timelib_get_month((char **) &ptr);
- s->time->d = timelib_get_nr((char **) &ptr, 2);
- s->time->y = timelib_get_nr((char **) &ptr, 4);
- TIMELIB_PROCESS_YEAR(s->time->y);
- TIMELIB_DEINIT;
- return TIMELIB_PG_TEXT;
- }
-
- pgtextreverse
- {
- DEBUG_OUTPUT("pgtextreverse");
- TIMELIB_INIT;
- TIMELIB_HAVE_DATE();
- s->time->y = timelib_get_nr((char **) &ptr, 4);
- s->time->m = timelib_get_month((char **) &ptr);
- s->time->d = timelib_get_nr((char **) &ptr, 2);
- TIMELIB_PROCESS_YEAR(s->time->y);
- TIMELIB_DEINIT;
- return TIMELIB_PG_TEXT;
- }
-
- clf
- {
- int tz_not_found;
- DEBUG_OUTPUT("clf");
- TIMELIB_INIT;
- TIMELIB_HAVE_TIME();
- TIMELIB_HAVE_DATE();
- s->time->d = timelib_get_nr((char **) &ptr, 2);
- s->time->m = timelib_get_month((char **) &ptr);
- s->time->y = timelib_get_nr((char **) &ptr, 4);
- s->time->h = timelib_get_nr((char **) &ptr, 2);
- s->time->i = timelib_get_nr((char **) &ptr, 2);
- s->time->s = timelib_get_nr((char **) &ptr, 2);
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found);
- s->errors += tz_not_found;
- TIMELIB_DEINIT;
- return TIMELIB_CLF;
- }
-
- year4
- {
- DEBUG_OUTPUT("year4");
- TIMELIB_INIT;
- s->time->y = timelib_get_nr((char **) &ptr, 4);
- TIMELIB_DEINIT;
- return TIMELIB_CLF;
- }
-
- ago
- {
- DEBUG_OUTPUT("ago");
- TIMELIB_INIT;
- s->time->relative.y = 0 - s->time->relative.y;
- s->time->relative.m = 0 - s->time->relative.m;
- s->time->relative.d = 0 - s->time->relative.d;
- s->time->relative.h = 0 - s->time->relative.h;
- s->time->relative.i = 0 - s->time->relative.i;
- s->time->relative.s = 0 - s->time->relative.s;
- s->time->relative.weekday = 0 - s->time->relative.weekday;
- TIMELIB_DEINIT;
- return TIMELIB_AGO;
- }
-
- relativetext
- {
- timelib_sll i;
- DEBUG_OUTPUT("relativetext");
- TIMELIB_INIT;
- TIMELIB_HAVE_RELATIVE();
-
- while(*ptr) {
- i = timelib_get_relative_text((char **) &ptr);
- timelib_eat_spaces((char **) &ptr);
- timelib_set_relative((char **) &ptr, i, s);
- }
- TIMELIB_DEINIT;
- return TIMELIB_RELATIVE;
- }
-
- dayfull
- {
- const timelib_relunit* relunit;
- DEBUG_OUTPUT("dayfull");
- TIMELIB_INIT;
- TIMELIB_HAVE_RELATIVE();
- TIMELIB_HAVE_WEEKDAY_RELATIVE();
- TIMELIB_UNHAVE_TIME();
-
- relunit = timelib_lookup_relunit((char**) &ptr);
- s->time->relative.weekday = relunit->multiplier;
-
- TIMELIB_DEINIT;
- return TIMELIB_RELATIVE;
- }
-
- dayabbr
- {
- DEBUG_OUTPUT("dayabbr");
- goto std;
- }
-
- tzcorrection | tz
- {
- int tz_not_found;
- DEBUG_OUTPUT("tzcorrection | tz");
- TIMELIB_INIT;
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found);
- s->errors += tz_not_found;
- TIMELIB_DEINIT;
- return TIMELIB_TIMEZONE;
- }
-
- dateshortwithtimeshort | dateshortwithtimelong | dateshortwithtimelongtz
- {
- int tz_not_found;
- DEBUG_OUTPUT("dateshortwithtimeshort | dateshortwithtimelong | dateshortwithtimelongtz");
- TIMELIB_INIT;
- TIMELIB_HAVE_DATE();
- s->time->m = timelib_get_month((char **) &ptr);
- s->time->d = timelib_get_nr((char **) &ptr, 2);
-
- TIMELIB_HAVE_TIME();
- s->time->h = timelib_get_nr((char **) &ptr, 2);
- s->time->i = timelib_get_nr((char **) &ptr, 2);
- if (*ptr == ':') {
- s->time->s = timelib_get_nr((char **) &ptr, 2);
-
- if (*ptr == '.') {
- s->time->f = timelib_get_frac_nr((char **) &ptr, 8);
- }
- }
-
- if (*ptr != '\0') {
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found);
- s->errors += tz_not_found;
- }
- TIMELIB_DEINIT;
- return TIMELIB_SHORTDATE_WITH_TIME;
- }
-
- relative
- {
- timelib_ull i;
- DEBUG_OUTPUT("relative");
- TIMELIB_INIT;
- TIMELIB_HAVE_RELATIVE();
-
- while(*ptr) {
- i = timelib_get_unsigned_nr((char **) &ptr, 24);
- timelib_eat_spaces((char **) &ptr);
- timelib_set_relative((char **) &ptr, i, s);
- }
- TIMELIB_DEINIT;
- return TIMELIB_RELATIVE;
- }
-
- [ .,]
- {
- goto std;
- }
-
- "\000"|"\n"
- {
- s->pos = cursor; s->line++;
- goto std;
- }
-
- any
- {
-/* printf("unexpected character: #%d, %c ", *s->tok, *s->tok); */
- s->errors++;
- goto std;
- }
-*/
-}
-
-/*!max:re2c */
-
-timelib_time* timelib_strtotime(char *s, int *errors)
-{
- Scanner in;
- int t;
-
- memset(&in, 0, sizeof(in));
- in.str = malloc(strlen(s) + YYMAXFILL);
- memset(in.str, 0, strlen(s) + YYMAXFILL);
- memcpy(in.str, s, strlen(s));
- in.lim = in.str + strlen(s) + YYMAXFILL;
- in.cur = in.str;
- in.time = timelib_time_ctor();
- in.time->y = -1;
- in.time->d = -1;
- in.time->m = -1;
- in.time->h = -1;
- in.time->i = -1;
- in.time->s = -1;
- in.time->f = -1;
- in.time->z = -1;
- in.time->dst = -1;
- in.errors = 0;
-
- do {
- t = scan(&in);
-#ifdef DEBUG_PARSER
- printf("%d\n", t);
-#endif
- } while(t != EOI);
-
- free(in.str);
- *errors = in.errors;
- return in.time;
-}
-
-void timelib_fill_holes(timelib_time *parsed, timelib_time *now, int options)
-{
- if (!(options && TIMELIB_OVERRIDE_TIME) && parsed->have_date && !parsed->have_time) {
- parsed->h = 0;
- parsed->i = 0;
- parsed->s = 0;
- parsed->f = 0;
- }
- if (parsed->y == -1) parsed->y = now->y != -1 ? now->y : 0;
- if (parsed->d == -1) parsed->d = now->d != -1 ? now->d : 0;
- if (parsed->m == -1) parsed->m = now->m != -1 ? now->m : 0;
- if (parsed->h == -1) parsed->h = now->h != -1 ? now->h : 0;
- if (parsed->i == -1) parsed->i = now->i != -1 ? now->i : 0;
- if (parsed->s == -1) parsed->s = now->s != -1 ? now->s : 0;
- if (parsed->f == -1) parsed->f = now->f != -1 ? now->f : 0;
- if (parsed->z == -1) parsed->z = now->z != -1 ? now->z : 0;
- if (parsed->dst == -1) parsed->dst = now->dst != -1 ? now->dst : 0;
-
- if (!parsed->tz_abbr) {
- parsed->tz_abbr = now->tz_abbr ? strdup(now->tz_abbr) : NULL;
- }
- if (!parsed->tz_info) {
- parsed->tz_info = now->tz_info ? timelib_tzinfo_clone(now->tz_info) : NULL;
- }
- if (parsed->zone_type == 0 && now->zone_type != 0) {
- parsed->zone_type = now->zone_type;
-/* parsed->tz_abbr = now->tz_abbr ? strdup(now->tz_abbr) : NULL;
- parsed->tz_info = now->tz_info ? timelib_tzinfo_clone(now->tz_info) : NULL;
-*/ parsed->is_localtime = 1;
- }
-/* timelib_dump_date(parsed, 2);
- timelib_dump_date(now, 2);
-*/
-}
-
-char *timelib_timezone_id_from_abbr(const char *abbr)
-{
- timelib_tz_lookup_table *tp;
-
- tp = zone_search(abbr, 0, sizeof(timelib_timezone_lookup) / sizeof(*timelib_timezone_lookup) - 1);
- if (tp) {
- return (tp->full_tz_name);
- } else {
- return NULL;
- }
-}
-
-timelib_tz_lookup_table *timelib_timezone_abbreviations_list(void)
-{
- return timelib_timezone_lookup;
-}
-
-#ifdef DEBUG_PARSER_STUB
-int main(void)
-{
- timelib_time time = timelib_strtotime("May 12");
-
- printf ("%04d-%02d-%02d %02d:%02d:%02d.%-5d %+04d %1d",
- time.y, time.m, time.d, time.h, time.i, time.s, time.f, time.z, time.dst);
- if (time.have_relative) {
- printf ("%3dY %3dM %3dD / %3dH %3dM %3dS",
- time.relative.y, time.relative.m, time.relative.d, time.relative.h, time.relative.i, time.relative.s);
- }
- if (time.have_weekday_relative) {
- printf (" / %d", time.relative.weekday);
- }
- if (time.have_weeknr_day) {
- printf(" / %dW%d", time.relative.weeknr_day.weeknr, time.relative.weeknr_day.dayofweek);
- }
- return 0;
-}
-#endif
-
-/*
- * vim: syntax=c
- */