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:
parent
ecd74fe35b
commit
fd02ee26e1
@ -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" */
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user