diff options
Diffstat (limited to 'contrib/tcsh/tc.printf.c')
-rw-r--r-- | contrib/tcsh/tc.printf.c | 171 |
1 files changed, 82 insertions, 89 deletions
diff --git a/contrib/tcsh/tc.printf.c b/contrib/tcsh/tc.printf.c index e07a5af..8db69d5 100644 --- a/contrib/tcsh/tc.printf.c +++ b/contrib/tcsh/tc.printf.c @@ -1,4 +1,4 @@ -/* $Header: /src/pub/tcsh/tc.printf.c,v 3.27 2005/01/05 16:06:15 christos Exp $ */ +/* $Header: /p/tcsh/cvsroot/tcsh/tc.printf.c,v 3.35 2006/03/02 18:46:45 christos Exp $ */ /* * tc.printf.c: A public-domain, minimal printf/sprintf routine that prints * through the putchar() routine. Feel free to use for @@ -34,31 +34,27 @@ */ #include "sh.h" -RCSID("$Id: tc.printf.c,v 3.27 2005/01/05 16:06:15 christos Exp $") +RCSID("$tcsh: tc.printf.c,v 3.35 2006/03/02 18:46:45 christos Exp $") #ifdef lint #undef va_arg #define va_arg(a, b) (a ? (b) 0 : (b) 0) #endif -#define INF 32766 /* should be bigger than any field to print */ +#define INF INT_MAX /* should be bigger than any field to print */ -static char buf[128]; static char snil[] = "(nil)"; -static void xaddchar __P((int)); -static void doprnt __P((void (*) __P((int)), const char *, va_list)); +static void xaddchar (int); +static void doprnt (void (*) (int), const char *, va_list); static void -doprnt(addchar, sfmt, ap) - void (*addchar) __P((int)); - const char *sfmt; - va_list ap; +doprnt(void (*addchar) (int), const char *sfmt, va_list ap) { char *bp; const char *f; #ifdef SHORT_STRINGS - Char *Bp; + const Char *Bp; #endif /* SHORT_STRINGS */ #ifdef HAVE_LONG_LONG long long l; @@ -67,10 +63,12 @@ doprnt(addchar, sfmt, ap) long l; unsigned long u; #endif + char buf[(CHAR_BIT * sizeof (l) + 2) / 3 + 1]; /* Octal: 3 bits per char */ int i; int fmt; unsigned char pad = ' '; - int flush_left = 0, f_width = 0, prec = INF, hash = 0, do_long = 0; + int flush_left = 0, f_width = 0, prec = INF, hash = 0; + int do_long = 0, do_size_t = 0; int sign = 0; int attributes = 0; @@ -78,7 +76,7 @@ doprnt(addchar, sfmt, ap) f = sfmt; for (; *f; f++) { if (*f != '%') { /* then just out the char */ - (*addchar) ((int) (((unsigned char)*f) | attributes)); + (*addchar) (((unsigned char)*f) | attributes); } else { f++; /* skip the % */ @@ -129,6 +127,10 @@ doprnt(addchar, sfmt, ap) f++; } } + if (*f == 'z') { /* size_t format */ + do_size_t++; + f++; + } fmt = (unsigned char) *f; if (fmt != 'S' && fmt != 'Q' && isupper(fmt)) { @@ -140,7 +142,10 @@ doprnt(addchar, sfmt, ap) case 'd': switch (do_long) { case 0: - l = (long) (va_arg(ap, int)); + if (do_size_t) + l = (long) (va_arg(ap, size_t)); + else + l = (long) (va_arg(ap, int)); break; case 1: #ifndef HAVE_LONG_LONG @@ -167,12 +172,12 @@ doprnt(addchar, sfmt, ap) f_width = f_width - (int) (bp - buf); if (!flush_left) while (f_width-- > 0) - (*addchar) ((int) (pad | attributes)); + (*addchar) (pad | attributes); for (bp--; bp >= buf; bp--) - (*addchar) ((int) (((unsigned char) *bp) | attributes)); + (*addchar) (((unsigned char) *bp) | attributes); if (flush_left) while (f_width-- > 0) - (*addchar) ((int) (' ' | attributes)); + (*addchar) (' ' | attributes); break; case 'p': @@ -185,7 +190,10 @@ doprnt(addchar, sfmt, ap) case 'u': switch (do_long) { case 0: - u = (unsigned long) (va_arg(ap, unsigned int)); + if (do_size_t) + u = va_arg(ap, size_t); + else + u = va_arg(ap, unsigned int); break; case 1: #ifndef HAVE_LONG_LONG @@ -227,18 +235,18 @@ doprnt(addchar, sfmt, ap) i = f_width - (int) (bp - buf); if (!flush_left) while (i-- > 0) - (*addchar) ((int) (pad | attributes)); + (*addchar) (pad | attributes); for (bp--; bp >= buf; bp--) - (*addchar) ((int) (((unsigned char) *bp) | attributes)); + (*addchar) (((unsigned char) *bp) | attributes); if (flush_left) while (i-- > 0) - (*addchar) ((int) (' ' | attributes)); + (*addchar) (' ' | attributes); break; case 'c': i = va_arg(ap, int); - (*addchar) ((int) (i | attributes)); + (*addchar) (i | attributes); break; case 'S': @@ -258,16 +266,16 @@ doprnt(addchar, sfmt, ap) size_t pos, len; if (fmt == 'Q' && *Bp & QUOTE) - (*addchar) ((int) ('\\' | attributes)); + (*addchar) ('\\' | attributes); len = one_wctomb(cbuf, *Bp & CHAR); for (pos = 0; pos < len; pos++) - (*addchar) ((int) ((unsigned char)cbuf[pos] - | attributes | (*Bp & ATTRIBUTES))); + (*addchar) ((unsigned char)cbuf[pos] | attributes + | (*Bp & ATTRIBUTES)); Bp++; } if (flush_left) while (f_width-- > 0) - (*addchar) ((int) (' ' | attributes)); + (*addchar) (' ' | attributes); break; #endif /* SHORT_STRINGS */ @@ -277,20 +285,19 @@ doprnt(addchar, sfmt, ap) lcase_s: if (!bp) bp = snil; - f_width = f_width - strlen((char *) bp); + f_width = f_width - strlen(bp); if (!flush_left) while (f_width-- > 0) - (*addchar) ((int) (pad | attributes)); + (*addchar) (pad | attributes); for (i = 0; *bp && i < prec; i++) { if (fmt == 'q' && *bp & QUOTE) - (*addchar) ((int) ('\\' | attributes)); - (*addchar) ((int) (((unsigned char) *bp & TRIM) | - attributes)); + (*addchar) ('\\' | attributes); + (*addchar) (((unsigned char) *bp & TRIM) | attributes); bp++; } if (flush_left) while (f_width-- > 0) - (*addchar) ((int) (' ' | attributes)); + (*addchar) (' ' | attributes); break; case 'a': @@ -298,13 +305,14 @@ lcase_s: break; case '%': - (*addchar) ((int) ('%' | attributes)); + (*addchar) ('%' | attributes); break; default: break; } - flush_left = 0, f_width = 0, prec = INF, hash = 0, do_long = 0; + flush_left = 0, f_width = 0, prec = INF, hash = 0; + do_size_t = 0, do_long = 0; sign = 0; pad = ' '; } @@ -314,8 +322,7 @@ lcase_s: static char *xstring, *xestring; static void -xaddchar(c) - int c; +xaddchar(int c) { if (xestring == xstring) *xstring = '\0'; @@ -326,25 +333,10 @@ xaddchar(c) pret_t /*VARARGS*/ -#ifdef PROTOTYPES xsnprintf(char *str, size_t size, const char *fmt, ...) -#else -xsnprintf(va_alist) - va_dcl -#endif { va_list va; -#ifdef PROTOTYPES va_start(va, fmt); -#else - char *str, *fmt; - size_t size; - - va_start(va); - str = va_arg(va, char *); - size = va_arg(va, size_t); - fmt = va_arg(va, char *); -#endif xstring = str; xestring = str + size - 1; @@ -358,22 +350,10 @@ xsnprintf(va_alist) pret_t /*VARARGS*/ -#ifdef PROTOTYPES xprintf(const char *fmt, ...) -#else -xprintf(va_alist) - va_dcl -#endif { va_list va; -#ifdef PROTOTYPES va_start(va, fmt); -#else - char *fmt; - - va_start(va); - fmt = va_arg(va, char *); -#endif doprnt(xputchar, fmt, va); va_end(va); #ifdef PURIFY @@ -383,9 +363,7 @@ xprintf(va_alist) pret_t -xvprintf(fmt, va) - const char *fmt; - va_list va; +xvprintf(const char *fmt, va_list va) { doprnt(xputchar, fmt, va); #ifdef PURIFY @@ -394,11 +372,7 @@ xvprintf(fmt, va) } pret_t -xvsnprintf(str, size, fmt, va) - char *str; - size_t size; - const char *fmt; - va_list va; +xvsnprintf(char *str, size_t size, const char *fmt, va_list va) { xstring = str; xestring = str + size - 1; @@ -409,6 +383,42 @@ xvsnprintf(str, size, fmt, va) #endif } +char * +xvasprintf(const char *fmt, va_list va) +{ + size_t size; + char *buf; + + buf = NULL; + size = 2048; /* Arbitrary */ + for (;;) { + va_list copy; + + buf = xrealloc(buf, size); + xstring = buf; + xestring = buf + size - 1; + va_copy(copy, va); + doprnt(xaddchar, fmt, copy); + va_end(copy); + if (xstring < xestring) + break; + size *= 2; + } + *xstring++ = '\0'; + return xrealloc(buf, xstring - buf); +} + +char * +xasprintf(const char *fmt, ...) +{ + va_list va; + char *ret; + + va_start (va, fmt); + ret = xvasprintf(fmt, va); + va_end(va); + return ret; +} #ifdef PURIFY @@ -423,34 +433,17 @@ xvsnprintf(str, size, fmt, va) #define FILE int #endif int -#ifdef PROTOTYPES fprintf(FILE *fp, const char* fmt, ...) -#else -fprintf(va_alist) - va_dcl -#endif { va_list va; -#ifdef PROTOTYPES va_start(va, fmt); -#else - FILE *fp; - const char *fmt; - - va_start(va); - fp = va_arg(va, FILE *); - fmt = va_arg(va, const char *); -#endif doprnt(xputchar, fmt, va); va_end(va); return 1; } int -vfprintf(fp, fmt, va) - FILE *fp; - const char *fmt; - va_list va; +vfprintf(FILE *fp, const char *fmt, va_list va) { doprnt(xputchar, fmt, va); return 1; |