printf.c revision 7996
17977Shsul@eecs.umich.edu/***************************************************************************** 27977Shsul@eecs.umich.edu 37977Shsul@eecs.umich.edu Copyright � 1993, 1994 Digital Equipment Corporation, 47977Shsul@eecs.umich.edu Maynard, Massachusetts. 57977Shsul@eecs.umich.edu 67977Shsul@eecs.umich.edu All Rights Reserved 77977Shsul@eecs.umich.edu 87977Shsul@eecs.umich.eduPermission to use, copy, modify, and distribute this software and its 97977Shsul@eecs.umich.edudocumentation for any purpose and without fee is hereby granted, provided 107977Shsul@eecs.umich.eduthat the copyright notice and this permission notice appear in all copies 117977Shsul@eecs.umich.eduof software and supporting documentation, and that the name of Digital not 127977Shsul@eecs.umich.edube used in advertising or publicity pertaining to distribution of the software 137977Shsul@eecs.umich.eduwithout specific, written prior permission. Digital grants this permission 147977Shsul@eecs.umich.eduprovided that you prominently mark, as not part of the original, any 157977Shsul@eecs.umich.edumodifications made to this software or documentation. 167977Shsul@eecs.umich.edu 177977Shsul@eecs.umich.eduDigital Equipment Corporation disclaims all warranties and/or guarantees 187977Shsul@eecs.umich.eduwith regard to this software, including all implied warranties of fitness for 197977Shsul@eecs.umich.edua particular purpose and merchantability, and makes no representations 207977Shsul@eecs.umich.eduregarding the use of, or the results of the use of, the software and 217977Shsul@eecs.umich.edudocumentation in terms of correctness, accuracy, reliability, currentness or 227977Shsul@eecs.umich.eduotherwise; and you rely on the software, documentation and results solely at 237977Shsul@eecs.umich.eduyour own risk. 247977Shsul@eecs.umich.edu 257977Shsul@eecs.umich.edu******************************************************************************/ 267977Shsul@eecs.umich.edu 277977Shsul@eecs.umich.edu#ifndef LINT 287977Shsul@eecs.umich.edustatic char *rcsid = "$Id: printf.c,v 1.1.1.1 1997/10/30 23:27:12 verghese Exp $"; 297977Shsul@eecs.umich.edu#endif 307977Shsul@eecs.umich.edu 317977Shsul@eecs.umich.edu/* 327977Shsul@eecs.umich.edu * $Log: printf.c,v $ 337977Shsul@eecs.umich.edu * Revision 1.1.1.1 1997/10/30 23:27:12 verghese 347977Shsul@eecs.umich.edu * current 10/29/97 357977Shsul@eecs.umich.edu * 367977Shsul@eecs.umich.edu * Revision 1.1 1995/06/26 21:09:35 berc 377977Shsul@eecs.umich.edu * Initial revision 387977Shsul@eecs.umich.edu * 397977Shsul@eecs.umich.edu * Revision 1.8 1994/10/06 20:29:08 fdh 407977Shsul@eecs.umich.edu * Corrected unsigned long declaration. 417977Shsul@eecs.umich.edu * 427977Shsul@eecs.umich.edu * Revision 1.7 1994/08/05 20:16:23 fdh 437977Shsul@eecs.umich.edu * Updated Copyright header and RCS $Id: identifier. 447977Shsul@eecs.umich.edu * 457977Shsul@eecs.umich.edu * Revision 1.6 1994/06/21 15:41:54 rusling 467977Shsul@eecs.umich.edu * fixedup WNT compiler warnings 477977Shsul@eecs.umich.edu * 487977Shsul@eecs.umich.edu * Revision 1.5 1994/06/17 19:35:37 fdh 497977Shsul@eecs.umich.edu * Clean-up... 507977Shsul@eecs.umich.edu * 517977Shsul@eecs.umich.edu * Revision 1.4 1994/01/19 10:40:08 rusling 527977Shsul@eecs.umich.edu * Ported to Alpha Windows NT. 537977Shsul@eecs.umich.edu * 547977Shsul@eecs.umich.edu * Revision 1.3 1993/11/02 21:57:45 fdh 557977Shsul@eecs.umich.edu * Fixed sign extension problem introduced in version 1.2 567977Shsul@eecs.umich.edu * 577977Shsul@eecs.umich.edu * Revision 1.2 1993/10/13 15:29:02 rusling 587977Shsul@eecs.umich.edu * Added floating point support in printf. This meant adding variable arguments to 597977Shsul@eecs.umich.edu * it and FormatItem() and including stdarg.h. 607977Shsul@eecs.umich.edu * 617977Shsul@eecs.umich.edu * Revision 1.1 1993/06/08 19:56:24 fdh 627977Shsul@eecs.umich.edu * Initial revision 637977Shsul@eecs.umich.edu * 647977Shsul@eecs.umich.edu */ 657977Shsul@eecs.umich.edu 667977Shsul@eecs.umich.edu 677977Shsul@eecs.umich.edu 687977Shsul@eecs.umich.edu/* printf.c 697977Shsul@eecs.umich.edu L. S. 707977Shsul@eecs.umich.edu Sun Feb 10 20:18:22 1985 717977Shsul@eecs.umich.edu */ 727977Shsul@eecs.umich.edu 737996Ssaidi@eecs.umich.edu//#include "system.h" 747977Shsul@eecs.umich.edu#include "lib.h" 757977Shsul@eecs.umich.edu#include <stdarg.h> 767977Shsul@eecs.umich.edu 777977Shsul@eecs.umich.edu 787977Shsul@eecs.umich.edu 797977Shsul@eecs.umich.edu 807977Shsul@eecs.umich.edu 817977Shsul@eecs.umich.edu/* The string s is terminated by a '\0' */ 827978Sbinkertn@umich.eduvoid 837978Sbinkertn@umich.eduPutString(const char *s) 847977Shsul@eecs.umich.edu{ 857977Shsul@eecs.umich.edu while (*s) PutChar(*s++); 867977Shsul@eecs.umich.edu} 877977Shsul@eecs.umich.edu 887977Shsul@eecs.umich.edu/* print c count times */ 897978Sbinkertn@umich.eduvoid 907978Sbinkertn@umich.eduPutRepChar(char c, int count) 917977Shsul@eecs.umich.edu{ 927977Shsul@eecs.umich.edu while (count--) PutChar(c); 937977Shsul@eecs.umich.edu} 947977Shsul@eecs.umich.edu 957977Shsul@eecs.umich.edu/* put string reverse */ 967978Sbinkertn@umich.eduvoid 977978Sbinkertn@umich.eduPutStringReverse(const char *s, int index) 987977Shsul@eecs.umich.edu{ 997977Shsul@eecs.umich.edu while ((index--) > 0) PutChar(s[index]); 1007977Shsul@eecs.umich.edu} 1017977Shsul@eecs.umich.edu 1027977Shsul@eecs.umich.edu/* prints value in radix, in a field width width, with fill 1037977Shsul@eecs.umich.edu character fill 1047977Shsul@eecs.umich.edu if radix is negative, print as signed quantity 1057977Shsul@eecs.umich.edu if width is negative, left justify 1067977Shsul@eecs.umich.edu if width is 0, use whatever is needed 1077977Shsul@eecs.umich.edu if fill is 0, use ' ' 1087977Shsul@eecs.umich.edu */ 1097978Sbinkertn@umich.eduvoid 1107978Sbinkertn@umich.eduPutNumber(sl value, int radix, int width, char fill) 1117977Shsul@eecs.umich.edu{ 1127977Shsul@eecs.umich.edu char buffer[40]; 1137977Shsul@eecs.umich.edu ui bufferindex = 0; 1147977Shsul@eecs.umich.edu ul uvalue; 1157977Shsul@eecs.umich.edu uw digit; 1167977Shsul@eecs.umich.edu uw left = FALSE; 1177977Shsul@eecs.umich.edu uw negative = FALSE; 1187977Shsul@eecs.umich.edu 1197977Shsul@eecs.umich.edu if (fill == 0) fill = ' '; 1207977Shsul@eecs.umich.edu 1217977Shsul@eecs.umich.edu if (width < 0) { 1227977Shsul@eecs.umich.edu width = -width; 1237977Shsul@eecs.umich.edu left = TRUE; 1247977Shsul@eecs.umich.edu } 1257977Shsul@eecs.umich.edu if (width < 0 || width > 80) width = 0; 1267977Shsul@eecs.umich.edu 1277977Shsul@eecs.umich.edu if (radix < 0) { 1287977Shsul@eecs.umich.edu radix = -radix; 1297977Shsul@eecs.umich.edu if (value < 0) { 1307977Shsul@eecs.umich.edu negative = TRUE; 1317977Shsul@eecs.umich.edu value = -value; 1327977Shsul@eecs.umich.edu } 1337977Shsul@eecs.umich.edu } 1347977Shsul@eecs.umich.edu switch (radix) { 1357977Shsul@eecs.umich.edu case 8: 1367977Shsul@eecs.umich.edu case 10: 1377977Shsul@eecs.umich.edu case 16: break; 1387977Shsul@eecs.umich.edu default: { 1397977Shsul@eecs.umich.edu PutString("****"); 1407977Shsul@eecs.umich.edu return; 1417977Shsul@eecs.umich.edu } 1427977Shsul@eecs.umich.edu } 1437977Shsul@eecs.umich.edu uvalue = value; 1447977Shsul@eecs.umich.edu do { 1457977Shsul@eecs.umich.edu if (radix != 16) 1467977Shsul@eecs.umich.edu { 1477977Shsul@eecs.umich.edu digit = (uw)(uvalue % radix); 1487977Shsul@eecs.umich.edu uvalue /= radix; 1497977Shsul@eecs.umich.edu } 1507977Shsul@eecs.umich.edu else 1517977Shsul@eecs.umich.edu { 1527977Shsul@eecs.umich.edu digit = (uw)(uvalue & 0xf); 1537977Shsul@eecs.umich.edu uvalue = uvalue >> 4; 1547977Shsul@eecs.umich.edu } 1557977Shsul@eecs.umich.edu buffer[bufferindex] = digit + ((digit <= 9) ? '0' : ('A' - 10)); 1567977Shsul@eecs.umich.edu bufferindex += 1; 1577977Shsul@eecs.umich.edu } while (uvalue != 0); 1587977Shsul@eecs.umich.edu /* fill # ' ' and negative cannot happen at once */ 1597977Shsul@eecs.umich.edu if (negative) { 1607977Shsul@eecs.umich.edu buffer[bufferindex] = '-'; 1617977Shsul@eecs.umich.edu bufferindex += 1; 1627977Shsul@eecs.umich.edu } 1637977Shsul@eecs.umich.edu if ((ui)width <= bufferindex) PutStringReverse(buffer, bufferindex); 1647977Shsul@eecs.umich.edu else { 1657977Shsul@eecs.umich.edu width -= bufferindex; 1667977Shsul@eecs.umich.edu if (!left) PutRepChar(fill, width); 1677977Shsul@eecs.umich.edu PutStringReverse(buffer, bufferindex); 1687977Shsul@eecs.umich.edu if (left) PutRepChar(fill, width); 1697977Shsul@eecs.umich.edu } 1707977Shsul@eecs.umich.edu} 1717977Shsul@eecs.umich.edu 1727977Shsul@eecs.umich.eduul power(long base, long n) 1737977Shsul@eecs.umich.edu{ 1747977Shsul@eecs.umich.edu ul p; 1757977Shsul@eecs.umich.edu 1767977Shsul@eecs.umich.edu for (p = 1; n > 0; --n) 1777977Shsul@eecs.umich.edu p = p * base; 1787977Shsul@eecs.umich.edu return p; 1797977Shsul@eecs.umich.edu} 1807977Shsul@eecs.umich.edu 1817977Shsul@eecs.umich.eduvoid putFloat(double a, int fieldwidth, char fill) 1827977Shsul@eecs.umich.edu{ 1837977Shsul@eecs.umich.edu int i; 1847977Shsul@eecs.umich.edu ul b; 1857977Shsul@eecs.umich.edu 1867977Shsul@eecs.umich.edu/* 1877977Shsul@eecs.umich.edu * Put out everything before the decimal place. 1887977Shsul@eecs.umich.edu */ 1897977Shsul@eecs.umich.edu PutNumber(((ul) a), 10, fieldwidth, fill); 1907977Shsul@eecs.umich.edu/* 1917977Shsul@eecs.umich.edu * Output the decimal place. 1927977Shsul@eecs.umich.edu */ 1937977Shsul@eecs.umich.edu PutChar('.' & 0x7f); 1947977Shsul@eecs.umich.edu/* 1957977Shsul@eecs.umich.edu * Output the n digits after the decimal place. 1967977Shsul@eecs.umich.edu */ 1977977Shsul@eecs.umich.edu for (i = 1; i < 6; i++) { 1987977Shsul@eecs.umich.edu b = (ul)(power(10, i) * (double)(a - (ul) a)); 1997977Shsul@eecs.umich.edu PutChar((char)(b % 10) + '0'); 2007977Shsul@eecs.umich.edu } 2017977Shsul@eecs.umich.edu} 2027978Sbinkertn@umich.educonst char * 2037978Sbinkertn@umich.eduFormatItem(const char *f, va_list *ap) 2047977Shsul@eecs.umich.edu{ 2057977Shsul@eecs.umich.edu char c; 2067977Shsul@eecs.umich.edu int fieldwidth = 0; 2077977Shsul@eecs.umich.edu int leftjust = FALSE; 2087977Shsul@eecs.umich.edu int radix = 0; 2097977Shsul@eecs.umich.edu char fill = ' '; 2107977Shsul@eecs.umich.edu if (*f == '0') fill = '0'; 2117977Shsul@eecs.umich.edu while (c = *f++) { 2127977Shsul@eecs.umich.edu if (c >= '0' && c <= '9') { 2137977Shsul@eecs.umich.edu fieldwidth = (fieldwidth * 10) + (c - '0'); 2147977Shsul@eecs.umich.edu } 2157977Shsul@eecs.umich.edu else switch (c) { 2167977Shsul@eecs.umich.edu case '\000': return(--f); 2177977Shsul@eecs.umich.edu case '%': PutChar('%'); 2187977Shsul@eecs.umich.edu return(f); 2197977Shsul@eecs.umich.edu case '-': leftjust = TRUE; 2207977Shsul@eecs.umich.edu break; 2217977Shsul@eecs.umich.edu case 'c': { 2227992Ssaidi@eecs.umich.edu char a = va_arg(*ap, char *); 2237977Shsul@eecs.umich.edu 2247977Shsul@eecs.umich.edu if (leftjust) PutChar(a & 0x7f); 2257977Shsul@eecs.umich.edu if (fieldwidth > 0) PutRepChar(fill, fieldwidth - 1); 2267977Shsul@eecs.umich.edu if (!leftjust) PutChar(a & 0x7f); 2277977Shsul@eecs.umich.edu return(f); 2287977Shsul@eecs.umich.edu } 2297977Shsul@eecs.umich.edu case 's': { 2307978Sbinkertn@umich.edu const char *a = va_arg(*ap, const char *); 2317977Shsul@eecs.umich.edu 2327978Sbinkertn@umich.edu if (leftjust) PutString((const char *) a); 2337978Sbinkertn@umich.edu if (fieldwidth > strlen((const char *) a)) 2347978Sbinkertn@umich.edu PutRepChar(fill, fieldwidth - strlen((const char *)a)); 2357978Sbinkertn@umich.edu if (!leftjust) PutString((const char *) a); 2367977Shsul@eecs.umich.edu return(f); 2377977Shsul@eecs.umich.edu } 2387977Shsul@eecs.umich.edu case 'd': radix = -10; 2397977Shsul@eecs.umich.edu break; 2407977Shsul@eecs.umich.edu case 'u': radix = 10; 2417977Shsul@eecs.umich.edu break; 2427977Shsul@eecs.umich.edu case 'x': radix = 16; 2437977Shsul@eecs.umich.edu break; 2447977Shsul@eecs.umich.edu case 'X': radix = 16; 2457977Shsul@eecs.umich.edu break; 2467977Shsul@eecs.umich.edu case 'o': radix = 8; 2477977Shsul@eecs.umich.edu break; 2487977Shsul@eecs.umich.edu case 'f': { 2497977Shsul@eecs.umich.edu double a = va_arg(*ap, double); 2507977Shsul@eecs.umich.edu 2517977Shsul@eecs.umich.edu putFloat(a, fieldwidth, fill); 2527977Shsul@eecs.umich.edu return(f); 2537977Shsul@eecs.umich.edu } 2547977Shsul@eecs.umich.edu default: /* unknown switch! */ 2557977Shsul@eecs.umich.edu radix = 3; 2567977Shsul@eecs.umich.edu break; 2577977Shsul@eecs.umich.edu } 2587977Shsul@eecs.umich.edu if (radix) break; 2597977Shsul@eecs.umich.edu } 2607977Shsul@eecs.umich.edu if (leftjust) fieldwidth = -fieldwidth; 2617977Shsul@eecs.umich.edu { 2627977Shsul@eecs.umich.edu sl a = va_arg(*ap, sl); 2637977Shsul@eecs.umich.edu PutNumber(a, radix, fieldwidth, fill); 2647977Shsul@eecs.umich.edu } 2657977Shsul@eecs.umich.edu return(f); 2667977Shsul@eecs.umich.edu} 2677977Shsul@eecs.umich.edu 2687978Sbinkertn@umich.eduint 2697978Sbinkertn@umich.eduprintf(const char *f, ...) 2707977Shsul@eecs.umich.edu{ 2717977Shsul@eecs.umich.edu va_list ap; 2727977Shsul@eecs.umich.edu 2737977Shsul@eecs.umich.edu va_start(ap, f); 2747977Shsul@eecs.umich.edu 2757977Shsul@eecs.umich.edu while (*f) { 2767977Shsul@eecs.umich.edu if (*f == '%') f = FormatItem(f + 1, &ap); 2777977Shsul@eecs.umich.edu else PutChar(*f++); 2787977Shsul@eecs.umich.edu } 2797977Shsul@eecs.umich.edu 2807977Shsul@eecs.umich.edu if (*(f-1)=='\n') { 2817977Shsul@eecs.umich.edu /* add a line-feed (SimOS console output goes to shell */ 2827977Shsul@eecs.umich.edu PutChar('\r'); 2837977Shsul@eecs.umich.edu } 2847977Shsul@eecs.umich.edu 2857977Shsul@eecs.umich.edu va_end(ap); /* clean up */ 2867978Sbinkertn@umich.edu return 0; 2877977Shsul@eecs.umich.edu} 2887977Shsul@eecs.umich.edu 2897978Sbinkertn@umich.eduvoid 2907978Sbinkertn@umich.edupanic(const char *f, ...) 2917977Shsul@eecs.umich.edu{ 2927977Shsul@eecs.umich.edu va_list ap; 2937977Shsul@eecs.umich.edu 2947977Shsul@eecs.umich.edu va_start(ap, f); 2957977Shsul@eecs.umich.edu 2967977Shsul@eecs.umich.edu printf("CONSOLE PANIC (looping): "); 2977977Shsul@eecs.umich.edu while (*f) { 2987977Shsul@eecs.umich.edu if (*f == '%') f = FormatItem(f + 1, &ap); 2997977Shsul@eecs.umich.edu else PutChar(*f++); 3007977Shsul@eecs.umich.edu } 3017977Shsul@eecs.umich.edu 3027977Shsul@eecs.umich.edu va_end(ap); /* clean up */ 3037977Shsul@eecs.umich.edu while(1); 3047977Shsul@eecs.umich.edu} 3057977Shsul@eecs.umich.edu 3067977Shsul@eecs.umich.edu 307