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