diff --git a/sys/include/string.h b/sys/include/string.h index 3a285d0..781da93 100644 --- a/sys/include/string.h +++ b/sys/include/string.h @@ -48,8 +48,7 @@ char *strtok_r(char *str, const char *sep, char **last); char *strstr(const char *s, char *find); -#define toupper(c) ((c) - 0x20 * (((c) >= 'a') && ((c) <= 'z'))) -#define tolower(c) ((c) + 0x20 * (((c) >= 'A') && ((c) <= 'Z'))) + #ifdef __cplusplus extern "C" { diff --git a/sys/lib/kprintf.c b/sys/lib/kprintf.c index 25e95dc..c3982a4 100644 --- a/sys/lib/kprintf.c +++ b/sys/lib/kprintf.c @@ -67,7 +67,7 @@ */ if (vq == 0) { /* divide by zero. */ - static const volatile unsigned int zero = 0; + static const volatile unsigned int zero = 0; tmp.ul[H] = tmp.ul[L] = 1 / zero; if (arq) @@ -223,7 +223,8 @@ u[j] = LHALF(u[j] + t); } q[j] = qhat; - } while (++j <= m); /* D7: loop on j. */ + } + while (++j <= m); /* D7: loop on j. */ /* * If caller wants the remainder, we have to calculate it as @@ -265,6 +266,7 @@ va_start(ap, fmt); retval = kvprintf(fmt, NULL, &buf, 10, ap); + buf[retval] = '\0'; va_end(ap); @@ -283,7 +285,7 @@ va_start(args, fmt); - /* i = vsprintf( buf, fmt, args ); */ + /* i = vsprintf( buf, fmt, args ); */ i = kvprintf(fmt, NULL, buf, 10, args); va_end(args); @@ -319,7 +321,9 @@ */ int kvprintf(const char *fmt, void (*func)(int, void*), void *arg, int radix, va_list ap) { + #define PCHAR(c) {int cc=(c); if (func) (*func)(cc,arg); else *d++ = cc; retval++; } + char nbuf[MAXNBUF]; char *d; const char *p, *percent, *q; @@ -345,13 +349,16 @@ radix = 10; for (;;) { + padc = ' '; width = 0; + while ((ch = (u_char) *fmt++) != '%' || stop) { if (ch == '\0') return (retval); PCHAR(ch); } + percent = fmt - 1; qflag = 0; lflag = 0; @@ -367,302 +374,307 @@ jflag = 0; tflag = 0; zflag = 0; + reswitch: switch (ch = (u_char) *fmt++) { - case '.': - dot = 1; - goto reswitch; - case '#': - sharpflag = 1; - goto reswitch; - case '+': - sign = 1; - goto reswitch; - case '-': - ladjust = 1; - goto reswitch; - case '%': - PCHAR(ch) - ; + case '.': + dot = 1; + goto reswitch; + case '#': + sharpflag = 1; + goto reswitch; + case '+': + sign = 1; + goto reswitch; + case '-': + ladjust = 1; + goto reswitch; + case '%': + PCHAR(ch) + ; break; - case '*': - if (!dot) { - width = va_arg(ap, int); - if (width < 0) { - ladjust = !ladjust; - width = -width; - } + case '*': + if (!dot) { + width = va_arg(ap, int); + if (width < 0) { + ladjust = !ladjust; + width = -width; } - else { - dwidth = va_arg(ap, int); - } + } + else { + dwidth = va_arg(ap, int); + } + goto reswitch; + case '0': + if (!dot) { + padc = '0'; goto reswitch; - case '0': - if (!dot) { - padc = '0'; - goto reswitch; - } - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - for (n = 0;; ++fmt) { - n = n * 10 + ch - '0'; - ch = *fmt; - if (ch < '0' || ch > '9') - break; - } - if (dot) - dwidth = n; - else - width = n; - goto reswitch; - case 'b': - num = (u_int) va_arg(ap, int); - p = va_arg(ap, char *); - for (q = ksprintn(nbuf, num, *p++, NULL, 0); *q;) - PCHAR(*q--) - ; - - if (num == 0) + } + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + for (n = 0;; ++fmt) { + n = n * 10 + ch - '0'; + ch = *fmt; + if (ch < '0' || ch > '9') break; + } + if (dot) + dwidth = n; + else + width = n; + goto reswitch; + case 'b': + num = (u_int) va_arg(ap, int); + p = va_arg(ap, char *); + for (q = ksprintn(nbuf, num, *p++, NULL, 0); *q;) + PCHAR(*q--) + ; - for (tmp = 0; *p;) { - n = *p++; - if (num & (1 << (n - 1))) { - PCHAR(tmp ? ',' : '<'); - for (; (n = *p) > ' '; ++p) - PCHAR(n); - tmp = 1; - } - else - for (; *p > ' '; ++p) - continue; - } - if (tmp) - PCHAR('>') - ; - break; - case 'c': - PCHAR(va_arg(ap, int)) - ; - break; - case 'D': - up = va_arg(ap, u_char *); - p = va_arg(ap, char *); - if (!width) - width = 16; - while (width--) { - PCHAR(hex2ascii( *up >> 4 )); - PCHAR(hex2ascii( *up & 0x0f )); - up++; - if (width) - for (q = p; *q; q++) - PCHAR(*q); - } - break; - case 'd': - case 'i': - base = 10; - sign = 1; - goto handle_sign; - case 'h': - if (hflag) { - hflag = 0; - cflag = 1; + if (num == 0) + break; + + for (tmp = 0; *p;) { + n = *p++; + if (num & (1 << (n - 1))) { + PCHAR(tmp ? ',' : '<'); + for (; (n = *p) > ' '; ++p) + PCHAR(n); + tmp = 1; } else - hflag = 1; - goto reswitch; - case 'j': - jflag = 1; - goto reswitch; - case 'l': - if (lflag) { - lflag = 0; - qflag = 1; - } - else - lflag = 1; - goto reswitch; - case 'n': - if (jflag) - *(va_arg(ap, intmax_t *)) = retval; - else if (qflag) - *(va_arg(ap, quad_t *)) = retval; - else if (lflag) - *(va_arg(ap, long *)) = retval; - else if (zflag) - *(va_arg(ap, size_t *)) = retval; - else if (hflag) - *(va_arg(ap, short *)) = retval; - else if (cflag) - *(va_arg(ap, char *)) = retval; - else - *(va_arg(ap, int *)) = retval; - break; - case 'o': - base = 8; - goto handle_nosign; - case 'p': - base = 16; - sharpflag = (width == 0); - sign = 0; - num = (uintptr_t) va_arg(ap, void *); - goto number; - case 'q': - qflag = 1; - goto reswitch; - case 'r': - base = radix; - if (sign) - goto handle_sign; - goto handle_nosign; - case 's': - p = va_arg(ap, char *); - if (p == NULL) - p = "(null)"; - if (!dot) - n = strlen(p); - else - for (n = 0; n < dwidth && p[n]; n++) + for (; *p > ' '; ++p) continue; - - width -= n; - - if (!ladjust && width > 0) - while (width--) - PCHAR(padc) - ; - while (n--) - PCHAR(*p++) - ; - if (ladjust && width > 0) - while (width--) - PCHAR(padc) - ; + } + if (tmp) + PCHAR('>') + ; break; - case 't': - tflag = 1; - goto reswitch; - case 'u': - base = 10; - goto handle_nosign; - case 'X': - upper = 1; - case 'x': - base = 16; - goto handle_nosign; - case 'y': - base = 16; - sign = 1; + case 'c': + PCHAR(va_arg(ap, int)) + ; + break; + case 'D': + up = va_arg(ap, u_char *); + p = va_arg(ap, char *); + if (!width) + width = 16; + while (width--) { + asm("nop"); + PCHAR(hex2ascii( *up >> 4 )); + asm("nop"); + PCHAR(hex2ascii( *up & 0x0f )); + asm("nop"); + up++; + if (width) + for (q = p; *q; q++) + PCHAR(*q); + } + break; + case 'd': + case 'i': + base = 10; + sign = 1; + goto handle_sign; + case 'h': + if (hflag) { + hflag = 0; + cflag = 1; + } + else + hflag = 1; + goto reswitch; + case 'j': + jflag = 1; + goto reswitch; + case 'l': + if (lflag) { + lflag = 0; + qflag = 1; + } + else + lflag = 1; + goto reswitch; + case 'n': + if (jflag) + *(va_arg(ap, intmax_t *)) = retval; + else if (qflag) + *(va_arg(ap, quad_t *)) = retval; + else if (lflag) + *(va_arg(ap, long *)) = retval; + else if (zflag) + *(va_arg(ap, size_t *)) = retval; + else if (hflag) + *(va_arg(ap, short *)) = retval; + else if (cflag) + *(va_arg(ap, char *)) = retval; + else + *(va_arg(ap, int *)) = retval; + break; + case 'o': + base = 8; + goto handle_nosign; + case 'p': + base = 16; + sharpflag = (width == 0); + sign = 0; + num = (uintptr_t) va_arg(ap, void *); + goto number; + case 'q': + qflag = 1; + goto reswitch; + case 'r': + base = radix; + if (sign) goto handle_sign; - case 'z': - zflag = 1; - goto reswitch; - handle_nosign: sign = 0; - if (jflag) - num = va_arg(ap, uintmax_t); - else if (qflag) - num = va_arg(ap, u_quad_t); - else if (tflag) - num = va_arg(ap, __ptrdiff_t); - else if (lflag) - num = va_arg(ap, u_long); - else if (zflag) - num = va_arg(ap, size_t); - else if (hflag) - num = (u_short) va_arg(ap, int); - else if (cflag) - num = (u_char) va_arg(ap, int); - else - num = va_arg(ap, u_int); - goto number; - handle_sign: if (jflag) - num = va_arg(ap, intmax_t); - else if (qflag) - num = va_arg(ap, quad_t); - else if (tflag) - num = va_arg(ap, __ptrdiff_t); - else if (lflag) - num = va_arg(ap, long); - else if (zflag) - num = va_arg(ap, ssize_t); - else if (hflag) - num = (short) va_arg(ap, int); - else if (cflag) - num = (char) va_arg(ap, int); - else - num = va_arg(ap, int); - number: if (sign && (intmax_t) num < 0) { - neg = 1; - num = -(intmax_t) num; - } - p = ksprintn(nbuf, num, base, &n, upper); - tmp = 0; - if (sharpflag && num != 0) { - if (base == 8) - tmp++; - else if (base == 16) - tmp += 2; - } - if (neg) + goto handle_nosign; + case 's': + p = va_arg(ap, char *); + if (p == NULL) + p = "(null)"; + if (!dot) + n = strlen(p); + else + for (n = 0; n < dwidth && p[n]; n++) + continue; + + width -= n; + + if (!ladjust && width > 0) + while (width--) + PCHAR(padc) + ; + while (n--) + PCHAR(*p++) + ; + if (ladjust && width > 0) + while (width--) + PCHAR(padc) + ; + break; + case 't': + tflag = 1; + goto reswitch; + case 'u': + base = 10; + goto handle_nosign; + case 'X': + upper = 1; + case 'x': + base = 16; + goto handle_nosign; + case 'y': + base = 16; + sign = 1; + goto handle_sign; + case 'z': + zflag = 1; + goto reswitch; + handle_nosign: sign = 0; + if (jflag) + num = va_arg(ap, uintmax_t); + else if (qflag) + num = va_arg(ap, u_quad_t); + else if (tflag) + num = va_arg(ap, __ptrdiff_t); + else if (lflag) + num = va_arg(ap, u_long); + else if (zflag) + num = va_arg(ap, size_t); + else if (hflag) + num = (u_short) va_arg(ap, int); + else if (cflag) + num = (u_char) va_arg(ap, int); + else + num = va_arg(ap, u_int); + goto number; + handle_sign: if (jflag) + num = va_arg(ap, intmax_t); + else if (qflag) + num = va_arg(ap, quad_t); + else if (tflag) + num = va_arg(ap, __ptrdiff_t); + else if (lflag) + num = va_arg(ap, long); + else if (zflag) + num = va_arg(ap, ssize_t); + else if (hflag) + num = (short) va_arg(ap, int); + else if (cflag) + num = (char) va_arg(ap, int); + else + num = va_arg(ap, int); + number: if (sign && (intmax_t) num < 0) { + neg = 1; + num = -(intmax_t) num; + } + p = ksprintn(nbuf, num, base, &n, upper); + tmp = 0; + if (sharpflag && num != 0) { + if (base == 8) tmp++; + else if (base == 16) + tmp += 2; + } + if (neg) + tmp++; - if (!ladjust && padc == '0') - dwidth = width - tmp; - width -= tmp + imax(dwidth, n); - dwidth -= n; - if (!ladjust) - while (width-- > 0) - PCHAR(' ') - ; - if (neg) - PCHAR('-') - ; - if (sharpflag && num != 0) { - if (base == 8) { - PCHAR('0'); - } - else if (base == 16) { - PCHAR('0'); - PCHAR('x'); - } + if (!ladjust && padc == '0') + dwidth = width - tmp; + width -= tmp + imax(dwidth, n); + dwidth -= n; + if (!ladjust) + while (width-- > 0) + PCHAR(' ') + ; + if (neg) + PCHAR('-') + ; + if (sharpflag && num != 0) { + if (base == 8) { + PCHAR('0'); } - while (dwidth-- > 0) - PCHAR('0') - ; + else if (base == 16) { + PCHAR('0'); + PCHAR('x'); + } + } + while (dwidth-- > 0) + PCHAR('0') + ; - while (*p) - PCHAR(*p--) - ; + while (*p) + PCHAR(*p--) + ; - if (ladjust) - while (width-- > 0) - PCHAR(' ') - ; + if (ladjust) + while (width-- > 0) + PCHAR(' ') + ; break; - default: - while (percent < fmt) - PCHAR(*percent++) - ; - /* - * Since we ignore a formatting argument it is no - * longer safe to obey the remaining formatting - * arguments as the arguments will no longer match - * the format specs. - */ - stop = 1; + default: + while (percent < fmt) + PCHAR(*percent++) + ; + /* + * Since we ignore a formatting argument it is no + * longer safe to obey the remaining formatting + * arguments as the arguments will no longer match + * the format specs. + */ + stop = 1; break; } } #undef PCHAR return (0); + } static char *ksprintn(char *nbuf, uintmax_t num, int base, int *lenp, int upper) { @@ -674,7 +686,8 @@ do { c = hex2ascii(num % base); *++p = upper ? toupper(c) : c; - } while (num /= base); + } + while (num /= base); if (lenp) *lenp = p - nbuf;