added kputs_pad(); implemented padding in kprintf(); put some padding tests in k_main()

git-svn-id: svn://anubis/hos/trunk@57 5b3e749e-e535-0410-8002-a9bb6afbdfca
This commit is contained in:
josh 2009-07-15 14:53:58 +00:00
parent ecd74fe35b
commit fd02ee26e1
3 changed files with 51 additions and 13 deletions

View File

@ -6,6 +6,10 @@ extern "C" {
void k_main()
{
kprintf("Hi from k_main()!\n");
kprintf("padded 8 hex: 0x%08x|\n", 0x42);
kprintf("padded -4 hex: 0x%-4x|\n", 0x42);
kprintf("padded 20 str: %20s|\n", "hi there");
kprintf("padded -20 str: %-20s|\n", "hi there");
}
} /* extern "C" */

View File

@ -57,16 +57,29 @@ void kvprintf(const char * fmt, va_list args)
if (*fmt)
{
int width = 0;
char pad = ' ';
char pad_char = ' ';
bool pad_right = false;
if (*fmt == '0')
{
pad = '0';
pad_char = '0';
fmt++;
}
if ('1' <= *fmt && *fmt <= '9')
else if (*fmt == '-')
{
width = *fmt - '0';
/* TODO: finish */
pad_right = true;
fmt++;
}
for ( ; '0' <= *fmt && *fmt <= '9'; fmt++)
{
if (width == 0)
{
width = *fmt - '0';
}
else
{
width *= 10;
width += *fmt - '0';
}
}
switch (*fmt)
{
@ -75,34 +88,35 @@ void kvprintf(const char * fmt, va_list args)
break;
case 'd':
fmt_d2a(tmpbuf, va_arg(args, int));
kputs(tmpbuf);
kputs_pad(tmpbuf, width, pad_char, pad_right);
break;
case 'l':
fmt_ll2a(tmpbuf, va_arg(args, long long));
kputs(tmpbuf);
kputs_pad(tmpbuf, width, pad_char, pad_right);
break;
case 'L':
fmt_ull2a(tmpbuf, va_arg(args, unsigned long long));
kputs(tmpbuf);
kputs_pad(tmpbuf, width, pad_char, pad_right);
break;
case 'o':
fmt_o2a(tmpbuf, va_arg(args, unsigned int));
kputs(tmpbuf);
kputs_pad(tmpbuf, width, pad_char, pad_right);
break;
case 's':
kputs(va_arg(args, char *));
kputs_pad(va_arg(args, char *),
width, pad_char, pad_right);
break;
case 'u':
fmt_u2a(tmpbuf, va_arg(args, unsigned int));
kputs(tmpbuf);
kputs_pad(tmpbuf, width, pad_char, pad_right);
break;
case 'x':
fmt_x2a(tmpbuf, va_arg(args, unsigned int));
kputs(tmpbuf);
kputs_pad(tmpbuf, width, pad_char, pad_right);
break;
case 'X':
fmt_xl2a(tmpbuf, va_arg(args, unsigned long long));
kputs(tmpbuf);
kputs_pad(tmpbuf, width, pad_char, pad_right);
break;
case '%':
kputc('%');
@ -170,6 +184,24 @@ void kputs(const char * s)
}
}
void kputs_pad(const char * s, int width, char pad_char, bool pad_right)
{
int len = strlen(s);
if (pad_right)
{
kputs(s);
}
int num_pad_chars = width - len;
for (int i = 0; i < num_pad_chars; i++)
{
kputc(pad_char);
}
if (!pad_right)
{
kputs(s);
}
}
} /* extern "C" */
static void fmt_d2a(char * buf, int val)

View File

@ -18,6 +18,8 @@ void kputc(char c);
void kputs(const char * s);
void kputs_pad(const char * s, int width, char pad_char, bool pad_right);
#ifdef __cplusplus
} /* extern "C" */
#endif