int __printf_render_str(struct __printf_io *io, const struct printf_info *pi, const void *const *arg) { const char *p; wchar_t *wcp; char *convbuf; int l; if (pi->is_long || pi->spec == 'S') { wcp = *((wint_t **)arg[0]); if (wcp == NULL) return (__printf_out(io, pi, "(null)", 6)); convbuf = __wcsconv(wcp, pi->prec); if (convbuf == NULL) return (-1); l = __printf_out(io, pi, convbuf, strlen(convbuf)); free(convbuf); return (l); } p = *((char **)arg[0]); if (p == NULL) return (__printf_out(io, pi, "(null)", 6)); l = strlen(p); if (pi->prec >= 0 && pi->prec < l) l = pi->prec; return (__printf_out(io, pi, p, l)); }
int __printf_render_chr(struct __printf_io *io, const struct printf_info *pi, const void *const *arg) { int i; wint_t ii; unsigned char c; static const mbstate_t initial; /* XXX: this is bogus! */ mbstate_t mbs; size_t mbseqlen; char buf[MB_CUR_MAX]; if (pi->is_long || pi->spec == 'C') { ii = *((wint_t *)arg[0]); mbs = initial; mbseqlen = wcrtomb(buf, (wchar_t)ii, &mbs); if (mbseqlen == (size_t) -1) return (-1); return (__printf_out(io, pi, buf, mbseqlen)); } i = *((int *)arg[0]); c = i; i = __printf_out(io, pi, &c, 1); __printf_flush(io); return (i); }
int __printf_render_time(struct __printf_io *io, const struct printf_info *pi, const void *const *arg) { char buf[100]; char *p; struct timeval *tv; struct timespec *ts; time_t *tp; intmax_t t, tx; int i, prec, nsec; prec = 0; if (pi->is_long) { tv = *((struct timeval **)arg[0]); t = tv->tv_sec; nsec = tv->tv_usec * 1000; prec = 6; } else if (pi->is_long_double) { ts = *((struct timespec **)arg[0]); t = ts->tv_sec; nsec = ts->tv_nsec; prec = 9; } else { tp = *((time_t **)arg[0]); t = *tp; } p = buf; if (pi->alt) { tx = t; if (t >= YEAR) { p += sprintf(p, "%jdy", t / YEAR); t %= YEAR; } if (t >= DAY && t != 0) { p += sprintf(p, "%jdd", t / DAY); t %= DAY; } if (t >= HOUR && t != 0) { p += sprintf(p, "%jdh", t / HOUR); t %= HOUR; } if (t >= MINUTE && t != 0) { p += sprintf(p, "%jdm", t / MINUTE); t %= MINUTE; } if (t != 0 || tx == 0) p += sprintf(p, "%jds", t); } else { p += sprintf(p, "%jd", (intmax_t)t); } if (pi->is_long || pi->is_long_double) { if (pi->prec >= 0) prec = pi->prec; for (i = prec; i < 9; i++) nsec /= 10; p += sprintf(p, ".%.*d", prec, nsec); } return(__printf_out(io, pi, buf, p - buf)); }