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() void k_main()
{ {
kprintf("Hi from k_main()!\n"); 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" */ } /* extern "C" */

View File

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