Add snprintf/vsnprintf and sprintf/vsprintf
This commit is contained in:
parent
fba2d299c4
commit
c2f6a60d70
|
@ -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);
|
||||
|
|
93
src/stdio.c
93
src/stdio.c
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue