int isnumtok_base(char *tok, value_t *pval, int base) { char *end; int64_t i64; uint64_t ui64; double d; if (*tok == '\0') return 0; if (!((tok[0]=='0' && tok[1]=='x') || (base >= 15)) && strpbrk(tok, ".eEpP")) { d = strtod(tok, &end); if (*end == '\0') { if (pval) *pval = mk_double(d); return 1; } // floats can end in f or f0 if (end > tok && end[0] == 'f' && (end[1] == '\0' || (end[1] == '0' && end[2] == '\0'))) { if (pval) *pval = mk_float((float)d); return 1; } } if (tok[0] == '+') { if (!strcmp(tok,"+NaN") || !strcasecmp(tok,"+nan.0")) { if (pval) *pval = mk_double(D_PNAN); return 1; } if (!strcmp(tok,"+Inf") || !strcasecmp(tok,"+inf.0")) { if (pval) *pval = mk_double(D_PINF); return 1; } } else if (tok[0] == '-') { if (!strcmp(tok,"-NaN") || !strcasecmp(tok,"-nan.0")) { if (pval) *pval = mk_double(D_NNAN); return 1; } if (!strcmp(tok,"-Inf") || !strcasecmp(tok,"-inf.0")) { if (pval) *pval = mk_double(D_NINF); return 1; } errno = 0; i64 = strtoll(tok, &end, base); if (errno) return 0; if (pval) *pval = return_from_int64(i64); return (*end == '\0'); } errno = 0; ui64 = strtoull_0b0o(tok, &end, base); if (errno) return 0; if (pval) *pval = return_from_uint64(ui64); return (*end == '\0'); }
static value_t fl_time_fromstring(value_t *args, uint32_t nargs) { argcount("time.fromstring", nargs, 1); char *ptr = tostring(args[0], "time.fromstring"); double t = parsetime(ptr); int64_t it = (int64_t)t; if ((double)it == t && fits_fixnum(it)) return fixnum(it); return mk_double(t); }
static value_t fl_randd(value_t *args, u_int32_t nargs) { (void)args; (void)nargs; return mk_double(rand_double()); }
static value_t fl_time_now(value_t *args, u_int32_t nargs) { argcount("time.now", nargs, 0); (void)args; return mk_double(clock_now()); }