1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
#include <stdio.h>
#include <stdarg.h>
BYTE printf(char *fmt, ...)
{
va_list ap;
BYTE nb = 0;
va_start(ap, fmt);
for(; *fmt; fmt++)
if(*fmt == '%') {
switch(*++fmt) {
case 'c':
/* char */
putchar(va_arg(ap, char));
break;
case 'd':
/* decimal int */
printn(va_arg(ap, BYTE), 10, SIGNED);
break;
case 'u':
/* unsigned int */
printn(va_arg(ap, BYTE), 10, UNSIGNED);
break;
case 'o':
/* octal int */
printn(va_arg(ap, BYTE), 8, UNSIGNED);
break;
case 'x':
/* hexadecimal int */
printn(va_arg(ap, BYTE), 16, UNSIGNED);
break;
case 's':
/* string */
print(va_arg(ap, char *));
break;
case 'l':
/* long */
switch(*++fmt) {
case 'd':
/* decimal long */
println(va_arg(ap, WORD), 10, SIGNED);
break;
case 'u':
/* unsigned long */
println(va_arg(ap, WORD), 10, UNSIGNED);
break;
case 'o':
/* octal long */
println(va_arg(ap, WORD), 8, UNSIGNED);
break;
case 'x':
/* hexadecimal long */
println(va_arg(ap, WORD), 16, UNSIGNED);
break;
}
break;
case '%':
/* % */
putchar(*fmt);
break;
default:
return -1;
}
nb++;
} else
putchar(*fmt);
va_end(ap);
return nb;
}
|