summaryrefslogtreecommitdiff
path: root/src/user/lib/libc/std/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/user/lib/libc/std/string.c')
-rw-r--r--src/user/lib/libc/std/string.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/user/lib/libc/std/string.c b/src/user/lib/libc/std/string.c
index d8e4a48..619b8c6 100644
--- a/src/user/lib/libc/std/string.c
+++ b/src/user/lib/libc/std/string.c
@@ -119,3 +119,57 @@ char* format_hex(char *buf, unsigned v) {
}
return buf;
}
+
+int printf_str_len(const char *format, va_list ap) {
+ int l = 0;
+ while (*format) {
+ if (*format == '%') {
+ format++;
+ if (*format == 'd' || *format == 'i') {
+ l += 15;
+ va_arg(ap, int);
+ } else if (*format == 'p') {
+ l += 11;
+ va_arg(ap, void*);
+ } else if (*format == 's') {
+ l += strlen(va_arg(ap, const char*));
+ }
+ } else {
+ l++;
+ }
+ format++;
+ }
+ return l;
+}
+
+int sprintf(char *buf, const char *fmt, ...) {
+ va_list ap;
+ va_start(ap, fmt);
+ int ret = vsprintf(buf, fmt, ap);
+ va_end(ap);
+ return ret;
+}
+
+int vsprintf(char *buf, const char *format, va_list ap) {
+ char *end = buf;
+
+ while (*format) {
+ if (*format == '%') {
+ format++;
+ if (*format == 'd' || *format == 'i') {
+ end = format_int(end, va_arg(ap, int));
+ } else if (*format == 'p') {
+ end = format_hex(end, va_arg(ap, uint32_t));
+ } else if (*format == 's') {
+ const char *s = va_arg(ap, const char*);
+ strcpy(end, s);
+ end += strlen(s);
+ }
+ format++;
+ } else {
+ *(end++) = *(format++);
+ }
+ }
+ *end = 0;
+ return end - buf;
+}