#include #include int printf(byte* fmt, ...) { va_list args; va_start(args, fmt); int nw, rem, peek, len; byte *str, c; while (*fmt) { rem = INT_MAX - nw; if (fmt[0] != '%' || fmt[1] == '%') { if (fmt[0] == '%') fmt++; for (peek = 1; fmt[peek] && fmt[peek] != '%'; peek++) { ; } if (rem < peek) return -1; // TODO: Print here. fmt += peek; nw += peek; continue; } str = fmt++; switch (*fmt++) { case 'c': c = va_arg(args, int); if (rem < 0) return -1; // TODO: Print here nw++; break; case 's': str = va_arg(args, byte*); len = strlen(str); if (rem < len) return -1; // TODO: Print here nw += len; break; default: fmt = str; len = strlen(fmt); if (rem < len) return -1; // TODO: Print here nw += len; fmt += len; break; } } va_end(args); return nw; }