summaryrefslogtreecommitdiff
path: root/src/init/stdlib.c
diff options
context:
space:
mode:
authordzwdz2022-03-27 16:59:14 +0200
committerdzwdz2022-03-27 16:59:14 +0200
commitb79e9c8f639cc273b38e34d877223ff984f8fa0c (patch)
treeb236f8538fc01533de2e82d41fa194501748e9e5 /src/init/stdlib.c
parentb74ef85cce1ceb5840e9f3bdc43558b75740b83b (diff)
init/shell: hexdump
Diffstat (limited to 'src/init/stdlib.c')
-rw-r--r--src/init/stdlib.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/init/stdlib.c b/src/init/stdlib.c
index 18da3da..e8b3f97 100644
--- a/src/init/stdlib.c
+++ b/src/init/stdlib.c
@@ -21,8 +21,20 @@ int printf(const char *fmt, ...) {
case '%':
_syscall_write(0, seg, fmt - seg - 1, 0);
total += fmt - seg - 1;
+ size_t pad_len = 0;
+parse_fmt:
c = *fmt++;
switch (c) {
+ case '0':
+ pad_len = *fmt++ - '0'; // can skip over the null byte, idc
+ goto parse_fmt;
+
+ case 'c':
+ char c = va_arg(argp, int);
+ _syscall_write(0, &c, 1, 0);
+ total += 1;
+ break;
+
case 's':
const char *s = va_arg(argp, char*);
if (s) {
@@ -37,6 +49,9 @@ int printf(const char *fmt, ...) {
while (n >> i && i < (sizeof(int) * 8))
i += 4;
+ if (i < pad_len * 4)
+ i = pad_len * 4;
+
while (i > 0) {
i -= 4;
char h = '0' + ((n >> i) & 0xf);