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_randf(value_t *args, u_int32_t nargs) { (void)args; (void)nargs; return mk_float(rand_float()); }
static lisp_cell_t *subr_fma(lisp_t *l, lisp_cell_t *args) { return mk_float(l, fma(get_a2f(car(args)), get_a2f(CADR(args)), get_a2f(CADDR(args)))); }