X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=bootcensus;a=blobdiff_plain;f=src%2Flibc%2Fstdio.c;h=1f2bb13e029f923a3ecb464915b86435657e0636;hp=449a5aa610317d5e9f5412a9d947cfddd0cbdd8c;hb=9358438bef42dbbcd1492a52d9010899a9756d2c;hpb=5e8cc93aaf1173688852acaa0825698c2dc0cb3f diff --git a/src/libc/stdio.c b/src/libc/stdio.c index 449a5aa..1f2bb13 100644 --- a/src/libc/stdio.c +++ b/src/libc/stdio.c @@ -19,11 +19,19 @@ along with this program. If not, see . #include #include #include "contty.h" +#include "serial.h" + +enum { + OUT_DEF, + OUT_BUF, + OUT_SCR, + OUT_SER +}; extern void pcboot_putchar(int c); -static void bwrite(char *buf, size_t buf_sz, char *str, int sz); -static int intern_printf(char *buf, size_t sz, const char *fmt, va_list ap); +static void bwrite(int out, char *buf, size_t buf_sz, char *str, int sz); +static int intern_printf(int out, char *buf, size_t sz, const char *fmt, va_list ap); int putchar(int c) { @@ -52,14 +60,14 @@ int printf(const char *fmt, ...) va_list ap; va_start(ap, fmt); - res = intern_printf(0, 0, fmt, ap); + res = intern_printf(OUT_DEF, 0, 0, fmt, ap); va_end(ap); return res; } int vprintf(const char *fmt, va_list ap) { - return intern_printf(0, 0, fmt, ap); + return intern_printf(OUT_DEF, 0, 0, fmt, ap); } int sprintf(char *buf, const char *fmt, ...) @@ -68,14 +76,14 @@ int sprintf(char *buf, const char *fmt, ...) va_list ap; va_start(ap, fmt); - res = intern_printf(buf, 0, fmt, ap); + res = intern_printf(OUT_BUF, buf, 0, fmt, ap); va_end(ap); return res; } int vsprintf(char *buf, const char *fmt, va_list ap) { - return intern_printf(buf, 0, fmt, ap); + return intern_printf(OUT_BUF, buf, 0, fmt, ap); } int snprintf(char *buf, size_t sz, const char *fmt, ...) @@ -84,16 +92,31 @@ int snprintf(char *buf, size_t sz, const char *fmt, ...) va_list ap; va_start(ap, fmt); - res = intern_printf(buf, sz, fmt, ap); + res = intern_printf(OUT_BUF, buf, sz, fmt, ap); va_end(ap); return res; } int vsnprintf(char *buf, size_t sz, const char *fmt, va_list ap) { - return intern_printf(buf, sz, fmt, ap); + return intern_printf(OUT_BUF, buf, sz, fmt, ap); } +int ser_printf(const char *fmt, ...) +{ + int res; + va_list ap; + + va_start(ap, fmt); + res = intern_printf(OUT_SER, 0, 0, fmt, ap); + va_end(ap); + return res; +} + +int ser_vprintf(const char *fmt, va_list ap) +{ + return intern_printf(OUT_SER, 0, 0, fmt, ap); +} /* intern_printf provides all the functionality needed by all the printf * variants. @@ -108,7 +131,7 @@ int vsnprintf(char *buf, size_t sz, const char *fmt, va_list ap) #define BUF(x) ((x) ? (x) + cnum : (x)) #define SZ(x) ((x) ? (x) - cnum : (x)) -static int intern_printf(char *buf, size_t sz, const char *fmt, va_list ap) +static int intern_printf(int out, char *buf, size_t sz, const char *fmt, va_list ap) { char conv_buf[32]; char *str; @@ -143,7 +166,7 @@ static int intern_printf(char *buf, size_t sz, const char *fmt, va_list ap) base = 16; if(alt) { - bwrite(BUF(buf), SZ(sz), "0x", 2); + bwrite(out, BUF(buf), SZ(sz), "0x", 2); } case 'u': @@ -154,7 +177,7 @@ static int intern_printf(char *buf, size_t sz, const char *fmt, va_list ap) base = 8; if(alt) { - bwrite(BUF(buf), SZ(sz), "0", 1); + bwrite(out, BUF(buf), SZ(sz), "0", 1); } } @@ -173,18 +196,18 @@ static int intern_printf(char *buf, size_t sz, const char *fmt, va_list ap) slen = strlen(conv_buf); for(i=slen; i