hos/kernel/lang/kio.cc
josh be17cde305 added devices and lang directories, added skeleton kio and string modules
git-svn-id: svn://anubis/hos/trunk@43 5b3e749e-e535-0410-8002-a9bb6afbdfca
2009-07-13 15:34:39 +00:00

158 lines
3.5 KiB
C++

#include "kio.h"
#include "string.h"
#include <stdarg.h> /* va_*() */
static void fmt_d2a(char * buf, int val);
static void fmt_u2a(char * buf, unsigned int val);
static void fmt_ll2a(char * buf, long long val);
static void fmt_ull2a(char * buf, unsigned long long val);
static void fmt_x2a(char * buf, unsigned int val);
static void fmt_o2a(char * buf, unsigned int val);
extern "C" {
void kprintf(char * fmt, ...)
{
va_list args;
va_start(args, fmt);
kvprintf(fmt, args);
va_end(args);
}
void kvprintf(char * fmt, va_list args)
{
char tmpbuf[25];
for ( ; *fmt; fmt++)
{
if (*fmt == '%')
{
fmt++;
if (*fmt)
{
switch (*fmt)
{
case 'c':
kputc(va_arg(args, int));
break;
case 'd':
fmt_d2a(tmpbuf, va_arg(args, int));
kputs(tmpbuf);
break;
case 'l':
fmt_ll2a(tmpbuf, va_arg(args, long long));
kputs(tmpbuf);
break;
case 'L':
fmt_ull2a(tmpbuf, va_arg(args, unsigned long long));
kputs(tmpbuf);
break;
case 'o':
fmt_o2a(tmpbuf, va_arg(args, unsigned int));
kputs(tmpbuf);
break;
case 's':
kputs(va_arg(args, char *));
break;
case 'u':
fmt_u2a(tmpbuf, va_arg(args, unsigned int));
kputs(tmpbuf);
break;
case 'x':
fmt_x2a(tmpbuf, va_arg(args, unsigned int));
kputs(tmpbuf);
break;
case '%':
kputc('%');
break;
}
}
}
else
{
kputc(*fmt);
}
}
}
void kputc(char c)
{
}
void kputs(char * s)
{
while (*s)
{
kputc(*s);
s++;
}
}
} /* extern "C" */
static void fmt_d2a(char * buf, int val)
{
if (val == 0x7FFFFFFF)
{
strcpy(buf, "-2147483648");
}
else
{
if (val < 0)
{
*buf++ = '-';
val = -val;
}
fmt_u2a(buf, (unsigned int) val);
}
}
static void fmt_u2a(char * buf, unsigned int val)
{
}
static void fmt_ll2a(char * buf, long long val)
{
}
static void fmt_ull2a(char * buf, unsigned long long val)
{
}
static void fmt_x2a(char * buf, unsigned int val)
{
bool printing = false;
for (int s = 28; s >= 0; s -= 4)
{
unsigned int n = (val >> s) & 0xF;
if (n)
{
printing = true;
}
if (printing)
{
*buf++ = "0123456789ABCDEF"[n];
}
}
}
static void fmt_o2a(char * buf, unsigned int val)
{
bool printing = false;
for (int s = 30; s >= 0; s -= 3)
{
unsigned int n = (val >> s) & 0x7;
if (n)
{
printing = true;
}
if (printing)
{
*buf++ = "01234567"[n];
}
}
}