16767bd61SMark Peek /* $Header: /src/pub/tcsh/tc.printf.c,v 3.21 2001/06/21 23:26:54 kim Exp $ */ 2c80476e4SDavid E. O'Brien /* 3c80476e4SDavid E. O'Brien * tc.printf.c: A public-domain, minimal printf/sprintf routine that prints 4c80476e4SDavid E. O'Brien * through the putchar() routine. Feel free to use for 5c80476e4SDavid E. O'Brien * anything... -- 7/17/87 Paul Placeway 6c80476e4SDavid E. O'Brien */ 7c80476e4SDavid E. O'Brien /*- 8c80476e4SDavid E. O'Brien * Copyright (c) 1980, 1991 The Regents of the University of California. 9c80476e4SDavid E. O'Brien * All rights reserved. 10c80476e4SDavid E. O'Brien * 11c80476e4SDavid E. O'Brien * Redistribution and use in source and binary forms, with or without 12c80476e4SDavid E. O'Brien * modification, are permitted provided that the following conditions 13c80476e4SDavid E. O'Brien * are met: 14c80476e4SDavid E. O'Brien * 1. Redistributions of source code must retain the above copyright 15c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer. 16c80476e4SDavid E. O'Brien * 2. Redistributions in binary form must reproduce the above copyright 17c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer in the 18c80476e4SDavid E. O'Brien * documentation and/or other materials provided with the distribution. 19c80476e4SDavid E. O'Brien * 3. All advertising materials mentioning features or use of this software 20c80476e4SDavid E. O'Brien * must display the following acknowledgement: 21c80476e4SDavid E. O'Brien * This product includes software developed by the University of 22c80476e4SDavid E. O'Brien * California, Berkeley and its contributors. 23c80476e4SDavid E. O'Brien * 4. Neither the name of the University nor the names of its contributors 24c80476e4SDavid E. O'Brien * may be used to endorse or promote products derived from this software 25c80476e4SDavid E. O'Brien * without specific prior written permission. 26c80476e4SDavid E. O'Brien * 27c80476e4SDavid E. O'Brien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 28c80476e4SDavid E. O'Brien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 29c80476e4SDavid E. O'Brien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 30c80476e4SDavid E. O'Brien * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 31c80476e4SDavid E. O'Brien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 32c80476e4SDavid E. O'Brien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 33c80476e4SDavid E. O'Brien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 34c80476e4SDavid E. O'Brien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 35c80476e4SDavid E. O'Brien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 36c80476e4SDavid E. O'Brien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 37c80476e4SDavid E. O'Brien * SUCH DAMAGE. 38c80476e4SDavid E. O'Brien */ 39c80476e4SDavid E. O'Brien #include "sh.h" 40c80476e4SDavid E. O'Brien 416767bd61SMark Peek RCSID("$Id: tc.printf.c,v 3.21 2001/06/21 23:26:54 kim Exp $") 42c80476e4SDavid E. O'Brien 43c80476e4SDavid E. O'Brien #ifdef lint 44c80476e4SDavid E. O'Brien #undef va_arg 45c80476e4SDavid E. O'Brien #define va_arg(a, b) (a ? (b) 0 : (b) 0) 46c80476e4SDavid E. O'Brien #endif 47c80476e4SDavid E. O'Brien 48c80476e4SDavid E. O'Brien #define INF 32766 /* should be bigger than any field to print */ 49c80476e4SDavid E. O'Brien 50c80476e4SDavid E. O'Brien static char buf[128]; 51c80476e4SDavid E. O'Brien 52c80476e4SDavid E. O'Brien static void xaddchar __P((int)); 53c80476e4SDavid E. O'Brien static void doprnt __P((void (*) __P((int)), const char *, va_list)); 54c80476e4SDavid E. O'Brien 55c80476e4SDavid E. O'Brien static void 56c80476e4SDavid E. O'Brien doprnt(addchar, sfmt, ap) 57c80476e4SDavid E. O'Brien void (*addchar) __P((int)); 58c80476e4SDavid E. O'Brien const char *sfmt; 59c80476e4SDavid E. O'Brien va_list ap; 60c80476e4SDavid E. O'Brien { 61c80476e4SDavid E. O'Brien register char *bp; 62c80476e4SDavid E. O'Brien register const char *f; 63c80476e4SDavid E. O'Brien #ifdef SHORT_STRINGS 64c80476e4SDavid E. O'Brien register Char *Bp; 65c80476e4SDavid E. O'Brien #endif /* SHORT_STRINGS */ 66c80476e4SDavid E. O'Brien register long l; 67c80476e4SDavid E. O'Brien register unsigned long u; 68c80476e4SDavid E. O'Brien register int i; 69c80476e4SDavid E. O'Brien register int fmt; 70c80476e4SDavid E. O'Brien register unsigned char pad = ' '; 71c80476e4SDavid E. O'Brien int flush_left = 0, f_width = 0, prec = INF, hash = 0, do_long = 0; 72c80476e4SDavid E. O'Brien int sign = 0; 73c80476e4SDavid E. O'Brien int attributes = 0; 74c80476e4SDavid E. O'Brien 75c80476e4SDavid E. O'Brien 76c80476e4SDavid E. O'Brien f = sfmt; 77c80476e4SDavid E. O'Brien for (; *f; f++) { 78c80476e4SDavid E. O'Brien if (*f != '%') { /* then just out the char */ 79c80476e4SDavid E. O'Brien (*addchar) ((int) (((unsigned char)*f) | attributes)); 80c80476e4SDavid E. O'Brien } 81c80476e4SDavid E. O'Brien else { 82c80476e4SDavid E. O'Brien f++; /* skip the % */ 83c80476e4SDavid E. O'Brien 84c80476e4SDavid E. O'Brien if (*f == '-') { /* minus: flush left */ 85c80476e4SDavid E. O'Brien flush_left = 1; 86c80476e4SDavid E. O'Brien f++; 87c80476e4SDavid E. O'Brien } 88c80476e4SDavid E. O'Brien 89c80476e4SDavid E. O'Brien if (*f == '0' || *f == '.') { 90c80476e4SDavid E. O'Brien /* padding with 0 rather than blank */ 91c80476e4SDavid E. O'Brien pad = '0'; 92c80476e4SDavid E. O'Brien f++; 93c80476e4SDavid E. O'Brien } 94c80476e4SDavid E. O'Brien if (*f == '*') { /* field width */ 95c80476e4SDavid E. O'Brien f_width = va_arg(ap, int); 96c80476e4SDavid E. O'Brien f++; 97c80476e4SDavid E. O'Brien } 98c80476e4SDavid E. O'Brien else if (Isdigit((unsigned char) *f)) { 99c80476e4SDavid E. O'Brien f_width = atoi(f); 100c80476e4SDavid E. O'Brien while (Isdigit((unsigned char) *f)) 101c80476e4SDavid E. O'Brien f++; /* skip the digits */ 102c80476e4SDavid E. O'Brien } 103c80476e4SDavid E. O'Brien 104c80476e4SDavid E. O'Brien if (*f == '.') { /* precision */ 105c80476e4SDavid E. O'Brien f++; 106c80476e4SDavid E. O'Brien if (*f == '*') { 107c80476e4SDavid E. O'Brien prec = va_arg(ap, int); 108c80476e4SDavid E. O'Brien f++; 109c80476e4SDavid E. O'Brien } 110c80476e4SDavid E. O'Brien else if (Isdigit((unsigned char) *f)) { 111c80476e4SDavid E. O'Brien prec = atoi((char *) f); 112c80476e4SDavid E. O'Brien while (Isdigit((unsigned char) *f)) 113c80476e4SDavid E. O'Brien f++; /* skip the digits */ 114c80476e4SDavid E. O'Brien } 115c80476e4SDavid E. O'Brien } 116c80476e4SDavid E. O'Brien 117c80476e4SDavid E. O'Brien if (*f == '#') { /* alternate form */ 118c80476e4SDavid E. O'Brien hash = 1; 119c80476e4SDavid E. O'Brien f++; 120c80476e4SDavid E. O'Brien } 121c80476e4SDavid E. O'Brien 122c80476e4SDavid E. O'Brien if (*f == 'l') { /* long format */ 123c80476e4SDavid E. O'Brien do_long = 1; 124c80476e4SDavid E. O'Brien f++; 125c80476e4SDavid E. O'Brien } 126c80476e4SDavid E. O'Brien 127c80476e4SDavid E. O'Brien fmt = (unsigned char) *f; 128c80476e4SDavid E. O'Brien if (fmt != 'S' && fmt != 'Q' && Isupper(fmt)) { 129c80476e4SDavid E. O'Brien do_long = 1; 130c80476e4SDavid E. O'Brien fmt = Tolower(fmt); 131c80476e4SDavid E. O'Brien } 132c80476e4SDavid E. O'Brien bp = buf; 133c80476e4SDavid E. O'Brien switch (fmt) { /* do the format */ 134c80476e4SDavid E. O'Brien case 'd': 135c80476e4SDavid E. O'Brien if (do_long) 136c80476e4SDavid E. O'Brien l = va_arg(ap, long); 137c80476e4SDavid E. O'Brien else 138c80476e4SDavid E. O'Brien l = (long) (va_arg(ap, int)); 139c80476e4SDavid E. O'Brien if (l < 0) { 140c80476e4SDavid E. O'Brien sign = 1; 141c80476e4SDavid E. O'Brien l = -l; 142c80476e4SDavid E. O'Brien } 143c80476e4SDavid E. O'Brien do { 144c80476e4SDavid E. O'Brien *bp++ = (char) (l % 10) + '0'; 145c80476e4SDavid E. O'Brien } while ((l /= 10) > 0); 146c80476e4SDavid E. O'Brien if (sign) 147c80476e4SDavid E. O'Brien *bp++ = '-'; 148c80476e4SDavid E. O'Brien f_width = f_width - (int) (bp - buf); 149c80476e4SDavid E. O'Brien if (!flush_left) 150c80476e4SDavid E. O'Brien while (f_width-- > 0) 151c80476e4SDavid E. O'Brien (*addchar) ((int) (pad | attributes)); 152c80476e4SDavid E. O'Brien for (bp--; bp >= buf; bp--) 153c80476e4SDavid E. O'Brien (*addchar) ((int) (((unsigned char) *bp) | attributes)); 154c80476e4SDavid E. O'Brien if (flush_left) 155c80476e4SDavid E. O'Brien while (f_width-- > 0) 156c80476e4SDavid E. O'Brien (*addchar) ((int) (' ' | attributes)); 157c80476e4SDavid E. O'Brien break; 158c80476e4SDavid E. O'Brien 159c80476e4SDavid E. O'Brien case 'o': 160c80476e4SDavid E. O'Brien case 'x': 161c80476e4SDavid E. O'Brien case 'u': 162c80476e4SDavid E. O'Brien if (do_long) 163c80476e4SDavid E. O'Brien u = va_arg(ap, unsigned long); 164c80476e4SDavid E. O'Brien else 165c80476e4SDavid E. O'Brien u = (unsigned long) (va_arg(ap, unsigned int)); 166c80476e4SDavid E. O'Brien if (fmt == 'u') { /* unsigned decimal */ 167c80476e4SDavid E. O'Brien do { 168c80476e4SDavid E. O'Brien *bp++ = (char) (u % 10) + '0'; 169c80476e4SDavid E. O'Brien } while ((u /= 10) > 0); 170c80476e4SDavid E. O'Brien } 171c80476e4SDavid E. O'Brien else if (fmt == 'o') { /* octal */ 172c80476e4SDavid E. O'Brien do { 173c80476e4SDavid E. O'Brien *bp++ = (char) (u % 8) + '0'; 174c80476e4SDavid E. O'Brien } while ((u /= 8) > 0); 175c80476e4SDavid E. O'Brien if (hash) 176c80476e4SDavid E. O'Brien *bp++ = '0'; 177c80476e4SDavid E. O'Brien } 178c80476e4SDavid E. O'Brien else if (fmt == 'x') { /* hex */ 179c80476e4SDavid E. O'Brien do { 180c80476e4SDavid E. O'Brien i = (int) (u % 16); 181c80476e4SDavid E. O'Brien if (i < 10) 182c80476e4SDavid E. O'Brien *bp++ = i + '0'; 183c80476e4SDavid E. O'Brien else 184c80476e4SDavid E. O'Brien *bp++ = i - 10 + 'a'; 185c80476e4SDavid E. O'Brien } while ((u /= 16) > 0); 186c80476e4SDavid E. O'Brien if (hash) { 187c80476e4SDavid E. O'Brien *bp++ = 'x'; 188c80476e4SDavid E. O'Brien *bp++ = '0'; 189c80476e4SDavid E. O'Brien } 190c80476e4SDavid E. O'Brien } 191c80476e4SDavid E. O'Brien i = f_width - (int) (bp - buf); 192c80476e4SDavid E. O'Brien if (!flush_left) 193c80476e4SDavid E. O'Brien while (i-- > 0) 194c80476e4SDavid E. O'Brien (*addchar) ((int) (pad | attributes)); 195c80476e4SDavid E. O'Brien for (bp--; bp >= buf; bp--) 196c80476e4SDavid E. O'Brien (*addchar) ((int) (((unsigned char) *bp) | attributes)); 197c80476e4SDavid E. O'Brien if (flush_left) 198c80476e4SDavid E. O'Brien while (i-- > 0) 199c80476e4SDavid E. O'Brien (*addchar) ((int) (' ' | attributes)); 200c80476e4SDavid E. O'Brien break; 201c80476e4SDavid E. O'Brien 202c80476e4SDavid E. O'Brien 203c80476e4SDavid E. O'Brien case 'c': 204c80476e4SDavid E. O'Brien i = va_arg(ap, int); 205c80476e4SDavid E. O'Brien (*addchar) ((int) (i | attributes)); 206c80476e4SDavid E. O'Brien break; 207c80476e4SDavid E. O'Brien 208c80476e4SDavid E. O'Brien case 'S': 209c80476e4SDavid E. O'Brien case 'Q': 2106767bd61SMark Peek #ifdef SHORT_STRINGS 211c80476e4SDavid E. O'Brien Bp = va_arg(ap, Char *); 212c80476e4SDavid E. O'Brien if (!Bp) { 213c80476e4SDavid E. O'Brien bp = NULL; 214c80476e4SDavid E. O'Brien goto lcase_s; 215c80476e4SDavid E. O'Brien } 216c80476e4SDavid E. O'Brien f_width = f_width - Strlen(Bp); 217c80476e4SDavid E. O'Brien if (!flush_left) 218c80476e4SDavid E. O'Brien while (f_width-- > 0) 219c80476e4SDavid E. O'Brien (*addchar) ((int) (pad | attributes)); 220c80476e4SDavid E. O'Brien for (i = 0; *Bp && i < prec; i++) { 221c80476e4SDavid E. O'Brien if (fmt == 'Q' && *Bp & QUOTE) 222c80476e4SDavid E. O'Brien (*addchar) ((int) ('\\' | attributes)); 223c80476e4SDavid E. O'Brien (*addchar) ((int) ((*Bp & TRIM) | attributes)); 224c80476e4SDavid E. O'Brien Bp++; 225c80476e4SDavid E. O'Brien } 226c80476e4SDavid E. O'Brien if (flush_left) 227c80476e4SDavid E. O'Brien while (f_width-- > 0) 228c80476e4SDavid E. O'Brien (*addchar) ((int) (' ' | attributes)); 229c80476e4SDavid E. O'Brien break; 2306767bd61SMark Peek #endif /* SHORT_STRINGS */ 231c80476e4SDavid E. O'Brien 232c80476e4SDavid E. O'Brien case 's': 233c80476e4SDavid E. O'Brien case 'q': 234c80476e4SDavid E. O'Brien bp = va_arg(ap, char *); 235c80476e4SDavid E. O'Brien lcase_s: 236c80476e4SDavid E. O'Brien if (!bp) 237c80476e4SDavid E. O'Brien bp = "(nil)"; 238c80476e4SDavid E. O'Brien f_width = f_width - strlen((char *) bp); 239c80476e4SDavid E. O'Brien if (!flush_left) 240c80476e4SDavid E. O'Brien while (f_width-- > 0) 241c80476e4SDavid E. O'Brien (*addchar) ((int) (pad | attributes)); 242c80476e4SDavid E. O'Brien for (i = 0; *bp && i < prec; i++) { 243c80476e4SDavid E. O'Brien if (fmt == 'q' && *bp & QUOTE) 244c80476e4SDavid E. O'Brien (*addchar) ((int) ('\\' | attributes)); 245c80476e4SDavid E. O'Brien (*addchar) ((int) (((unsigned char) *bp & TRIM) | 246c80476e4SDavid E. O'Brien attributes)); 247c80476e4SDavid E. O'Brien bp++; 248c80476e4SDavid E. O'Brien } 249c80476e4SDavid E. O'Brien if (flush_left) 250c80476e4SDavid E. O'Brien while (f_width-- > 0) 251c80476e4SDavid E. O'Brien (*addchar) ((int) (' ' | attributes)); 252c80476e4SDavid E. O'Brien break; 253c80476e4SDavid E. O'Brien 254c80476e4SDavid E. O'Brien case 'a': 255c80476e4SDavid E. O'Brien attributes = va_arg(ap, int); 256c80476e4SDavid E. O'Brien break; 257c80476e4SDavid E. O'Brien 258c80476e4SDavid E. O'Brien case '%': 259c80476e4SDavid E. O'Brien (*addchar) ((int) ('%' | attributes)); 260c80476e4SDavid E. O'Brien break; 261c80476e4SDavid E. O'Brien 262c80476e4SDavid E. O'Brien default: 263c80476e4SDavid E. O'Brien break; 264c80476e4SDavid E. O'Brien } 265c80476e4SDavid E. O'Brien flush_left = 0, f_width = 0, prec = INF, hash = 0, do_long = 0; 266c80476e4SDavid E. O'Brien sign = 0; 267c80476e4SDavid E. O'Brien pad = ' '; 268c80476e4SDavid E. O'Brien } 269c80476e4SDavid E. O'Brien } 270c80476e4SDavid E. O'Brien } 271c80476e4SDavid E. O'Brien 272c80476e4SDavid E. O'Brien 273c80476e4SDavid E. O'Brien static char *xstring, *xestring; 274c80476e4SDavid E. O'Brien static void 275c80476e4SDavid E. O'Brien xaddchar(c) 276c80476e4SDavid E. O'Brien int c; 277c80476e4SDavid E. O'Brien { 278c80476e4SDavid E. O'Brien if (xestring == xstring) 279c80476e4SDavid E. O'Brien *xstring = '\0'; 280c80476e4SDavid E. O'Brien else 281c80476e4SDavid E. O'Brien *xstring++ = (char) c; 282c80476e4SDavid E. O'Brien } 283c80476e4SDavid E. O'Brien 284c80476e4SDavid E. O'Brien 285c80476e4SDavid E. O'Brien pret_t 286c80476e4SDavid E. O'Brien /*VARARGS*/ 287c80476e4SDavid E. O'Brien #ifdef FUNCPROTO 288c80476e4SDavid E. O'Brien xsnprintf(char *str, size_t size, const char *fmt, ...) 289c80476e4SDavid E. O'Brien #else 290c80476e4SDavid E. O'Brien xsnprintf(va_alist) 291c80476e4SDavid E. O'Brien va_dcl 292c80476e4SDavid E. O'Brien #endif 293c80476e4SDavid E. O'Brien { 294c80476e4SDavid E. O'Brien va_list va; 295c80476e4SDavid E. O'Brien #ifdef FUNCPROTO 296c80476e4SDavid E. O'Brien va_start(va, fmt); 297c80476e4SDavid E. O'Brien #else 298c80476e4SDavid E. O'Brien char *str, *fmt; 299c80476e4SDavid E. O'Brien size_t size; 300c80476e4SDavid E. O'Brien 301c80476e4SDavid E. O'Brien va_start(va); 302c80476e4SDavid E. O'Brien str = va_arg(va, char *); 303c80476e4SDavid E. O'Brien size = va_arg(va, size_t); 304c80476e4SDavid E. O'Brien fmt = va_arg(va, char *); 305c80476e4SDavid E. O'Brien #endif 306c80476e4SDavid E. O'Brien 307c80476e4SDavid E. O'Brien xstring = str; 308c80476e4SDavid E. O'Brien xestring = str + size - 1; 309c80476e4SDavid E. O'Brien doprnt(xaddchar, fmt, va); 310c80476e4SDavid E. O'Brien va_end(va); 311c80476e4SDavid E. O'Brien *xstring++ = '\0'; 312c80476e4SDavid E. O'Brien #ifdef PURIFY 313c80476e4SDavid E. O'Brien return 1; 314c80476e4SDavid E. O'Brien #endif 315c80476e4SDavid E. O'Brien } 316c80476e4SDavid E. O'Brien 317c80476e4SDavid E. O'Brien pret_t 318c80476e4SDavid E. O'Brien /*VARARGS*/ 319c80476e4SDavid E. O'Brien #ifdef FUNCPROTO 320c80476e4SDavid E. O'Brien xprintf(const char *fmt, ...) 321c80476e4SDavid E. O'Brien #else 322c80476e4SDavid E. O'Brien xprintf(va_alist) 323c80476e4SDavid E. O'Brien va_dcl 324c80476e4SDavid E. O'Brien #endif 325c80476e4SDavid E. O'Brien { 326c80476e4SDavid E. O'Brien va_list va; 327c80476e4SDavid E. O'Brien #ifdef FUNCPROTO 328c80476e4SDavid E. O'Brien va_start(va, fmt); 329c80476e4SDavid E. O'Brien #else 330c80476e4SDavid E. O'Brien char *fmt; 331c80476e4SDavid E. O'Brien 332c80476e4SDavid E. O'Brien va_start(va); 333c80476e4SDavid E. O'Brien fmt = va_arg(va, char *); 334c80476e4SDavid E. O'Brien #endif 335c80476e4SDavid E. O'Brien doprnt(xputchar, fmt, va); 336c80476e4SDavid E. O'Brien va_end(va); 337c80476e4SDavid E. O'Brien #ifdef PURIFY 338c80476e4SDavid E. O'Brien return 1; 339c80476e4SDavid E. O'Brien #endif 340c80476e4SDavid E. O'Brien } 341c80476e4SDavid E. O'Brien 342c80476e4SDavid E. O'Brien 343c80476e4SDavid E. O'Brien pret_t 344c80476e4SDavid E. O'Brien xvprintf(fmt, va) 345c80476e4SDavid E. O'Brien const char *fmt; 346c80476e4SDavid E. O'Brien va_list va; 347c80476e4SDavid E. O'Brien { 348c80476e4SDavid E. O'Brien doprnt(xputchar, fmt, va); 349c80476e4SDavid E. O'Brien #ifdef PURIFY 350c80476e4SDavid E. O'Brien return 1; 351c80476e4SDavid E. O'Brien #endif 352c80476e4SDavid E. O'Brien } 353c80476e4SDavid E. O'Brien 354c80476e4SDavid E. O'Brien pret_t 355c80476e4SDavid E. O'Brien xvsnprintf(str, size, fmt, va) 356c80476e4SDavid E. O'Brien char *str; 357c80476e4SDavid E. O'Brien size_t size; 358c80476e4SDavid E. O'Brien const char *fmt; 359c80476e4SDavid E. O'Brien va_list va; 360c80476e4SDavid E. O'Brien { 361c80476e4SDavid E. O'Brien xstring = str; 362c80476e4SDavid E. O'Brien xestring = str + size - 1; 363c80476e4SDavid E. O'Brien doprnt(xaddchar, fmt, va); 364c80476e4SDavid E. O'Brien *xstring++ = '\0'; 365c80476e4SDavid E. O'Brien #ifdef PURIFY 366c80476e4SDavid E. O'Brien return 1; 367c80476e4SDavid E. O'Brien #endif 368c80476e4SDavid E. O'Brien } 369c80476e4SDavid E. O'Brien 370c80476e4SDavid E. O'Brien 371c80476e4SDavid E. O'Brien 372c80476e4SDavid E. O'Brien #ifdef PURIFY 373c80476e4SDavid E. O'Brien /* Purify uses (some of..) the following functions to output memory-use 374c80476e4SDavid E. O'Brien * debugging info. Given all the messing with file descriptors that 375c80476e4SDavid E. O'Brien * tcsh does, the easiest way I could think of to get it (Purify) to 376c80476e4SDavid E. O'Brien * print anything was by replacing some standard functions with 377c80476e4SDavid E. O'Brien * ones that do tcsh output directly - see dumb hook in doreaddirs() 378c80476e4SDavid E. O'Brien * (sh.dir.c) -sg 379c80476e4SDavid E. O'Brien */ 380c80476e4SDavid E. O'Brien #ifndef FILE 381c80476e4SDavid E. O'Brien #define FILE int 382c80476e4SDavid E. O'Brien #endif 383c80476e4SDavid E. O'Brien int 384c80476e4SDavid E. O'Brien #ifdef FUNCPROTO 385c80476e4SDavid E. O'Brien fprintf(FILE *fp, const char* fmt, ...) 386c80476e4SDavid E. O'Brien #else 387c80476e4SDavid E. O'Brien fprintf(va_alist) 388c80476e4SDavid E. O'Brien va_dcl 389c80476e4SDavid E. O'Brien #endif 390c80476e4SDavid E. O'Brien { 391c80476e4SDavid E. O'Brien va_list va; 392c80476e4SDavid E. O'Brien #ifdef FUNCPROTO 393c80476e4SDavid E. O'Brien va_start(va, fmt); 394c80476e4SDavid E. O'Brien #else 395c80476e4SDavid E. O'Brien FILE *fp; 396c80476e4SDavid E. O'Brien const char *fmt; 397c80476e4SDavid E. O'Brien 398c80476e4SDavid E. O'Brien va_start(va); 399c80476e4SDavid E. O'Brien fp = va_arg(va, FILE *); 400c80476e4SDavid E. O'Brien fmt = va_arg(va, const char *); 401c80476e4SDavid E. O'Brien #endif 402c80476e4SDavid E. O'Brien doprnt(xputchar, fmt, va); 403c80476e4SDavid E. O'Brien va_end(va); 404c80476e4SDavid E. O'Brien return 1; 405c80476e4SDavid E. O'Brien } 406c80476e4SDavid E. O'Brien 407c80476e4SDavid E. O'Brien int 408c80476e4SDavid E. O'Brien vfprintf(fp, fmt, va) 409c80476e4SDavid E. O'Brien FILE *fp; 410c80476e4SDavid E. O'Brien const char *fmt; 411c80476e4SDavid E. O'Brien va_list va; 412c80476e4SDavid E. O'Brien { 413c80476e4SDavid E. O'Brien doprnt(xputchar, fmt, va); 414c80476e4SDavid E. O'Brien return 1; 415c80476e4SDavid E. O'Brien } 416c80476e4SDavid E. O'Brien 417c80476e4SDavid E. O'Brien #endif /* PURIFY */ 418