From 706243ac48cf646d503a3f1ec9e6a28c916694bd Mon Sep 17 00:00:00 2001 From: Patrick Williams Date: Sat, 5 Mar 2011 10:01:45 -0600 Subject: Merge of PowerHAL project up to commit: dd45c30bd53d8e6c123165b83842d08117558a3c --- src/kernel/console.C | 255 ++------------------------------------------------- 1 file changed, 7 insertions(+), 248 deletions(-) (limited to 'src/kernel/console.C') diff --git a/src/kernel/console.C b/src/kernel/console.C index 6cc2d1dac..6912b8450 100644 --- a/src/kernel/console.C +++ b/src/kernel/console.C @@ -1,5 +1,7 @@ #include #include +#include +#include #include char kernel_printk_buffer[Console::BUFFER_SIZE]; @@ -22,260 +24,17 @@ int Console::putc(int c) return c; } -class ConsoleTraits -{ - public: - enum trait { NONE, HEX, DEC, }; -}; - -template -class ConsoleDisplay -{ - public: - static void display(Console& c, _T value) {}; -}; - -template -class ConsoleDisplay -{ - public: - static void display(Console&c, char* value) - { - while(*value != '\0') - { - c.putc(*value); - value++; - } - } -}; - -template <> -class ConsoleDisplay -{ - public: - static void display(Console&c, char value) - { - c.putc(value); - } -}; - -template -class ConsoleDisplay<_T, ConsoleTraits::DEC> -{ - public: - static void display(Console&c, _T value) - { - if (value == 0) - { - c.putc('0'); - } - else if (value < 0) - { - c.putc('-'); - value *= -1; - } - else - subdisplay(c, value); - } - - static void subdisplay(Console&c, _T value) - { - if (value != 0) - { - subdisplay(c, value / 10); - c.putc('0' + (value % 10)); - } - } -}; - -template -class ConsoleDisplay<_T, ConsoleTraits::HEX> -{ - public: - static void display(Console&c, _T value) - { - size_t length = sizeof(_T) * 2; - subdisplay(c, value, length); - } - - static void subdisplay(Console&c, _T value, size_t length) - { - if (length == 0) return; - subdisplay(c, value / 16, length-1); - char nibble = value % 16; - if (nibble >= 0x0a) - c.putc('A' + (nibble - 0x0a)); - else - c.putc('0' + nibble); - } -}; - void printk(const char* str, ...) { + using Util::mem_ptr_fun; + using Util::vasprintf; + va_list args; va_start(args, str); Console& console = Singleton::instance(); - - bool format = false; - int size = 0; - - while('\0' != *str) - { - if (('%' == *str) || (format)) - switch (*str) - { - case '%': - { - if (format) - { - ConsoleDisplay::display(console, '%'); - format = false; - } - else - { - format = true; - size = 2; - } - break; - } - case 'c': - { - format = false; - ConsoleDisplay - ::display(console, - (char)va_arg(args,int)); - break; - } - case 'h': - { - size--; - break; - } - case 'l': - { - size++; - break; - } - case 'z': // size_t or ssize_t - { - size = 4; - break; - } - case 'd': // decimal - { - format = false; - switch(size) - { - case 0: - ConsoleDisplay - ::display(console, - (char)va_arg(args,int)); - break; - - case 1: - ConsoleDisplay - ::display(console, - (short)va_arg(args,int)); - break; - - case 2: - ConsoleDisplay - ::display(console, - va_arg(args,int)); - break; - - case 3: - case 4: - ConsoleDisplay - ::display(console, - va_arg(args,long)); - break; - } - break; - } - case 'u': // unsigned decimal - { - format = false; - switch(size) - { - case 0: - ConsoleDisplay - ::display(console, - (unsigned char) - va_arg(args,unsigned int)); - break; - - case 1: - ConsoleDisplay - ::display(console, - (unsigned short) - va_arg(args,unsigned int)); - break; - - case 2: - ConsoleDisplay - ::display(console, - va_arg(args,unsigned int)); - break; - - case 3: - case 4: - ConsoleDisplay - ::display(console, - va_arg(args,unsigned long)); - break; - } - break; - } - case 'x': // unsigned hex - case 'X': - { - format = false; - switch(size) - { - case 0: - ConsoleDisplay - ::display(console, - (unsigned char) - va_arg(args,unsigned int)); - break; - - case 1: - ConsoleDisplay - ::display(console, - (unsigned short) - va_arg(args,unsigned int)); - break; - - case 2: - ConsoleDisplay - ::display(console, - va_arg(args,unsigned int)); - break; - - case 3: - case 4: - ConsoleDisplay - ::display(console, - va_arg(args,unsigned long)); - break; - } - break; - } - case 's': // string - { - format = false; - ConsoleDisplay::display(console, - (char*)va_arg(args,void*)); - break; - } - } - else - ConsoleDisplay::display(console, *str); - - str++; - } + vasprintf(mem_ptr_fun(console, &Console::putc), + str, args); va_end(args); } -- cgit v1.2.3