1c80476e4SDavid E. O'Brien /* $Header: /src/pub/tcsh/tc.printf.c,v 3.19 1998/10/25 15:10:37 christos 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 41c80476e4SDavid E. O'Brien RCSID("$Id: tc.printf.c,v 3.19 1998/10/25 15:10:37 christos 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': 210c80476e4SDavid E. O'Brien Bp = va_arg(ap, Char *); 211c80476e4SDavid E. O'Brien if (!Bp) { 212c80476e4SDavid E. O'Brien bp = NULL; 213c80476e4SDavid E. O'Brien goto lcase_s; 214c80476e4SDavid E. O'Brien } 215c80476e4SDavid E. O'Brien f_width = f_width - Strlen(Bp); 216c80476e4SDavid E. O'Brien if (!flush_left) 217c80476e4SDavid E. O'Brien while (f_width-- > 0) 218c80476e4SDavid E. O'Brien (*addchar) ((int) (pad | attributes)); 219c80476e4SDavid E. O'Brien for (i = 0; *Bp && i < prec; i++) { 220c80476e4SDavid E. O'Brien if (fmt == 'Q' && *Bp & QUOTE) 221c80476e4SDavid E. O'Brien (*addchar) ((int) ('\\' | attributes)); 222c80476e4SDavid E. O'Brien (*addchar) ((int) ((*Bp & TRIM) | attributes)); 223c80476e4SDavid E. O'Brien Bp++; 224c80476e4SDavid E. O'Brien } 225c80476e4SDavid E. O'Brien if (flush_left) 226c80476e4SDavid E. O'Brien while (f_width-- > 0) 227c80476e4SDavid E. O'Brien (*addchar) ((int) (' ' | attributes)); 228c80476e4SDavid E. O'Brien break; 229c80476e4SDavid E. O'Brien 230c80476e4SDavid E. O'Brien case 's': 231c80476e4SDavid E. O'Brien case 'q': 232c80476e4SDavid E. O'Brien bp = va_arg(ap, char *); 233c80476e4SDavid E. O'Brien lcase_s: 234c80476e4SDavid E. O'Brien if (!bp) 235c80476e4SDavid E. O'Brien bp = "(nil)"; 236c80476e4SDavid E. O'Brien f_width = f_width - strlen((char *) bp); 237c80476e4SDavid E. O'Brien if (!flush_left) 238c80476e4SDavid E. O'Brien while (f_width-- > 0) 239c80476e4SDavid E. O'Brien (*addchar) ((int) (pad | attributes)); 240c80476e4SDavid E. O'Brien for (i = 0; *bp && i < prec; i++) { 241c80476e4SDavid E. O'Brien if (fmt == 'q' && *bp & QUOTE) 242c80476e4SDavid E. O'Brien (*addchar) ((int) ('\\' | attributes)); 243c80476e4SDavid E. O'Brien (*addchar) ((int) (((unsigned char) *bp & TRIM) | 244c80476e4SDavid E. O'Brien attributes)); 245c80476e4SDavid E. O'Brien bp++; 246c80476e4SDavid E. O'Brien } 247c80476e4SDavid E. O'Brien if (flush_left) 248c80476e4SDavid E. O'Brien while (f_width-- > 0) 249c80476e4SDavid E. O'Brien (*addchar) ((int) (' ' | attributes)); 250c80476e4SDavid E. O'Brien break; 251c80476e4SDavid E. O'Brien 252c80476e4SDavid E. O'Brien case 'a': 253c80476e4SDavid E. O'Brien attributes = va_arg(ap, int); 254c80476e4SDavid E. O'Brien break; 255c80476e4SDavid E. O'Brien 256c80476e4SDavid E. O'Brien case '%': 257c80476e4SDavid E. O'Brien (*addchar) ((int) ('%' | attributes)); 258c80476e4SDavid E. O'Brien break; 259c80476e4SDavid E. O'Brien 260c80476e4SDavid E. O'Brien default: 261c80476e4SDavid E. O'Brien break; 262c80476e4SDavid E. O'Brien } 263c80476e4SDavid E. O'Brien flush_left = 0, f_width = 0, prec = INF, hash = 0, do_long = 0; 264c80476e4SDavid E. O'Brien sign = 0; 265c80476e4SDavid E. O'Brien pad = ' '; 266c80476e4SDavid E. O'Brien } 267c80476e4SDavid E. O'Brien } 268c80476e4SDavid E. O'Brien } 269c80476e4SDavid E. O'Brien 270c80476e4SDavid E. O'Brien 271c80476e4SDavid E. O'Brien static char *xstring, *xestring; 272c80476e4SDavid E. O'Brien static void 273c80476e4SDavid E. O'Brien xaddchar(c) 274c80476e4SDavid E. O'Brien int c; 275c80476e4SDavid E. O'Brien { 276c80476e4SDavid E. O'Brien if (xestring == xstring) 277c80476e4SDavid E. O'Brien *xstring = '\0'; 278c80476e4SDavid E. O'Brien else 279c80476e4SDavid E. O'Brien *xstring++ = (char) c; 280c80476e4SDavid E. O'Brien } 281c80476e4SDavid E. O'Brien 282c80476e4SDavid E. O'Brien 283c80476e4SDavid E. O'Brien pret_t 284c80476e4SDavid E. O'Brien /*VARARGS*/ 285c80476e4SDavid E. O'Brien #ifdef FUNCPROTO 286c80476e4SDavid E. O'Brien xsnprintf(char *str, size_t size, const char *fmt, ...) 287c80476e4SDavid E. O'Brien #else 288c80476e4SDavid E. O'Brien xsnprintf(va_alist) 289c80476e4SDavid E. O'Brien va_dcl 290c80476e4SDavid E. O'Brien #endif 291c80476e4SDavid E. O'Brien { 292c80476e4SDavid E. O'Brien va_list va; 293c80476e4SDavid E. O'Brien #ifdef FUNCPROTO 294c80476e4SDavid E. O'Brien va_start(va, fmt); 295c80476e4SDavid E. O'Brien #else 296c80476e4SDavid E. O'Brien char *str, *fmt; 297c80476e4SDavid E. O'Brien size_t size; 298c80476e4SDavid E. O'Brien 299c80476e4SDavid E. O'Brien va_start(va); 300c80476e4SDavid E. O'Brien str = va_arg(va, char *); 301c80476e4SDavid E. O'Brien size = va_arg(va, size_t); 302c80476e4SDavid E. O'Brien fmt = va_arg(va, char *); 303c80476e4SDavid E. O'Brien #endif 304c80476e4SDavid E. O'Brien 305c80476e4SDavid E. O'Brien xstring = str; 306c80476e4SDavid E. O'Brien xestring = str + size - 1; 307c80476e4SDavid E. O'Brien doprnt(xaddchar, fmt, va); 308c80476e4SDavid E. O'Brien va_end(va); 309c80476e4SDavid E. O'Brien *xstring++ = '\0'; 310c80476e4SDavid E. O'Brien #ifdef PURIFY 311c80476e4SDavid E. O'Brien return 1; 312c80476e4SDavid E. O'Brien #endif 313c80476e4SDavid E. O'Brien } 314c80476e4SDavid E. O'Brien 315c80476e4SDavid E. O'Brien pret_t 316c80476e4SDavid E. O'Brien /*VARARGS*/ 317c80476e4SDavid E. O'Brien #ifdef FUNCPROTO 318c80476e4SDavid E. O'Brien xprintf(const char *fmt, ...) 319c80476e4SDavid E. O'Brien #else 320c80476e4SDavid E. O'Brien xprintf(va_alist) 321c80476e4SDavid E. O'Brien va_dcl 322c80476e4SDavid E. O'Brien #endif 323c80476e4SDavid E. O'Brien { 324c80476e4SDavid E. O'Brien va_list va; 325c80476e4SDavid E. O'Brien #ifdef FUNCPROTO 326c80476e4SDavid E. O'Brien va_start(va, fmt); 327c80476e4SDavid E. O'Brien #else 328c80476e4SDavid E. O'Brien char *fmt; 329c80476e4SDavid E. O'Brien 330c80476e4SDavid E. O'Brien va_start(va); 331c80476e4SDavid E. O'Brien fmt = va_arg(va, char *); 332c80476e4SDavid E. O'Brien #endif 333c80476e4SDavid E. O'Brien doprnt(xputchar, fmt, va); 334c80476e4SDavid E. O'Brien va_end(va); 335c80476e4SDavid E. O'Brien #ifdef PURIFY 336c80476e4SDavid E. O'Brien return 1; 337c80476e4SDavid E. O'Brien #endif 338c80476e4SDavid E. O'Brien } 339c80476e4SDavid E. O'Brien 340c80476e4SDavid E. O'Brien 341c80476e4SDavid E. O'Brien pret_t 342c80476e4SDavid E. O'Brien xvprintf(fmt, va) 343c80476e4SDavid E. O'Brien const char *fmt; 344c80476e4SDavid E. O'Brien va_list va; 345c80476e4SDavid E. O'Brien { 346c80476e4SDavid E. O'Brien doprnt(xputchar, fmt, va); 347c80476e4SDavid E. O'Brien #ifdef PURIFY 348c80476e4SDavid E. O'Brien return 1; 349c80476e4SDavid E. O'Brien #endif 350c80476e4SDavid E. O'Brien } 351c80476e4SDavid E. O'Brien 352c80476e4SDavid E. O'Brien pret_t 353c80476e4SDavid E. O'Brien xvsnprintf(str, size, fmt, va) 354c80476e4SDavid E. O'Brien char *str; 355c80476e4SDavid E. O'Brien size_t size; 356c80476e4SDavid E. O'Brien const char *fmt; 357c80476e4SDavid E. O'Brien va_list va; 358c80476e4SDavid E. O'Brien { 359c80476e4SDavid E. O'Brien xstring = str; 360c80476e4SDavid E. O'Brien xestring = str + size - 1; 361c80476e4SDavid E. O'Brien doprnt(xaddchar, fmt, va); 362c80476e4SDavid E. O'Brien *xstring++ = '\0'; 363c80476e4SDavid E. O'Brien #ifdef PURIFY 364c80476e4SDavid E. O'Brien return 1; 365c80476e4SDavid E. O'Brien #endif 366c80476e4SDavid E. O'Brien } 367c80476e4SDavid E. O'Brien 368c80476e4SDavid E. O'Brien 369c80476e4SDavid E. O'Brien 370c80476e4SDavid E. O'Brien #ifdef PURIFY 371c80476e4SDavid E. O'Brien /* Purify uses (some of..) the following functions to output memory-use 372c80476e4SDavid E. O'Brien * debugging info. Given all the messing with file descriptors that 373c80476e4SDavid E. O'Brien * tcsh does, the easiest way I could think of to get it (Purify) to 374c80476e4SDavid E. O'Brien * print anything was by replacing some standard functions with 375c80476e4SDavid E. O'Brien * ones that do tcsh output directly - see dumb hook in doreaddirs() 376c80476e4SDavid E. O'Brien * (sh.dir.c) -sg 377c80476e4SDavid E. O'Brien */ 378c80476e4SDavid E. O'Brien #ifndef FILE 379c80476e4SDavid E. O'Brien #define FILE int 380c80476e4SDavid E. O'Brien #endif 381c80476e4SDavid E. O'Brien int 382c80476e4SDavid E. O'Brien #ifdef FUNCPROTO 383c80476e4SDavid E. O'Brien fprintf(FILE *fp, const char* fmt, ...) 384c80476e4SDavid E. O'Brien #else 385c80476e4SDavid E. O'Brien fprintf(va_alist) 386c80476e4SDavid E. O'Brien va_dcl 387c80476e4SDavid E. O'Brien #endif 388c80476e4SDavid E. O'Brien { 389c80476e4SDavid E. O'Brien va_list va; 390c80476e4SDavid E. O'Brien #ifdef FUNCPROTO 391c80476e4SDavid E. O'Brien va_start(va, fmt); 392c80476e4SDavid E. O'Brien #else 393c80476e4SDavid E. O'Brien FILE *fp; 394c80476e4SDavid E. O'Brien const char *fmt; 395c80476e4SDavid E. O'Brien 396c80476e4SDavid E. O'Brien va_start(va); 397c80476e4SDavid E. O'Brien fp = va_arg(va, FILE *); 398c80476e4SDavid E. O'Brien fmt = va_arg(va, const char *); 399c80476e4SDavid E. O'Brien #endif 400c80476e4SDavid E. O'Brien doprnt(xputchar, fmt, va); 401c80476e4SDavid E. O'Brien va_end(va); 402c80476e4SDavid E. O'Brien return 1; 403c80476e4SDavid E. O'Brien } 404c80476e4SDavid E. O'Brien 405c80476e4SDavid E. O'Brien int 406c80476e4SDavid E. O'Brien vfprintf(fp, fmt, va) 407c80476e4SDavid E. O'Brien FILE *fp; 408c80476e4SDavid E. O'Brien const char *fmt; 409c80476e4SDavid E. O'Brien va_list va; 410c80476e4SDavid E. O'Brien { 411c80476e4SDavid E. O'Brien doprnt(xputchar, fmt, va); 412c80476e4SDavid E. O'Brien return 1; 413c80476e4SDavid E. O'Brien } 414c80476e4SDavid E. O'Brien 415c80476e4SDavid E. O'Brien #endif /* PURIFY */ 416