MAIN() { #if _typ_long_double long double ldval, ldmax; char *s, *str; ldmax = LDBL_MAX; if(!(s = sfprints("%Le",ldmax)) ) terror("sfprints failed1\n"); if(!(str = malloc(strlen(s)+1)) ) terror("Malloc failed\n"); strcpy(str,s); if(sfsscanf(str,"%Le",&ldval) != 1) terror("sfsscanf failed\n"); if(!(s = sfprints("%Le",ldval)) ) terror("sfprints failed2\n"); if(strcmp(s,str) != 0) terror("Bad conversion, expecting %s and getting %s\n",str,s); #endif TSTEXIT(0); }
tmain() { #if _lib_locale char buf[128], cmp[128]; float d; int n, decimal, thousand; struct lconv* lv; setlocale(LC_ALL, ""); if(!(lv = localeconv())) texit(0); decimal = '.'; if(lv->decimal_point && lv->decimal_point[0]) decimal = lv->decimal_point[0]; thousand = 0; if(lv->thousands_sep && lv->thousands_sep[0]) thousand = lv->thousands_sep[0]; if(thousand) sfsprintf(cmp, sizeof(cmp), "1%c000", thousand); else sfsprintf(cmp, sizeof(cmp), "1000"); sfsprintf(buf, sizeof(buf), "%'d", 1000); if(strcmp(buf, cmp) != 0) terror("Bad printing"); if(thousand) sfsprintf(cmp, sizeof(cmp), "1%c000%c10", thousand, decimal); else sfsprintf(cmp, sizeof(cmp), "1000%c10", decimal); d = 0.; if((n = sfsscanf(cmp, "%'f", &d)) != 1) terror("Scan error %d", n); if(d < 1000.099 || d > 1000.101) terror("Bad scanning"); sfsprintf(buf, sizeof(buf), "%.2f", d); if(strcmp(buf, "1000.10") != 0) terror("Deep formatting error"); #endif texit(0); }
static int scan(Expr_t* ex, Exnode_t* expr, void* env, Sfio_t* sp) { Extype_t v; Extype_t u; Fmt_t fmt; int n; if (!sp) { if (expr->data.scan.descriptor) { v = eval(ex, expr->data.scan.descriptor, env); if (expr->data.scan.descriptor->type == STRING) goto get; } else v.integer = 0; if (v.integer < 0 || v.integer >= elementsof(ex->file) || !(sp = ex->file[v.integer]) && !(sp = ex->file[v.integer] = sfnew(NiL, NiL, SF_UNBOUND, v.integer, SF_READ|SF_WRITE))) { exerror("scanf: %d: invalid descriptor", v.integer); return 0; } } get: memset(&fmt, 0, sizeof(fmt)); fmt.fmt.version = SFIO_VERSION; fmt.fmt.extf = scformat; fmt.expr = ex; fmt.env = env; u = eval(ex, expr->data.scan.format, env); fmt.fmt.form = u.string; fmt.actuals = expr->data.scan.args; n = sp ? sfscanf(sp, "%!", &fmt) : sfsscanf(v.string, "%!", &fmt); if (fmt.actuals && !*fmt.fmt.form) exerror("scanf: %s: too many arguments", fmt.actuals->data.operand.left->data.variable.symbol->name); return n; }