int main() { int i, ntests; ntests = sizeof(good) / sizeof(*good); for (i = 0; i < ntests; i++) { const struct good_t t = good[i]; { dt_t got = 0, exp = 0; size_t glen; glen = dt_parse_iso_date(t.str, strlen(t.str), &got); ok(glen == t.elen, "dt_parse_iso_date(%s) size_t: %d", t.str, (int)glen); exp = dt_from_ymd(t.ey, t.em, t.ed); cmp_ok(got, "==", exp, "dt_parse_iso_date(%s)", t.str); } } ntests = sizeof(bad) / sizeof(*bad); for (i = 0; i < ntests; i++) { const struct bad_t t = bad[i]; { dt_t got = 0; size_t glen; glen = dt_parse_iso_date(t.str, strlen(t.str), &got); ok(glen == 0, "dt_parse_iso_date(%s) size_t: %d", t.str, (int)glen); } } done_testing(); }
static int parse_string_strict(const char *str, size_t len, int64_t *sp, IV *np, IV *op) { size_t n; dt_t dt; int sod, nanosecond, offset; bool extended; n = dt_parse_iso_date(str, len, &dt); if (!n || n == len) return 1; /* * 0123456789 * 2012-12-14 */ extended = str[4] == '-'; if (str[n++] != 'T') return 1; str += n; len -= n; if (extended) n = dt_parse_iso_time_extended(str, len, &sod, &nanosecond); else n = dt_parse_iso_time_basic(str, len, &sod, &nanosecond); if (!n || n == len) return 1; str += n; len -= n; if (extended) n = dt_parse_iso_zone_extended(str, len, &offset); else n = dt_parse_iso_zone_basic(str, len, &offset); if (!n || n != len) return 1; *sp = ((int64_t)dt_rdn(dt) - 719163) * 86400 + sod - offset * 60; *np = nanosecond; *op = offset; return 0; }
static int parse_string_lenient(const char *str, size_t len, int64_t *sp, IV *np, IV *op) { size_t n; dt_t dt; char c; int sod, nanosecond, offset; n = dt_parse_iso_date(str, len, &dt); if (!n || n == len) return 1; c = str[n++]; if (!(c == 'T' || c == 't' || c == ' ')) return 1; str += n; len -= n; n = dt_parse_iso_time(str, len, &sod, &nanosecond); if (!n || n == len) return 1; if (str[n] == ' ') n++; str += n; len -= n; n = dt_parse_iso_zone_lenient(str, len, &offset); if (!n || n != len) return 1; *sp = ((int64_t)dt_rdn(dt) - 719163) * 86400 + sod - offset * 60; *np = nanosecond; *op = offset; return 0; }