string: Add %S to directly print Vua string object
authorJack Miller <jack@codezen.org>
Tue, 2 Aug 2016 17:25:44 +0000 (12:25 -0500)
committerJack Miller <jack@codezen.org>
Tue, 2 Aug 2016 17:25:44 +0000 (12:25 -0500)
Object is passed as a tracked value, like other Vua objects should be.

kernel/string.c

index 54ccf95..564fde7 100644 (file)
@@ -1,8 +1,11 @@
 /* vim: set ts=4 sw=4 sts=4 et : */
 
-#include <types.h>
+#include <kernel.h>
+#include <vua/vua.h>    // printing native objects
+
 #include <stdarg.h>
 
+
 void memcpy(void *dest, void *src, u32 size)
 {
     int i;
@@ -89,6 +92,12 @@ static int convert(char *buf, char fill, u32 rem, s32 fieldwidth,
     return i;
 }
 
+#define shrink_fieldwidth()\
+    if (fieldwidth == -1)\
+        fieldwidth = size;\
+    else\
+        fieldwidth = min(fieldwidth, size);
+
 void vsnprintf(char *buf, u32 size, char *format, va_list ap)
 {
     char *str = buf;
@@ -97,6 +106,7 @@ void vsnprintf(char *buf, u32 size, char *format, va_list ap)
     char fill;
     char *s;
     char c;
+    vua_str_t *vs;
 
     unsigned long long val;
     s32 fieldwidth = -1;
@@ -127,8 +137,9 @@ void vsnprintf(char *buf, u32 size, char *format, va_list ap)
                 break;
             case 's':
                 s = va_arg(ap, char *);
-                if (fieldwidth == -1)
-                    fieldwidth = (size - i);
+
+                shrink_fieldwidth();
+
                 while ((fieldwidth--) && (*s)) {
                     *str++ = *s++;
                     size--;
@@ -138,6 +149,22 @@ void vsnprintf(char *buf, u32 size, char *format, va_list ap)
                 escaped = 0;
                 size++;
                 break;
+            case 'S':
+                vs = tv_str(va_arg(ap, vua_tv_t));
+
+                shrink_fieldwidth();
+
+                if (vs) {
+                    for (tmp = 0; tmp < min(vs->len, fieldwidth); tmp++) {
+                        *str++ = vs->data[tmp];
+                        size--;
+                    }
+                }
+
+                fieldwidth = -1;
+                escaped = 0;
+                size++;
+                break;
             case 'l':
                 if (qualifier[0] == 'l')
                     qualifier[1] = 'l';