int vprintf (char* fmt_, va_list args_) { for (int i = 0; fmt_[i] != '\0'; i++) { if (fmt_[i] == '%') { union u_size u; u.l = va_arg(args_, unsigned long); switch (fmt_[i+1]) { case 'd':{ putint_i(u.i,10); }break; case 'i': { putint_i(u.i,10); }break; case 's':{ putc_s (u.p); }break; case 'c':{ putc_i (u.c); }break; case 'x':{ putc_s("0x"); putint_i(u.u,16); }break; } i++; } else { putc_i (fmt_[i]); } }
int puts_in(char *s, char **buffer, size_t *len) { int res = 0; for (int i = 0; s[i] != 0; ++i) { if (putc_s(s[i], buffer, len)) { ++res; } else { break; } } return res; }
int print_int(int64_t x, char **buffer, size_t *len) { if (x == LLONG_MIN) { return puts_in("-9223372036854775808", buffer, len); } int res = 0; if (x < 0) { if (putc_s('-', buffer, len)) { ++res; } x = -x; } return res + print_uint(x, 10, buffer, len); }
int print_uint(uint64_t x, int base, char **buffer, size_t *len) { static char buff[30]; if (x == 0) { return puts_in("0", buffer, len); } int i = 0; int res = 0; for (; x != 0; ++i) { buff[i] = x % base + '0'; if (buff[i] > 9 + '0') { buff[i] = buff[i] - '0' - 10 + 'a'; } x /= base; } for (int j = i - 1; j >= 0; --j) { if (putc_s(buff[j], buffer, len)) { ++res; } else { break; } } return res; }