diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/stdio/vfprintf.c | 2 | ||||
| -rw-r--r-- | src/stdio/vfwprintf.c | 22 | 
2 files changed, 15 insertions, 9 deletions
diff --git a/src/stdio/vfprintf.c b/src/stdio/vfprintf.c index 2dbdb5e2..7b848080 100644 --- a/src/stdio/vfprintf.c +++ b/src/stdio/vfprintf.c @@ -677,7 +677,7 @@ int vfprintf(FILE *restrict f, const char *restrict fmt, va_list ap)  	FLOCK(f);  	olderr = f->flags & F_ERR; -	if (f->mode < 1) f->flags &= ~F_ERR; +	f->flags &= ~F_ERR;  	if (!f->buf_size) {  		saved_buf = f->buf;  		f->buf = internal_buf; diff --git a/src/stdio/vfwprintf.c b/src/stdio/vfwprintf.c index 119fdffc..18784113 100644 --- a/src/stdio/vfwprintf.c +++ b/src/stdio/vfwprintf.c @@ -125,7 +125,13 @@ static void pop_arg(union arg *arg, int type, va_list *ap)  static void out(FILE *f, const wchar_t *s, size_t l)  { -	while (l-- && !(f->flags & F_ERR)) fputwc(*s++, f); +	while (l-- && !ferror(f)) fputwc(*s++, f); +} + +static void pad(FILE *f, int n, int fl) +{ +	if ((fl & LEFT_ADJ) || !n || ferror(f)) return; +	fprintf(f, "%*s", n, "");  }  static int getint(wchar_t **s) { @@ -264,9 +270,9 @@ static int wprintf_core(FILE *f, const wchar_t *fmt, va_list *ap, union arg *nl_  		case 'c':  		case 'C':  			if (w<1) w=1; -			if (w>1 && !(fl&LEFT_ADJ)) fprintf(f, "%*s", w-1, ""); +			pad(f, w-1, fl);  			out(f, &(wchar_t){t=='C' ? arg.i : btowc(arg.i)}, 1); -			if (w>1 && (fl&LEFT_ADJ)) fprintf(f, "%*s", w-1, ""); +			pad(f, w-1, fl^LEFT_ADJ);  			l = w;  			continue;  		case 'S': @@ -275,9 +281,9 @@ static int wprintf_core(FILE *f, const wchar_t *fmt, va_list *ap, union arg *nl_  			if (p<0 && *z) goto overflow;  			p = z-a;  			if (w<p) w=p; -			if (!(fl&LEFT_ADJ)) fprintf(f, "%*s", w-p, ""); +			pad(f, w-p, fl);  			out(f, a, p); -			if ((fl&LEFT_ADJ)) fprintf(f, "%*s", w-p, ""); +			pad(f, w-p, fl^LEFT_ADJ);  			l=w;  			continue;  		case 'm': @@ -290,14 +296,14 @@ static int wprintf_core(FILE *f, const wchar_t *fmt, va_list *ap, union arg *nl_  			if (p<0 && *bs) goto overflow;  			p=l;  			if (w<p) w=p; -			if (!(fl&LEFT_ADJ)) fprintf(f, "%*s", w-p, ""); +			pad(f, w-p, fl);  			bs = arg.p;  			while (l--) {  				i=mbtowc(&wc, bs, MB_LEN_MAX);  				bs+=i;  				out(f, &wc, 1);  			} -			if ((fl&LEFT_ADJ)) fprintf(f, "%*s", w-p, ""); +			pad(f, w-p, fl^LEFT_ADJ);  			l=w;  			continue;  		} @@ -358,7 +364,7 @@ int vfwprintf(FILE *restrict f, const wchar_t *restrict fmt, va_list ap)  	olderr = f->flags & F_ERR;  	f->flags &= ~F_ERR;  	ret = wprintf_core(f, fmt, &ap2, nl_arg, nl_type); -	if (f->flags & F_ERR) ret = -1; +	if (ferror(f)) ret = -1;  	f->flags |= olderr;  	FUNLOCK(f);  	va_end(ap2);  | 
