kprintn(void (*put)(int), UINTMAX_T ul, int base) #endif { /* hold a INTMAX_T in base 8 */ char *p, buf[(sizeof(INTMAX_T) * NBBY / 3) + 1 + 2 /* ALT + SIGN */]; #ifdef LIBSA_PRINTF_WIDTH_SUPPORT char *q; #endif p = buf; do { *p++ = hexdigits[ul % base]; #if defined(__minix) #ifdef LIBSA_PRINTF_WIDTH_SUPPORT /* LSC: Quick hack to support capital hex printout. */ if ((lflag & HEXCAP) && (*(p-1) >= 'a') && (*(p-1) <= 'z')) { *(p-1) -= 32; } #endif #endif /* defined(__minix) */ } while (ul /= base); #ifdef LIBSA_PRINTF_WIDTH_SUPPORT q = p; if (lflag & ALT && *(p - 1) != '0') { if (base == 8) { *p++ = '0'; } else if (base == 16) { *p++ = 'x'; *p++ = '0'; } } if (lflag & NEGATIVE) *p++ = '-'; else if (lflag & SIGN) *p++ = '+'; else if (lflag & SPACE) *p++ = ' '; width -= p - buf; if ((lflag & LADJUST) == 0) { while (p > q) put(*--p); } #endif RPAD(); RZERO(); do { put(*--p); } while (p > buf); LPAD(); }
kprintn(void (*put)(int), UINTMAX_T ul, int base) #endif { /* hold a INTMAX_T in base 8 */ char *p, buf[(sizeof(INTMAX_T) * NBBY / 3) + 1 + 2 /* ALT + SIGN */]; #ifdef LIBSA_PRINTF_WIDTH_SUPPORT char *q; #endif p = buf; do { *p++ = hexdigits[ul % base]; } while (ul /= base); #ifdef LIBSA_PRINTF_WIDTH_SUPPORT q = p; if (lflag & ALT && *(p - 1) != '0') { if (base == 8) { *p++ = '0'; } else if (base == 16) { *p++ = 'x'; *p++ = '0'; } } if (lflag & NEGATIVE) *p++ = '-'; else if (lflag & SIGN) *p++ = '+'; else if (lflag & SPACE) *p++ = ' '; width -= p - buf; if ((lflag & LADJUST) == 0) { while (p > q) put(*--p); } #endif RPAD(); RZERO(); do { put(*--p); } while (p > buf); LPAD(); }
static void kdoprnt(void (*put)(int), const char *fmt, va_list ap) { char *p; int ch; UINTMAX_T ul; int lflag; #ifdef LIBSA_PRINTF_WIDTH_SUPPORT int width; char *q; #endif for (;;) { while ((ch = *fmt++) != '%') { if (ch == '\0') return; put(ch); } lflag = 0; #ifdef LIBSA_PRINTF_WIDTH_SUPPORT width = 0; #endif reswitch: switch (ch = *fmt++) { #ifdef LIBSA_PRINTF_WIDTH_SUPPORT #if defined(__minix) /* LSC: FIXME: this is a simple hack which ignores the thing for now. */ case '.': /* eat up digits */ while( ((('1' >= *fmt) && ( *fmt <= '9')) || (*fmt == '*')) ) fmt++; fmt++; goto reswitch; #endif /* defined(__minix) */ case '#': lflag |= ALT; goto reswitch; case ' ': lflag |= SPACE; goto reswitch; case '-': lflag |= LADJUST; goto reswitch; case '+': lflag |= SIGN; goto reswitch; case '0': lflag |= ZEROPAD; goto reswitch; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': for (;;) { width *= 10; width += ch - '0'; ch = *fmt; if ((unsigned)ch - '0' > 9) break; ++fmt; } #endif goto reswitch; case 'l': #ifdef LIBSA_PRINTF_LONGLONG_SUPPORT if (*fmt == 'l') { ++fmt; lflag |= LLONG; } else #endif lflag |= LONG; goto reswitch; case 't': if (sizeof(PTRDIFF_T) == sizeof(long)) lflag |= LONG; goto reswitch; case 'z': if (sizeof(ssize_t) == sizeof(long)) lflag |= LONG; goto reswitch; case 'c': ch = va_arg(ap, int); #ifdef LIBSA_PRINTF_WIDTH_SUPPORT --width; #endif RPAD(); put(ch & 0xFF); LPAD(); break; case 's': p = va_arg(ap, char *); #ifdef LIBSA_PRINTF_WIDTH_SUPPORT for (q = p; *q != '\0'; ++q) continue; width -= q - p; #endif RPAD(); while ((ch = (unsigned char)*p++)) put(ch); LPAD(); break; case 'd': ul = #ifdef LIBSA_PRINTF_LONGLONG_SUPPORT (lflag & LLONG) ? va_arg(ap, longlong_t) : #endif (lflag & LONG) ? va_arg(ap, long) : va_arg(ap, int); if ((INTMAX_T)ul < 0) { ul = -(INTMAX_T)ul; #ifdef LIBSA_PRINTF_WIDTH_SUPPORT lflag |= NEGATIVE; #else put('-'); #endif } KPRINTN(10); break; case 'o': KPRINT(8); break; case 'u': KPRINT(10); break; case 'p': #ifdef LIBSA_PRINTF_WIDTH_SUPPORT lflag |= (LONG|ALT); #else put('0'); put('x'); #endif /* FALLTHROUGH */ case 'x': KPRINT(16); break; #if defined(__minix) case 'X': lflag |= HEXCAP; KPRINT(16); break; #endif /* defined(__minix) */ default: if (ch == '\0') return; put(ch); break; } } }