Async error handling
[akaros.git] / lib / printfmt.c
index d710799..a21d4bc 100644 (file)
@@ -2,6 +2,10 @@
 // used in common by printf, sprintf, fprintf, etc.
 // This code is also used by both the kernel and user programs.
 
+#ifdef __DEPUTY__
+#pragma nodeputy
+#endif
+
 #include <inc/types.h>
 #include <inc/stdio.h>
 #include <inc/string.h>
@@ -33,9 +37,8 @@ static const char * const error_string[MAXERROR + 1] =
  * Print a number (base <= 16) in reverse order,
  * using specified putch function and associated pointer putdat.
  */
-static void
-printnum(void (*putch)(int, void*), void *putdat,
-        unsigned long long num, unsigned base, int width, int padc)
+static void printnum(void (*putch)(int, void**), void **putdat,
+                        unsigned long long num, unsigned base, int width, int padc)
 {
        // first recursively print all preceding (more significant) digits
        if (num >= base) {
@@ -52,8 +55,7 @@ printnum(void (*putch)(int, void*), void *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)
+static unsigned long long getuint(va_list *ap, int lflag)
 {
        if (lflag >= 2)
                return va_arg(*ap, unsigned long long);
@@ -65,8 +67,7 @@ getuint(va_list *ap, int lflag)
 
 // Same as getuint but signed - can't use getuint
 // because of sign extension
-static long long
-getint(va_list *ap, int lflag)
+static long long getint(va_list *ap, int lflag)
 {
        if (lflag >= 2)
                return va_arg(*ap, long long);
@@ -78,10 +79,9 @@ getint(va_list *ap, int lflag)
 
 
 // Main function to format and print a string.
-void printfmt(void (*putch)(int, void*), void *putdat, const char *fmt, ...);
+void printfmt(void (*putch)(int, void**), void **putdat, const char *fmt, ...);
 
-void
-vprintfmt(void (*putch)(int, void*), void *putdat, const char *fmt, va_list ap)
+void vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list ap)
 {
        register const char *p;
        register int ch, err;
@@ -243,8 +243,7 @@ vprintfmt(void (*putch)(int, void*), void *putdat, const char *fmt, va_list ap)
        }
 }
 
-void
-printfmt(void (*putch)(int, void*), void *putdat, const char *fmt, ...)
+void printfmt(void (*putch)(int, void**), void **putdat, const char *fmt, ...)
 {
        va_list ap;
 
@@ -253,30 +252,29 @@ printfmt(void (*putch)(int, void*), void *putdat, const char *fmt, ...)
        va_end(ap);
 }
 
-struct sprintbuf {
+typedef struct sprintbuf {
        char *buf;
        char *ebuf;
        int cnt;
-};
+} sprintbuf_t;
 
-static void
-sprintputch(int ch, struct sprintbuf *b)
+static void sprintputch(int ch, sprintbuf_t **b)
 {
-       b->cnt++;
-       if (b->buf < b->ebuf)
-               *b->buf++ = ch;
+       (*b)->cnt++;
+       if ((*b)->buf < (*b)->ebuf)
+               *((*b)->buf++) = ch;
 }
 
-int
-vsnprintf(char *buf, int n, const char *fmt, va_list ap)
+int vsnprintf(char *buf, int n, const char *fmt, va_list ap)
 {
-       struct sprintbuf b = {buf, buf+n-1, 0};
+       sprintbuf_t b = {buf, buf+n-1, 0};
+       sprintbuf_t *bp = &b;
 
        if (buf == NULL || n < 1)
                return -E_INVAL;
 
        // print the string to the buffer
-       vprintfmt((void*)sprintputch, &b, fmt, ap);
+       vprintfmt((void*)sprintputch, (void**)&bp, fmt, ap);
 
        // null terminate the buffer
        *b.buf = '\0';
@@ -284,8 +282,7 @@ vsnprintf(char *buf, int n, const char *fmt, va_list ap)
        return b.cnt;
 }
 
-int
-snprintf(char *buf, int n, const char *fmt, ...)
+int snprintf(char *buf, int n, const char *fmt, ...)
 {
        va_list ap;
        int rc;