diff options
Diffstat (limited to 'src/nonstd/_printf.h')
| -rw-r--r-- | src/nonstd/_printf.h | 313 |
1 files changed, 0 insertions, 313 deletions
diff --git a/src/nonstd/_printf.h b/src/nonstd/_printf.h deleted file mode 100644 index 31b2d82e..00000000 --- a/src/nonstd/_printf.h +++ /dev/null @@ -1,313 +0,0 @@ -#include "_io.h" - -#define NUMBUFLEN 64 - -#define LEFT (1 << 0) -#define SIGN (1 << 1) -#define SPACE (1 << 2) -#define ALT (1 << 3) -#define ZERO (1 << 4) -#define UPPER (1 << 5) -#define UNSIGNED (1 << 6) - -static int __append(char *s, char *argstring, int nout, size_t n) -{ - s += nout; - while (*argstring) { - if (nout < (int)n) { - *s++ = *argstring; - } - nout++; - argstring++; - } - return nout; -} - -static void __itos(char *s, intmax_t n, int flags, int precision, int base) -{ - extern int toupper(int); - char digits[] = "0123456789abcdef"; - char sign = n < 0 ? '-' : '+'; - char buf[NUMBUFLEN]; - char *out = buf + NUMBUFLEN; - if (flags & UPPER && base > 10) { - size_t i; - for (i = 0; i < sizeof(digits); i++) { - digits[i] = (char)toupper(digits[i]); - } - } - *out = '\0'; - out--; - if (n == 0) { - *out = '0'; - out--; - } - while (n > 0) { - precision--; - *out = digits[n % base]; - n /= base; - out--; - } - if (flags & SIGN || sign == '-') { - *out = sign; - out--; - } - out++; - while ((*s++ = *out++) != 0) { - continue; - } -} - -int (__printf)(struct io_options *opt, const char * format, va_list arg) -{ - extern int isdigit(int); - extern int isupper(int); - - char buf[BUFSIZ]; - int nout = 0; - int fd = -1; - struct __FILE *f = NULL; - - intmax_t argint = 0; - void *argptr = NULL; - char numbuf[NUMBUFLEN]; - - size_t i; - size_t n = 0; - char *s = NULL; - - if (opt->stream) { - /* file based */ - f = opt->stream; - s = buf; - n = BUFSIZ; - flockfile(f); - } else if (opt->string) { - /* memory buffer */ - s = opt->string; - n = opt->maxlen; - } else { - /* file descriptor */ - s = buf; - n = BUFSIZ; - fd = opt->fd; - } - - for (i = 0; format[i] != 0; i++) { - /* - // zero of more flags "-+ #0" - // optional width "*" or decimal integer - // optional precision ".*" or ".[decimal]" - // optional length modifier "hh", "h", "l", "ll", "j", - // "z", "t", "L" - // conversion specifier "diouxXfFeEgGaAcspn%" - */ - int flags = 0; - /* uintmax_t width = 0; */ - int step = 0; - int precision = 0; - int base = 10; - enum { def, hh, h, l, ll, j, z, t, L } length = def; - - if (format[i] != '%') { - if (nout < (int)n) { - s[nout] = format[i]; - } - nout++; - continue; - } - - while (step == 0) { - i++; - switch (format[i]) { - case '-': flags |= LEFT; break; - case '+': flags |= SIGN; break; - case ' ': flags |= SPACE; break; - case '#': flags |= ALT; break; - case '0': flags |= ZERO; break; - default: step = 1; break; - } - } - - if (format[i] == '*') { - i++; - } else if (isdigit(format[i])) { - /* - char *end; - width = strtoumax(format + i, &end, 10); - i = end - format; - */ - } - - if (format[i] == '.') { - i++; - if (format[i] == '*') { - i++; - } else if (isdigit(format[i])) { - char *end; - precision = (int)strtoumax(format + i, &end, 10); - i = end - format; - } else { - /* invalid precision */ - nout = -nout; - goto end; - } - } - - if (format[i] == 'h') { - i++; - if (format[i] == 'h') { - i++; - length = hh; - } else { - length = h; - } - } else if (format[i] == 'l') { - i++; - if (format[i] == 'l') { - i++; - length = ll; - } else { - length = l; - } - } else if (format[i] == 'j') { - i++; - length = j; - } else if (format[i] == 'z') { - i++; - length = z; - } else if (format[i] == 't') { - i++; - length = t; - } else if (format[i] == 'L') { - i++; - length = L; - } - - if (isupper(format[i])) { - flags |= UPPER; - } - - switch (format[i]) { - case 'o': /* unsigned int */ - case 'u': - case 'x': - case 'X': - flags |= UNSIGNED; - - case 'd': /* int */ - case 'i': - switch (length) { - case hh: argint = (signed char)va_arg(arg, int); break; - case h: argint = (short int)va_arg(arg, int); break; - case l: argint = va_arg(arg, long int); break; - - #if defined __STDC_VERSION__ && 199901L <= __STDC_VERSION__ - case ll: argint = va_arg(arg, long long int); break; - #endif - - case j: argint = va_arg(arg, intmax_t); break; - case z: argint = va_arg(arg, size_t); break; - case t: argint = va_arg(arg, ptrdiff_t); break; - case L: nout = -nout; goto end; - default: argint = va_arg(arg, int); break; - } - if (format[i] == 'o') { - base = 8; - } else if (format[i] == 'x') { - base = 16; - } else if (format[i] == 'X') { - base = 16; - flags |= UPPER; - } else { - base = 10; - } - __itos(numbuf, (long int)argint, flags, precision, base); - nout = __append(s, numbuf, nout, n); - break; - - - case 'f': /* double [-]ddd.ddd */ - case 'F': - break; - - case 'e': /* double [-]d.ddde+/-dd */ - case 'E': - break; - - case 'g': /* double f or e see docs */ - case 'G': - break; - - case 'a': /* double as hex */ - case 'A': - break; - - case 'c': /* char */ - if (length == def) { - char c = va_arg(arg, int); - if (nout < (int)n) { - s[nout] = c; - } - nout++; - } else if (length == l) { - /* wint_t wc = va_arg(arg, wint_t); */ - /* char mb[MB_CUR_MAX + 1] = "WC"; */ - /* wctomb(mb, wc); */ - /* nout = __append(s, mb, nout, n); */ - } else { - nout = -nout; - goto end; - } - break; - - case 's': /* string */ - if (length == def) { - char *string = va_arg(arg, char *); - nout = __append(s, string, nout, n); - } else if (length == l) { - /*wchar_t *ws = va_arg(arg, wchar_t *); */ - /*char *mbs = malloc(wcslen(ws) * MB_CUR_MAX + 1); */ - /*wcstombs(mbs, ws, wcslen(ws) * MB_CUR_MAX + 1); */ - /*nout = __append(s, mbs, nout, n); */ - /*free(mbs); */ - nout = __append(s, "WIDE STRING", nout, n); - } else { - nout = -nout; - goto end; - } - - break; - - case 'p': /* pointer */ - argptr = va_arg(arg, void *); - nout = __append(s, "0x", nout, n); - __itos(numbuf, (intptr_t)argptr, ZERO, sizeof(argptr) * 2, 16); - nout = __append(s, numbuf, nout, n); - break; - - case 'n': /* write-back */ - break; - - case '%': /* literal '%' */ - if (nout < (int)n) { - s[nout] = '%'; - } - nout++; - break; - - default: /* undefined */ - return -nout; - } - } - - end: - if (f) { - fwrite(buf, 1, nout % BUFSIZ, f); - funlockfile(f); - } else if (fd != -1) { - write(fd, buf, nout % BUFSIZ); - } - - return nout; -} |
