diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/fmt.h | 77 | ||||
-rw-r--r-- | include/io.h | 10 |
2 files changed, 46 insertions, 41 deletions
diff --git a/include/fmt.h b/include/fmt.h index c74ac4c..f4be0b1 100644 --- a/include/fmt.h +++ b/include/fmt.h @@ -6,42 +6,11 @@ #define ALLOW_UNUSED __attribute__((unused)) -ALLOW_UNUSED -static const char* num2dec(char* buf, unsigned long len, unsigned long long num) { - char* pbuf = buf + len - 1; - *pbuf = '\0'; - - if (num == 0) { - *(--pbuf) = '0'; - } - - while (num > 0 && pbuf != buf) { - char d = (num % 10) + '0'; - *(--pbuf) = d; - num /= 10; - } - return pbuf; -} - -ALLOW_UNUSED -static const char* num2hex(char* buf, unsigned long len, unsigned long long num) { - char* pbuf = buf + len - 1; - *pbuf = '\0'; - - if (num == 0) { - *(--pbuf) = '0'; - } - - while (num > 0 && pbuf != buf) { - char d = (num & 0xf); - *(--pbuf) = d + (d > 9 ? 'a' - 10 : '0'); - num >>= 4; - } - return pbuf; -} +static const char* num2dec(char* buf, unsigned long len, unsigned long long num); +static const char* num2hex(char* buf, unsigned long len, unsigned long long num); ALLOW_UNUSED -static int dynld_vsnprintf(char* buf, unsigned long len, const char* fmt, va_list ap) { +static int vfmt(char* buf, unsigned long len, const char* fmt, va_list ap) { unsigned i = 0; #define put(c) \ @@ -116,10 +85,46 @@ static int dynld_vsnprintf(char* buf, unsigned long len, const char* fmt, va_lis } ALLOW_UNUSED -static int dynld_snprintf(char* buf, unsigned long len, const char* fmt, ...) { +static int fmt(char* buf, unsigned long len, const char* fmt, ...) { va_list ap; va_start(ap, fmt); - int ret = dynld_vsnprintf(buf, len, fmt, ap); + int ret = vfmt(buf, len, fmt, ap); va_end(ap); return ret; } + +/// Internal Helper + +ALLOW_UNUSED +static const char* num2dec(char* buf, unsigned long len, unsigned long long num) { + char* pbuf = buf + len - 1; + *pbuf = '\0'; + + if (num == 0) { + *(--pbuf) = '0'; + } + + while (num > 0 && pbuf != buf) { + char d = (num % 10) + '0'; + *(--pbuf) = d; + num /= 10; + } + return pbuf; +} + +ALLOW_UNUSED +static const char* num2hex(char* buf, unsigned long len, unsigned long long num) { + char* pbuf = buf + len - 1; + *pbuf = '\0'; + + if (num == 0) { + *(--pbuf) = '0'; + } + + while (num > 0 && pbuf != buf) { + char d = (num & 0xf); + *(--pbuf) = d + (d > 9 ? 'a' - 10 : '0'); + num >>= 4; + } + return pbuf; +} diff --git a/include/io.h b/include/io.h index 4b3ea4b..d9a1ae1 100644 --- a/include/io.h +++ b/include/io.h @@ -7,7 +7,7 @@ #include <asm/unistd.h> -// `dynld_printf` uses fixed-size buffer on the stack for formating the message +// `pfmt` uses fixed-size buffer on the stack for formating the message // (since we don't impl buffered I/O). // // Size can be re-configured by defining `MAX_PRINTF_LEN` before including @@ -16,24 +16,24 @@ // NOTE: This allows to specify an arbitrarily large buffer on the stack, but // for the purpose of this study that's fine, we are cautious. #if !defined(MAX_PRINTF_LEN) -# define MAX_PRINTF_LEN 64 +# define MAX_PRINTF_LEN 128 #endif #define FD_STDOUT 1 #define FD_STDERR 2 -int dynld_printf(const char* fmt, ...) { +static int pfmt(const char* fmt, ...) { char buf[MAX_PRINTF_LEN]; va_list ap; va_start(ap, fmt); - int ret = dynld_vsnprintf(buf, sizeof(buf), fmt, ap); + int ret = vfmt(buf, sizeof(buf), fmt, ap); va_end(ap); if (ret > MAX_PRINTF_LEN - 1) { syscall3(__NR_write, FD_STDERR, buf, MAX_PRINTF_LEN - 1); - static const char warn[] = "\ndynld_printf: Message truncated, max length can be configured by defining MAX_PRINTF_LEN\n"; + static const char warn[] = "\npfmt: Message truncated, max length can be configured by defining MAX_PRINTF_LEN\n"; syscall3(__NR_write, FD_STDOUT, warn, sizeof(warn)); return MAX_PRINTF_LEN - 1; } |