summaryrefslogtreecommitdiffstats
path: root/contrib/tcsh/tc.printf.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/tcsh/tc.printf.c')
-rw-r--r--contrib/tcsh/tc.printf.c171
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;
OpenPOWER on IntegriCloud