34 static char *ksprintn(
char *nbuf,
uintmax_t num,
int base,
int *lenp,
int upper);
36 static __inline int imax(
int a,
int b) {
37 return (a > b ? a : b);
47 static void __shl(
register digit *p,
register int len,
register int sh) {
50 for (i = 0; i < len; i++)
53 p[i] =
LHALF(p[i] << sh);
59 register digit v1, v2;
62 digit uspace[5], vspace[5], qspace[5];
69 static const volatile unsigned int zero = 0;
71 tmp.
ul[
H] = tmp.
ul[
L] = 1 / zero;
109 for (n = 4; v[1] == 0; v++) {
112 digit q1, q2, q3, q4;
142 for (m = 4 - n; u[1] == 0; u++)
144 for (i = 4 - m; --i >= 0;)
155 for (t = v[1]; t <
B / 2; t <<= 1)
158 __shl(&u[0], m + n, d);
159 __shl(&v[1], n - 1, d);
168 register digit uj0, uj1, uj2;
191 while (v2 * qhat >
COMBINE(rhat, uj2)) {
192 qhat_too_big: qhat--;
193 if ((rhat += v1) >=
B)
202 for (t = 0, i = n; i > 0; i--) {
203 t = u[i + j] - v[i] * qhat - t;
217 for (t = 0, i = n; i > 0; i--) {
218 t += u[i + j] + v[i];
222 u[j] =
LHALF(u[j] + t);
234 for (i = m + n; i > m; --i)
315 int kvprintf(
const char *fmt,
void (*func)(
int,
void*),
void *arg,
int radix,
va_list ap) {
316 #define PCHAR(c) {int cc=(c); if (func) (*func)(cc,arg); else *d++ = cc; retval++; }
319 const char *p, *percent, *
q;
323 int base, lflag, qflag, tmp, width, ladjust, sharpflag, neg, sign, dot;
324 int cflag, hflag, jflag, tflag, zflag;
327 int stop = 0, retval = 0;
336 fmt =
"(fmt null)\n";
338 if (radix < 2 || radix > 36)
344 while ((ch = (
u_char) *fmt++) !=
'%' || stop) {
364 reswitch:
switch (ch = (
u_char) *fmt++) {
407 for (n = 0;; ++fmt) {
408 n = n * 10 + ch -
'0';
410 if (ch < '0' || ch >
'9')
421 for (
q = ksprintn(nbuf, num, *p++,
NULL, 0); *
q;)
430 if (num & (1 << (n - 1))) {
431 PCHAR(tmp ?
',' :
'<');
432 for (; (n = *p) >
' '; ++p)
437 for (; *p >
' '; ++p)
492 *(
va_arg(ap,
long *)) = retval;
494 *(
va_arg(ap,
size_t *)) = retval;
496 *(
va_arg(ap,
short *)) = retval;
498 *(
va_arg(ap,
char *)) = retval;
500 *(
va_arg(ap,
int *)) = retval;
507 sharpflag = (width == 0);
526 for (n = 0; n < dwidth && p[n]; n++)
531 if (!ladjust && width > 0)
538 if (ladjust && width > 0)
561 handle_nosign: sign = 0;
579 handle_sign:
if (jflag)
590 num = (short)
va_arg(ap,
int);
592 num = (char)
va_arg(ap,
int);
595 number:
if (sign && (
intmax_t) num < 0) {
599 p = ksprintn(nbuf, num, base, &n, upper);
601 if (sharpflag && num != 0) {
610 if (!ladjust && padc ==
'0')
611 dwidth = width - tmp;
612 width -= tmp + imax(dwidth, n);
621 if (sharpflag && num != 0) {
625 else if (base == 16) {
645 while (percent < fmt)
662 static char *ksprintn(
char *nbuf,
uintmax_t num,
int base,
int *lenp,
int upper) {
671 }
while (num /= base);