Implemented fprintf using sprintf
This commit is contained in:
parent
c2f6a60d70
commit
95a3d4e59a
56
src/stdio.c
56
src/stdio.c
|
@ -181,59 +181,9 @@ int sprintf(char *restrict s, const char *restrict format, ...) {
|
|||
}
|
||||
|
||||
int vfprintf(FILE *restrict stream, const char *restrict format, va_list ap) {
|
||||
char *str;
|
||||
int value;
|
||||
size_t size = 0;
|
||||
for (size_t i = 0; i < strlen(format); i++) {
|
||||
if (format[i] == '%') {
|
||||
i++;
|
||||
switch(format[i]) {
|
||||
case 'c':
|
||||
fputc((char) va_arg(ap, int), stream);
|
||||
size++;
|
||||
break;
|
||||
case 's':
|
||||
str = va_arg(ap, char *);
|
||||
for (size_t j = 0; j < strlen(str); j++) {
|
||||
fputc(str[j], stream);
|
||||
size++;
|
||||
}
|
||||
break;
|
||||
case 'd':
|
||||
value = va_arg(ap, int);
|
||||
if (value == 0) {
|
||||
fputc('0', stream);
|
||||
size++;
|
||||
} if (value < 0) {
|
||||
fputc('-', stream);
|
||||
value *= (-1);
|
||||
size++;
|
||||
}
|
||||
|
||||
long long power = 1;
|
||||
|
||||
while (value > power)
|
||||
power *= 10;
|
||||
|
||||
if (power >= 10)
|
||||
power /= 10;
|
||||
|
||||
while (value != 0) {
|
||||
int digit = (int)(value / power);
|
||||
fputc('0' + digit, stream);
|
||||
size++;
|
||||
if (digit != 0)
|
||||
value = value - digit * power;
|
||||
if (power != 1)
|
||||
power /= 10;
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
fputc(format[i], stream);
|
||||
size++;
|
||||
}
|
||||
}
|
||||
char s[1024]; // FIXME
|
||||
int size = vsprintf(s, format, ap);
|
||||
fputs(s, stream);
|
||||
return size;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue