Browse Source

Reintroducing libstdio, adding standard varargs (#741)

Signed-off-by: Álvaro Jurado <elbingmiss@gmail.com>
Álvaro Jurado 6 years ago
parent
commit
4e140b2273
3 changed files with 22 additions and 76 deletions
  1. 0 63
      sys/src/libstdio/dtoa.c
  2. 11 8
      sys/src/libstdio/vfprintf.c
  3. 11 5
      sys/src/libstdio/vfscanf.c

+ 0 - 63
sys/src/libstdio/dtoa.c

@@ -489,46 +489,6 @@ diff(Bigint *a, Bigint *b)
 	return c;
 }
 
-static double	
-ulp(double x)
-{
-	uint32_t L;
-	Ulongs uls;
-
-	uls = double2ulongs(x);
-	L = (uls.hi & Exp_mask) - (P - 1) * Exp_msk1;
-	return ulongs2double((Ulongs){L, 0});
-}
-
-static double	
-b2d(Bigint *a, int *e)
-{
-	unsigned *xa, *xa0, w, y, z;
-	int	k;
-	uint32_t d0, d1;
-
-	xa0 = a->x;
-	xa = xa0 + a->wds;
-	y = *--xa;
-	k = hi0bits(y);
-	*e = 32 - k;
-	if (k < Ebits) {
-		w = xa > xa0 ? *--xa : 0;
-		d1 = y << (32 - Ebits) + k | w >> Ebits - k;
-		return ulongs2double((Ulongs){Exp_1 | y >> Ebits - k, d1});
-	}
-	z = xa > xa0 ? *--xa : 0;
-	if (k -= Ebits) {
-		d0 = Exp_1 | y << k | z >> 32 - k;
-		y = xa > xa0 ? *--xa : 0;
-		d1 = z << k | y >> 32 - k;
-	} else {
-		d0 = Exp_1 | y;
-		d1 = z;
-	}
-	return ulongs2double((Ulongs){d0, d1});
-}
-
 static Bigint *
 d2b(double d, int *e, int *bits)
 {
@@ -564,29 +524,6 @@ d2b(double d, int *e, int *bits)
 	return b;
 }
 
-static double	
-ratio(Bigint *a, Bigint *b)
-{
-	double	da, db;
-	int	k, ka, kb;
-	Ulongs uls;
-
-	da = b2d(a, &ka);
-	db = b2d(b, &kb);
-	k = ka - kb + 32 * (a->wds - b->wds);
-	if (k > 0) {
-		uls = double2ulongs(da);
-		uls.hi += k * Exp_msk1;
-		da = ulongs2double(uls);
-	} else {
-		k = -k;
-		uls = double2ulongs(db);
-		uls.hi += k * Exp_msk1;
-		db = ulongs2double(uls);
-	}
-	return da / db;
-}
-
 static const double
 tens[] = {
 	1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,

+ 11 - 8
sys/src/libstdio/vfprintf.c

@@ -158,10 +158,11 @@ int
 vfprintf(FILE *f, const char *s, va_list args)
 {
 	int flags, width, precision;
+	va_list arg;
 
 	qlock(&_stdiolk);
 
-//	va_copy(args, args_pointer);
+	va_copy(arg, args);
 
 	nprint = 0;
 	while(*s){
@@ -174,7 +175,7 @@ vfprintf(FILE *f, const char *s, va_list args)
 		flags = 0;
 		while(lflag[*s&_IO_CHMASK]) flags |= lflag[*s++&_IO_CHMASK];
 		if(*s == '*'){
-			width = va_arg(args, int);
+			width = va_arg(arg, int);
 			s++;
 			if(width<0){
 				flags |= LEFT;
@@ -188,7 +189,7 @@ vfprintf(FILE *f, const char *s, va_list args)
 		if(*s == '.'){
 			s++;
 			if(*s == '*'){
-				precision = va_arg(args, int);
+				precision = va_arg(arg, int);
 				s++;
 			}
 			else{
@@ -199,13 +200,15 @@ vfprintf(FILE *f, const char *s, va_list args)
 		else
 			precision = -1;
 		while(tflag[*s&_IO_CHMASK]) flags |= tflag[*s++&_IO_CHMASK];
-		if(ocvt[*s]) nprint += (*ocvt[*s++])(f, &args, flags, width, precision);
+		if(ocvt[(uint8_t)(*s)])
+			nprint += (*ocvt[(uint8_t)(*s++)])(f, &arg, flags, width, precision);
 		else if(*s){
 			putc(*s++, f);
 			nprint++;
 		}
 	}
 
+	va_end(arg);
 	qunlock(&_stdiolk);
 
 	if(ferror(f)){
@@ -304,8 +307,8 @@ ocvt_fixed(FILE *f, va_list *args, int flags, int width, int precision,
 	int nout, npad, nlzero;
 
 	if(sgned){
-		if(flags&PTR) snum = (int32_t)va_arg(*args, void *);
-		else if(flags&SHORT) snum = va_arg(*args, int16_t);
+		if(flags&PTR) snum = (uintptr_t)va_arg(*args, void *);
+		else if(flags&SHORT) snum = va_arg(*args, int);
 		else if(flags&LONG) snum = va_arg(*args, int32_t);
 		else snum = va_arg(*args, int);
 		if(snum < 0){
@@ -319,8 +322,8 @@ ocvt_fixed(FILE *f, va_list *args, int flags, int width, int precision,
 		}
 	} else {
 		sign = "";
-		if(flags&PTR) num = (int32_t)va_arg(*args, void *);
-		else if(flags&SHORT) num = va_arg(*args, unsigned short);
+		if(flags&PTR) num = (uintptr_t)va_arg(*args, void *);
+		else if(flags&SHORT) num = va_arg(*args, int);
 		else if(flags&LONG) num = va_arg(*args, unsigned long);
 		else num = va_arg(*args, unsigned int);
 	}

+ 11 - 5
sys/src/libstdio/vfscanf.c

@@ -68,6 +68,9 @@ static const char *fmtp;
 
 int vfscanf(FILE *f, const char *s, va_list args){
 	int c, width, type, store;
+	va_list arg;
+
+	va_copy(arg, args);
 	nread=0;
 	ncvt=0;
 	fmtp=s;
@@ -77,15 +80,16 @@ int vfscanf(FILE *f, const char *s, va_list args){
 			do
 				c=ngetc(f);
 			while(isspace(c));
-			if(c==EOF) return ncvt?ncvt:EOF;
+			if(c==EOF) va_end(arg); return ncvt?ncvt:EOF;
 			nungetc(c, f);
 			break;
 		}
 	NonSpecial:
 		c=ngetc(f);
-		if(c==EOF) return ncvt?ncvt:EOF;
+		if(c==EOF) va_end(arg); return ncvt?ncvt:EOF;
 		if(c!=*fmtp){
 			nungetc(c, f);
+			va_end(arg);
 			return ncvt;
 		}
 		break;
@@ -103,13 +107,15 @@ int vfscanf(FILE *f, const char *s, va_list args){
 		else
 			width=-1;
 		type=*fmtp=='h' || *fmtp=='l' || *fmtp=='L'?*fmtp++:'n';
-		if(!icvt[*fmtp]) goto NonSpecial;
-		if(!(*icvt[*fmtp])(f, &args, store, width, type))
+		if(!icvt[(uint8_t)(*fmtp)]) goto NonSpecial;
+		if(!(*icvt[(uint8_t)(*fmtp)])(f, &arg, store, width, type)){
+			va_end(arg);
 			return ncvt?ncvt:EOF;
+		}
 		if(*fmtp=='\0') break;
 		if(store) ncvt++;
 	}
-	va_end(args);
+	va_end(arg);
 	return ncvt;
 }
 static int icvt_n(FILE *f, va_list *args, int store, int width, int type){