/* * Copyright (C) 2025 Danny Holman * * This file is part of BoxOS, a free and open-source Unix-like operating * system. * * BoxOS is free software; you can redistribute it and/or modify under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * BoxOS is distributed in the hope it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * BoxOS; if not, see . */ #include #include #include char* convert(unsigned int num, int base) { static char rep[] = "0123456789ABCDEF"; static char buffer[50]; char *ptr; ptr = &buffer[49]; *ptr = '\0'; do { *--ptr = rep[num%base]; num /= base; } while (num != 0); return ptr; } int vkprintf(const char *fmt, va_list args) { char *s; int i; char buffer[4096]; memset(buffer, 0, 4096); for (size_t n = 0; n < strlen(fmt); n++) { if (fmt[n] != '%') { buffer[strlen(buffer)] = fmt[n]; continue; } else { n++; } switch (fmt[n]) { case 'c': i = va_arg(args, int); buffer[strlen(buffer)] = i; break; case 's': s = va_arg(args, char*); strcat(buffer, s); break; case 'd': i = va_arg(args, int); if (i < 0) { i = -i; strcat(buffer, "-"); } strcat(buffer, convert(i, 10)); break; case 'o': i = va_arg(args, unsigned int); strcat(buffer, convert(i, 10)); break; case 'x': i = va_arg(args, unsigned int); strcat(buffer, convert(i, 16)); break; } } //tty_write(buffer, strlen(buffer)); memset(buffer, 0, 4096); return 0; } int kprintf(const char *fmt, ...) { va_list args; int done; va_start(args, fmt); done = vkprintf(fmt, args); va_end(args); return done; }