Add snprintf/vsnprintf and sprintf/vsprintf

This commit is contained in:
g1n 2021-12-31 13:00:38 +02:00
parent fba2d299c4
commit c2f6a60d70
Signed by: g1n
GPG Key ID: 8D352193D65D4E2C
2 changed files with 91 additions and 6 deletions

View File

@ -22,6 +22,10 @@ int rename(const char *old, const char *new);
int putchar(int c);
int puts(const char *s);
int vsnprintf(char *restrict str, size_t size, const char *restrict format, va_list ap);
int snprintf(char *restrict str, size_t size, const char *restrict format, ...);
int vsprintf(char *restrict str, const char *restrict format, va_list ap);
int sprintf(char *restrict str, const char *restrict format, ...);
int vfprintf(FILE *restrict stream, const char *restrict format, va_list ap);
int fprintf(FILE *restrict stream, const char *restrict format, ...);
int vprintf(const char *restrict format, va_list ap);

View File

@ -99,10 +99,91 @@ int puts(const char *s) {
return 1; // FIXME
}
int vfprintf(FILE *restrict stream, const char *restrict format, va_list ap) {
char *s;
int vsnprintf(char *restrict s, size_t n, const char *restrict format, va_list ap) {
char *str;
int value;
int size = 0;
size_t size = 0;
for (size_t i = 0; i < strlen(format) && size < n-1; i++) {
if (format[i] == '%') {
i++;
switch(format[i]) {
case 'c':
s[size] = (char) va_arg(ap, int);
size++;
break;
case 's':
str = va_arg(ap, char *);
for (size_t j = 0; j < strlen(str); j++) {
s[size] = str[j];
size++;
}
break;
case 'd':
value = va_arg(ap, int);
if (value == 0) {
s[size] = '0';
size++;
} if (value < 0) {
s[size] = '-';
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);
s[size] = '0' + digit;
size++;
if (digit != 0)
value = value - digit * power;
if (power != 1)
power /= 10;
}
break;
}
} else {
s[size] = format[i];
size++;
}
}
s[size] = '\0';
return size;
}
int snprintf(char *restrict s, size_t n, const char *restrict format, ...) {
int size;
va_list ap;
va_start(ap, format);
size = vsnprintf(s, n, format, ap);
va_end(ap);
return size;
}
int vsprintf(char *restrict s, const char *restrict format, va_list ap) {
size_t n = strlen(s);
return vsnprintf(s, n, format, ap);
}
int sprintf(char *restrict s, const char *restrict format, ...) {
int size;
va_list ap;
va_start(ap, format);
size = vsprintf(s, format, ap);
va_end(ap);
return size;
}
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++;
@ -112,9 +193,9 @@ int vfprintf(FILE *restrict stream, const char *restrict format, va_list ap) {
size++;
break;
case 's':
s = va_arg(ap, char *);
for (size_t j = 0; j < strlen(s); j++) {
fputc(s[j], stream);
str = va_arg(ap, char *);
for (size_t j = 0; j < strlen(str); j++) {
fputc(str[j], stream);
size++;
}
break;