#include #include /* minprintf: minimal printf with varable argument list */ void minprintf(char *fmt, ...) { va_list ap; char *p, *sval; int ival; double dval; va_start(ap, fmt); for (p = fmt; *p; p++) { if (*p != '%') { putchar(*p); continue; } switch(*++p) { case 'c': ival = va_arg(ap, int); putchar(ival); break; case 'o': ival = va_arg(ap, int); printf("%o", ival); break; case 'x': ival = va_arg(ap, int); printf("%x", ival); break; case 'd': ival = va_arg(ap, int); printf("%d", ival); break; case 'f': dval = va_arg(ap, double); printf("%f", dval); break; case 's': for (sval = va_arg(ap, char *); *sval; sval++) putchar(*sval); break; default: putchar(*p); break; } } va_end(ap); } /* minscanf: minimal printf with varable argument list */ void minscanf(char *fmt, ...) { va_list ap; char *p, *sval; int *ival; double *dval; va_start(ap, fmt); for (p = fmt; *p; p++) { if (*p != '%') { if (getchar() != *p) return; continue; } switch(*++p) { case 'c': ival = va_arg(ap, (int *)); *ival = getchar(); break; case 'o': ival = va_arg(ap, (int *)); scanf("%o", ival); break; case 'x': ival = va_arg(ap, (int *)); scanf("%x", ival); break; case 'd': ival = va_arg(ap, (int *)); scanf("%d", ival); break; case 'f': dval = va_arg(ap, (double *)); scanf("%f", dval); break; case 's': for (sval = va_arg(ap, char *); *sval=getchar(); sval++); break; default: if (getchar != *p) return; break; } } va_end(ap); }