summaryrefslogtreecommitdiff
path: root/Kernel/kprintf.cpp
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2018-10-27 16:43:03 +0200
committerAndreas Kling <awesomekling@gmail.com>2018-10-27 16:43:03 +0200
commit8f91a47aebe4154124ec7d54f5c71d167937e5e4 (patch)
tree4d0095efaf41db43e7d715c9fb81825219e2069d /Kernel/kprintf.cpp
parentde2fb183cc9c0fb6ac62953d28f6eae5ee9025eb (diff)
downloadserenity-8f91a47aebe4154124ec7d54f5c71d167937e5e4.zip
Add some basic field width support to printf().
Use it to make "ls" output a bit better. Also sys$spawn now fails with EACCES if the path is not a file that's executable by the current uid/gid.
Diffstat (limited to 'Kernel/kprintf.cpp')
-rw-r--r--Kernel/kprintf.cpp139
1 files changed, 3 insertions, 136 deletions
diff --git a/Kernel/kprintf.cpp b/Kernel/kprintf.cpp
index b80fcc2e0b..463a3ce915 100644
--- a/Kernel/kprintf.cpp
+++ b/Kernel/kprintf.cpp
@@ -2,95 +2,18 @@
#include "Console.h"
#include <stdarg.h>
#include <AK/Types.h>
-
-template<typename PutChFunc> static int printNumber(PutChFunc, char*&, dword);
-template<typename PutChFunc> static int printHex(PutChFunc, char*&, dword, byte fields);
-template<typename PutChFunc> static int printSignedNumber(PutChFunc, char*&, int);
+#include <AK/printf.cpp>
static void console_putch(char*, char ch)
{
Console::the().write((byte*)&ch, 1);
}
-template<typename PutChFunc>
-int kprintfInternal(PutChFunc putch, char* buffer, const char*& fmt, char*& ap)
-{
- const char *p;
-
- int ret = 0;
- char* bufptr = buffer;
-
- for (p = fmt; *p; ++p) {
- if (*p == '%' && *(p + 1)) {
- ++p;
- switch( *p )
- {
- case 's':
- {
- const char* sp = va_arg(ap, const char*);
- //ASSERT(sp != nullptr);
- if (!sp) {
- putch(bufptr, '<');
- putch(bufptr, 'N');
- putch(bufptr, 'u');
- putch(bufptr, 'L');
- putch(bufptr, '>');
- ret += 5;
- } else {
- for (; *sp; ++sp) {
- putch(bufptr, *sp);
- ++ret;
- }
- }
- }
- break;
-
- case 'd':
- ret += printSignedNumber(putch, bufptr, va_arg(ap, int));
- break;
-
- case 'u':
- ret += printNumber(putch, bufptr, va_arg(ap, dword));
- break;
-
- case 'x':
- ret += printHex(putch, bufptr, va_arg(ap, dword), 8);
- break;
-
- case 'w':
- ret += printHex(putch, bufptr, va_arg(ap, int), 4);
- break;
-
- case 'b':
- ret += printHex(putch, bufptr, va_arg(ap, int), 2);
- break;
-
- case 'c':
- putch(bufptr, (char)va_arg(ap, int));
- ++ret;
- break;
-
- case 'p':
- putch(bufptr, '0');
- putch(bufptr, 'x');
- ret += 2;
- ret += printHex(putch, bufptr, va_arg(ap, dword), 8);
- break;
- }
- }
- else {
- putch(bufptr, *p);
- ++ret;
- }
- }
- return ret;
-}
-
int kprintf(const char* fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- int ret = kprintfInternal(console_putch, nullptr, fmt, ap);
+ int ret = printfInternal(console_putch, nullptr, fmt, ap);
va_end(ap);
return ret;
}
@@ -104,64 +27,8 @@ int ksprintf(char* buffer, const char* fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- int ret = kprintfInternal(buffer_putch, buffer, fmt, ap);
+ int ret = printfInternal(buffer_putch, buffer, fmt, ap);
buffer[ret] = '\0';
va_end(ap);
return ret;
}
-
-template<typename PutChFunc>
-int printHex(PutChFunc putch, char*& bufptr, dword number, byte fields)
-{
- static const char h[] = {
- '0','1','2','3','4','5','6','7',
- '8','9','a','b','c','d','e','f'
- };
-
- int ret = 0;
- byte shr_count = fields * 4;
- while (shr_count) {
- shr_count -= 4;
- putch(bufptr, h[(number >> shr_count) & 0x0F]);
- ++ret;
- }
- return ret;
-}
-
-template<typename PutChFunc>
-int printNumber(PutChFunc putch, char*& bufptr, dword number)
-{
- dword divisor = 1000000000;
- char ch;
- char padding = 1;
- int ret = 0;
-
- for (;;) {
- ch = '0' + (number / divisor);
- number %= divisor;
-
- if (ch != '0')
- padding = 0;
-
- if (!padding || divisor == 1) {
- putch(bufptr, ch);
- ++ret;
- }
-
- if (divisor == 1)
- break;
- divisor /= 10;
- }
- return ret;
-}
-
-template<typename PutChFunc>
-static int printSignedNumber(PutChFunc putch, char*& bufptr, int number)
-{
- if (number < 0) {
- putch(bufptr, '-');
- return printNumber(putch, bufptr, 0 - number) + 1;
- }
- return printNumber(putch, bufptr, number);
-}
-