Implemented fprintf using sprintf

This commit is contained in:
g1n 2021-12-31 14:02:11 +02:00
parent c2f6a60d70
commit 95a3d4e59a
Signed by: g1n
GPG Key ID: 8D352193D65D4E2C
1 changed files with 3 additions and 53 deletions

View File

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