SYS_abort_syscall (XCC)
[akaros.git] / user / parlib / debugfmt.c
index 6f190fc..9aa521c 100644 (file)
@@ -1,7 +1,7 @@
 #include <ros/common.h>
 #include <ros/errno.h>
 #include <string.h>
-#include <rstdio.h>
+#include <ros_debug.h>
 
 /*
  * Print a number (base <= 16) in reverse order,
@@ -28,38 +28,13 @@ static void printnum(void (*putch)(int, void**), void **putdat,
        putch("0123456789abcdef"[num % base], putdat);
 }
 
-// Get an unsigned int of various possible sizes from a varargs list,
-// depending on the lflag parameter.
-static unsigned long long getuint(va_list *ap, int lflag)
-{
-       if (lflag >= 2)
-               return va_arg(*ap, unsigned long long);
-       else if (lflag)
-               return va_arg(*ap, unsigned long);
-       else
-               return va_arg(*ap, unsigned int);
-}
-
-// Same as getuint but signed - can't use getuint
-// because of sign extension
-static long long getint(va_list *ap, int lflag)
-{
-       if (lflag >= 2)
-               return va_arg(*ap, long long);
-       else if (lflag)
-               return va_arg(*ap, long);
-       else
-               return va_arg(*ap, int);
-}
-
-
 // Main function to format and print a string.
 #ifdef __DEPUTY__
-void debugfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *fmt, ...);
-void vdebugfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *fmt, va_list ap)
+void ros_debugfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *fmt, ...);
+void ros_vdebugfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *fmt, va_list ap)
 #else
-void debugfmt(void (*putch)(int, void**), void **putdat, const char *fmt, ...);
-void vdebugfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list ap)
+void ros_debugfmt(void (*putch)(int, void**), void **putdat, const char *fmt, ...);
+void ros_vdebugfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list ap)
 #endif
 {
        register const char *NTS p;
@@ -145,9 +120,16 @@ void vdebugfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_li
                        break;
 
                // string
+/*
+               case 'r':
+                       p = current_errstr();
+                       /* oh, barf. Now we look like glibc. * /
+                       goto putstring;
+*/
                case 's':
                        if ((p = va_arg(ap, char *NT)) == NULL)
                                p = "(null)";
+//putstring:
                        if (width > 0 && padc != '-')
                                for (width -= strnlen(p, precision); width > 0; width--)
                                        putch(padc, putdat);
@@ -163,9 +145,13 @@ void vdebugfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_li
                                putch(' ', putdat);
                        break;
 
-               // (signed) decimal
-               case 'd':
-                       num = getint(&ap, lflag);
+               case 'd': /* (signed) decimal */
+                       if (lflag >= 2)
+                               num = va_arg(ap, long long);
+                       else if (lflag)
+                               num = va_arg(ap, long);
+                       else
+                               num = va_arg(ap, int);
                        if ((long long) num < 0) {
                                putch('-', putdat);
                                num = -(long long) num;
@@ -173,17 +159,21 @@ void vdebugfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_li
                        base = 10;
                        goto number;
 
-               // unsigned decimal
-               case 'u':
-                       num = getuint(&ap, lflag);
-                       base = 10;
-                       goto number;
-
-               // (unsigned) octal
-               case 'o':
-                       // should do something with padding so it's always 3 octits
-                       num = getuint(&ap, lflag);
-                       base = 8;
+               case 'u': /* unsigned decimal */
+               case 'o': /* (unsigned) octal */
+               case 'x': /* (unsigned) hexadecimal */
+                       if (lflag >= 2)
+                               num = va_arg(ap, unsigned long long);
+                       else if (lflag)
+                               num = va_arg(ap, unsigned long);
+                       else
+                               num = va_arg(ap, unsigned int);
+                       if (ch == 'u')
+                               base = 10;
+                       else if (ch == 'o')
+                               base = 8;
+                       else    /* x */
+                               base = 16;
                        goto number;
 
                // pointer
@@ -195,10 +185,6 @@ void vdebugfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_li
                        base = 16;
                        goto number;
 
-               // (unsigned) hexadecimal
-               case 'x':
-                       num = getuint(&ap, lflag);
-                       base = 16;
                number:
                        printnum(putch, putdat, num, base, width, padc);
                        break;
@@ -220,15 +206,15 @@ void vdebugfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_li
 }
 
 #ifdef __DEPUTY__
-void debugfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *fmt, ...)
+void ros_debugfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *fmt, ...)
 #else
-void debugfmt(void (*putch)(int, void**), void **putdat, const char *fmt, ...)
+void ros_debugfmt(void (*putch)(int, void**), void **putdat, const char *fmt, ...)
 #endif
 {
        va_list ap;
 
        va_start(ap, fmt);
-       vdebugfmt(putch, putdat, fmt, ap);
+       ros_vdebugfmt(putch, putdat, fmt, ap);
        va_end(ap);
 }