#include <stdio.h>
#include <stdarg.h>
void fputc10(FILE *fp, int d, int *n) {
int c;
c = d % 10;
d /= 10;
if (d > 0)
fputc10(fp, d, n);
fputc(c + '0', fp);
(*n)++;
}
void task_percent(FILE *fp, char const **p, int *n, va_list *ap) {
int d;
(*p)++;
switch (**p) {
case 'd':
d = va_arg(*ap, int);
fputc10(fp, d, n);
break;
case '%':
fputc('%', fp);
(*n)++;
break;
default:
break;
}
}
int myvfprintf(FILE *fp, char const *form, va_list argp) {
int n = 0;
char const *p;
for (p = form; *p; p++) {
switch (*p) {
case '%':
task_percent(fp, &p, &n, &argp);
break;
default:
fputc(*p, fp);
n++;
}
}
return n;
}
int myprintf(char const *form, ...) {
int n;
va_list argp;
va_start(argp, form);
n = myvfprintf(stdout, form, argp);
va_end(argp);
return n;
}
int main() {
int a = 10, b = 20, c = 30, n;
n = myprintf("first: %d, second: %d, third: %d :", a, b, c);
myprintf("n = %d\n", n);
return 0;
}
/* end */