|
@@ -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);
|
|
|
}
|