aboutsummaryrefslogtreecommitdiff
path: root/src/libc/stdio.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libc/stdio.c')
-rw-r--r--src/libc/stdio.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/libc/stdio.c b/src/libc/stdio.c
new file mode 100644
index 0000000..8bbbe9a
--- /dev/null
+++ b/src/libc/stdio.c
@@ -0,0 +1,59 @@
+#include <u.h>
+#include <libc.h>
+
+int
+printf(byte* fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+
+ int nw, rem, peek, len;
+ byte *str, c;
+
+ while (*fmt) {
+ rem = INT_MAX - nw;
+
+ if (fmt[0] != '%' || fmt[1] == '%') {
+ if (fmt[0] == '%') fmt++;
+
+ for (peek = 1; fmt[peek] && fmt[peek] != '%'; peek++) {
+ ;
+ }
+ if (rem < peek) return -1;
+ // TODO: Print here.
+ fmt += peek;
+ nw += peek;
+ continue;
+ }
+
+ str = fmt++;
+
+ switch (*fmt++) {
+ case 'c':
+ c = va_arg(args, int);
+ if (rem < 0) return -1;
+ // TODO: Print here
+ nw++;
+ break;
+
+ case 's':
+ str = va_arg(args, byte*);
+ len = strlen(str);
+ if (rem < len) return -1;
+ // TODO: Print here
+ nw += len;
+ break;
+ default:
+ fmt = str;
+ len = strlen(fmt);
+ if (rem < len) return -1;
+ // TODO: Print here
+ nw += len;
+ fmt += len;
+ break;
+ }
+ }
+
+ va_end(args);
+ return nw;
+}