diff --git a/include/c/_printf.h b/include/c/_printf.h index e2d838b..0c0a85c 100644 --- a/include/c/_printf.h +++ b/include/c/_printf.h @@ -3,10 +3,12 @@ #include #include +#include // TODO: Support negative numbers int printf(const char* fmt, ...) { - unsigned int* argPtr = (unsigned int*)&fmt + 1; // First arg after fmt + va_list args; + va_start(args, fmt); // Printing buffer static char* buffer; @@ -35,23 +37,22 @@ int printf(const char* fmt, ...) { } else if (state == '%') { switch (c) { case 'd': // Decimal number - strcat(buffer, itoa(*argPtr++, 10)); + strcat(buffer, itoa(va_arg(args, int), 10)); len += strlen(&buffer[len]); // Add the remaining length break; case 'x': // Hex number - strcat(buffer, itoa(*argPtr++, 16)); + strcat(buffer, itoa(va_arg(args, int), 16)); len += strlen(&buffer[len]); break; case 's': // String - char* s = *(char**)argPtr++; + char* s = va_arg(args, char*); while (*s != '\0') { buffer[len++] = *s++; } break; case 'c': // Char - buffer[len++] = *(char*)argPtr; - argPtr++; + buffer[len++] = va_arg(args, char); break; default: // This looks insane buffer[len++] = '%'; @@ -66,6 +67,7 @@ int printf(const char* fmt, ...) { buffer[len] = '\0'; write(1, buffer, len); free(buffer); + va_end(args); return 0; } diff --git a/include/c/stdarg.h b/include/c/stdarg.h new file mode 100644 index 0000000..c5f3ec8 --- /dev/null +++ b/include/c/stdarg.h @@ -0,0 +1,10 @@ +#ifndef STDARG_H +#define STDARG_H + +typedef char* va_list; +#define va_start(ap, paramn) (void)((ap) = (char*)(&(paramn) + 1)) +#define va_end(ap) (void)((ap) = 0) +#define va_arg(ap, type) (((type*)((ap) = ((ap) + sizeof(type))))[-1]) + +#endif + diff --git a/kern.iso b/kern.iso index 8017d13..7245df4 100644 Binary files a/kern.iso and b/kern.iso differ