summaryrefslogtreecommitdiff
path: root/console.c
diff options
context:
space:
mode:
Diffstat (limited to 'console.c')
-rw-r--r--console.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/console.c b/console.c
index a280d2b..9986a9c 100644
--- a/console.c
+++ b/console.c
@@ -2,6 +2,8 @@
// Input is from the keyboard or serial port.
// Output is written to the screen and serial port.
+#include <stdarg.h>
+
#include "types.h"
#include "defs.h"
#include "param.h"
@@ -24,10 +26,11 @@ static struct {
int locking;
} cons;
+static char digits[] = "0123456789abcdef";
+
static void
printint(int xx, int base, int sign)
{
- static char digits[] = "0123456789abcdef";
char buf[16];
int i;
uint x;
@@ -48,14 +51,25 @@ printint(int xx, int base, int sign)
while(--i >= 0)
consputc(buf[i]);
}
+
+static void
+printptr(uint64 x) {
+ int i;
+ consputc('0');
+ consputc('x');
+ for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+ consputc(digits[x >> (sizeof(uint64) * 8 - 4)]);
+}
+
+
//PAGEBREAK: 50
// Print to the console. only understands %d, %x, %p, %s.
void
cprintf(char *fmt, ...)
{
+ va_list ap;
int i, c, locking;
- uint *argp;
char *s;
locking = cons.locking;
@@ -65,7 +79,7 @@ cprintf(char *fmt, ...)
if (fmt == 0)
panic("null fmt");
- argp = (uint*)(void*)(&fmt + 1);
+ va_start(ap, fmt);
for(i = 0; (c = fmt[i] & 0xff) != 0; i++){
if(c != '%'){
consputc(c);
@@ -76,14 +90,16 @@ cprintf(char *fmt, ...)
break;
switch(c){
case 'd':
- printint(*argp++, 10, 1);
+ printint(va_arg(ap, int), 10, 1);
break;
case 'x':
+ printint(va_arg(ap, int), 16, 1);
+ break;
case 'p':
- printint(*argp++, 16, 0);
+ printptr(va_arg(ap, uint64));
break;
case 's':
- if((s = (char*)*argp++) == 0)
+ if((s = va_arg(ap, char*)) == 0)
s = "(null)";
for(; *s; s++)
consputc(*s);
@@ -107,7 +123,7 @@ void
panic(char *s)
{
int i;
- uint pcs[10];
+ uint64 pcs[10];
cli();
cons.locking = 0;