Example #1
0
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();
}
Example #2
0
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;
}
Example #3
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;
}