summaryrefslogtreecommitdiff
path: root/system/alpha/console/printf.c
diff options
context:
space:
mode:
Diffstat (limited to 'system/alpha/console/printf.c')
-rw-r--r--system/alpha/console/printf.c484
1 files changed, 253 insertions, 231 deletions
diff --git a/system/alpha/console/printf.c b/system/alpha/console/printf.c
index 9a92036aa..0e665a434 100644
--- a/system/alpha/console/printf.c
+++ b/system/alpha/console/printf.c
@@ -1,302 +1,324 @@
/*
-Copyright 1993, 1994 Hewlett-Packard Development Company, L.P.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-*/
-
-#ifndef LINT
-static char *rcsid = "$Id: printf.c,v 1.1.1.1 1997/10/30 23:27:12 verghese Exp $";
-#endif
-
-/*
- * $Log: printf.c,v $
- * Revision 1.1.1.1 1997/10/30 23:27:12 verghese
- * current 10/29/97
- *
- * Revision 1.1 1995/06/26 21:09:35 berc
- * Initial revision
- *
- * Revision 1.8 1994/10/06 20:29:08 fdh
- * Corrected unsigned long declaration.
+ * Copyright (c) 2003, 2004
+ * The Regents of The University of Michigan
+ * All Rights Reserved
*
- * Revision 1.7 1994/08/05 20:16:23 fdh
- * Updated Copyright header and RCS $Id: identifier.
+ * This code is part of the M5 simulator, developed by Nathan Binkert,
+ * Erik Hallnor, Steve Raasch, and Steve Reinhardt, with contributions
+ * from Ron Dreslinski, Dave Greene, Lisa Hsu, Ali Saidi, and Andrew
+ * Schultz.
*
- * Revision 1.6 1994/06/21 15:41:54 rusling
- * fixedup WNT compiler warnings
+ * Permission is granted to use, copy, create derivative works and
+ * redistribute this software and such derivative works for any purpose,
+ * so long as the copyright notice above, this grant of permission, and
+ * the disclaimer below appear in all copies made; and so long as the
+ * name of The University of Michigan is not used in any advertising or
+ * publicity pertaining to the use or distribution of this software
+ * without specific, written prior authorization.
*
- * Revision 1.5 1994/06/17 19:35:37 fdh
- * Clean-up...
- *
- * Revision 1.4 1994/01/19 10:40:08 rusling
- * Ported to Alpha Windows NT.
- *
- * Revision 1.3 1993/11/02 21:57:45 fdh
- * Fixed sign extension problem introduced in version 1.2
+ * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE
+ * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND WITHOUT
+ * WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE REGENTS OF
+ * THE UNIVERSITY OF MICHIGAN SHALL NOT BE LIABLE FOR ANY DAMAGES,
+ * INCLUDING DIRECT, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+ * DAMAGES, WITH RESPECT TO ANY CLAIM ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE SOFTWARE, EVEN IF IT HAS BEEN OR IS HEREAFTER
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ */
+
+/*
+ * Copyright 1993 Hewlett-Packard Development Company, L.P.
*
- * Revision 1.2 1993/10/13 15:29:02 rusling
- * Added floating point support in printf. This meant adding variable arguments to
- * it and FormatItem() and including stdarg.h.
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
*
- * Revision 1.1 1993/06/08 19:56:24 fdh
- * Initial revision
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
*
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
*/
-
-
-/* printf.c
- L. S.
- Sun Feb 10 20:18:22 1985
- */
-
-//#include "system.h"
-#include "lib.h"
+#include <sys/types.h>
#include <stdarg.h>
-
-
-
-
/* The string s is terminated by a '\0' */
void
PutString(const char *s)
{
- while (*s) PutChar(*s++);
+ while (*s)
+ PutChar(*s++);
}
/* print c count times */
void
PutRepChar(char c, int count)
{
- while (count--) PutChar(c);
+ while (count--)
+ PutChar(c);
}
/* put string reverse */
void
PutStringReverse(const char *s, int index)
{
- while ((index--) > 0) PutChar(s[index]);
+ while (index-- > 0)
+ PutChar(s[index]);
}
-/* prints value in radix, in a field width width, with fill
- character fill
- if radix is negative, print as signed quantity
- if width is negative, left justify
- if width is 0, use whatever is needed
- if fill is 0, use ' '
+/*
+ * prints value in radix, in a field width width, with fill
+ * character fill
+ * if radix is negative, print as signed quantity
+ * if width is negative, left justify
+ * if width is 0, use whatever is needed
+ * if fill is 0, use ' '
*/
void
-PutNumber(sl value, int radix, int width, char fill)
+PutNumber(long value, int radix, int width, char fill)
{
- char buffer[40];
- ui bufferindex = 0;
- ul uvalue;
- uw digit;
- uw left = FALSE;
- uw negative = FALSE;
-
- if (fill == 0) fill = ' ';
-
- if (width < 0) {
- width = -width;
- left = TRUE;
- }
- if (width < 0 || width > 80) width = 0;
-
- if (radix < 0) {
- radix = -radix;
- if (value < 0) {
- negative = TRUE;
- value = -value;
- }
+ char buffer[40];
+ uint bufferindex = 0;
+ ulong uvalue;
+ ushort digit;
+ ushort left = 0;
+ ushort negative = 0;
+
+ if (fill == 0)
+ fill = ' ';
+
+ if (width < 0) {
+ width = -width;
+ left = 1;
}
- switch (radix) {
- case 8:
- case 10:
- case 16: break;
- default: {
- PutString("****");
- return;
- }
- }
- uvalue = value;
- do {
- if (radix != 16)
- {
- digit = (uw)(uvalue % radix);
- uvalue /= radix;
+
+ if (width < 0 || width > 80)
+ width = 0;
+
+ if (radix < 0) {
+ radix = -radix;
+ if (value < 0) {
+ negative = 1;
+ value = -value;
+ }
}
- else
- {
- digit = (uw)(uvalue & 0xf);
- uvalue = uvalue >> 4;
+
+ switch (radix) {
+ case 8:
+ case 10:
+ case 16:
+ break;
+
+ default:
+ PutString("****");
+ return;
}
- buffer[bufferindex] = digit + ((digit <= 9) ? '0' : ('A' - 10));
- bufferindex += 1;
+
+ uvalue = value;
+
+ do {
+ if (radix != 16) {
+ digit = (ushort)(uvalue % radix);
+ uvalue /= radix;
+ } else {
+ digit = (ushort)(uvalue & 0xf);
+ uvalue = uvalue >> 4;
+ }
+ buffer[bufferindex] = digit + ((digit <= 9) ? '0' : ('A' - 10));
+ bufferindex += 1;
} while (uvalue != 0);
+
/* fill # ' ' and negative cannot happen at once */
- if (negative) {
- buffer[bufferindex] = '-';
- bufferindex += 1;
+ if (negative) {
+ buffer[bufferindex] = '-';
+ bufferindex += 1;
}
- if ((ui)width <= bufferindex) PutStringReverse(buffer, bufferindex);
- else {
- width -= bufferindex;
- if (!left) PutRepChar(fill, width);
- PutStringReverse(buffer, bufferindex);
- if (left) PutRepChar(fill, width);
+
+ if ((uint)width <= bufferindex) {
+ PutStringReverse(buffer, bufferindex);
+ } else {
+ width -= bufferindex;
+ if (!left)
+ PutRepChar(fill, width);
+ PutStringReverse(buffer, bufferindex);
+ if (left)
+ PutRepChar(fill, width);
}
}
-ul power(long base, long n)
+ulong
+power(long base, long n)
{
- ul p;
+ ulong p;
- for (p = 1; n > 0; --n)
- p = p * base;
- return p;
+ for (p = 1; n > 0; --n)
+ p = p * base;
+ return p;
}
-void putFloat(double a, int fieldwidth, char fill)
+void
+putFloat(double a, int fieldwidth, char fill)
{
- int i;
- ul b;
-
-/*
- * Put out everything before the decimal place.
- */
- PutNumber(((ul) a), 10, fieldwidth, fill);
-/*
- * Output the decimal place.
- */
- PutChar('.' & 0x7f);
-/*
- * Output the n digits after the decimal place.
- */
- for (i = 1; i < 6; i++) {
- b = (ul)(power(10, i) * (double)(a - (ul) a));
- PutChar((char)(b % 10) + '0');
- }
+ int i;
+ ulong b;
+
+ /*
+ * Put out everything before the decimal place.
+ */
+ PutNumber(((ulong) a), 10, fieldwidth, fill);
+
+ /*
+ * Output the decimal place.
+ */
+ PutChar('.' & 0x7f);
+
+ /*
+ * Output the n digits after the decimal place.
+ */
+ for (i = 1; i < 6; i++) {
+ b = (ulong)(power(10, i) * (double)(a - (ulong) a));
+ PutChar((char)(b % 10) + '0');
+ }
}
+
const char *
FormatItem(const char *f, va_list *ap)
{
- char c;
- int fieldwidth = 0;
- int leftjust = FALSE;
- int radix = 0;
- char fill = ' ';
- if (*f == '0') fill = '0';
- while (c = *f++) {
- if (c >= '0' && c <= '9') {
- fieldwidth = (fieldwidth * 10) + (c - '0');
- }
- else switch (c) {
- case '\000': return(--f);
- case '%': PutChar('%');
- return(f);
- case '-': leftjust = TRUE;
- break;
- case 'c': {
- char a = va_arg(*ap, char *);
-
- if (leftjust) PutChar(a & 0x7f);
- if (fieldwidth > 0) PutRepChar(fill, fieldwidth - 1);
- if (!leftjust) PutChar(a & 0x7f);
- return(f);
- }
- case 's': {
- const char *a = va_arg(*ap, const char *);
-
- if (leftjust) PutString((const char *) a);
- if (fieldwidth > strlen((const char *) a))
- PutRepChar(fill, fieldwidth - strlen((const char *)a));
- if (!leftjust) PutString((const char *) a);
- return(f);
+ char c;
+ int fieldwidth = 0;
+ int leftjust = 0;
+ int radix = 0;
+ char fill = ' ';
+
+ if (*f == '0')
+ fill = '0';
+
+ while (c = *f++) {
+ if (c >= '0' && c <= '9') {
+ fieldwidth = (fieldwidth * 10) + (c - '0');
+ } else {
+ switch (c) {
+ case '\000':
+ return(--f);
+ case '%':
+ PutChar('%');
+ return(f);
+ case '-':
+ leftjust = 1;
+ break;
+ case 'c': {
+ char a = (char)va_arg(*ap, int);
+
+ if (leftjust)
+ PutChar(a & 0x7f);
+ if (fieldwidth > 0)
+ PutRepChar(fill, fieldwidth - 1);
+ if (!leftjust)
+ PutChar(a & 0x7f);
+ return(f);
+ }
+ case 's': {
+ const char *a = va_arg(*ap, const char *);
+
+ if (leftjust)
+ PutString((const char *) a);
+ if (fieldwidth > strlen((const char *) a))
+ PutRepChar(fill, fieldwidth - strlen((const char *)a));
+ if (!leftjust)
+ PutString((const char *) a);
+ return(f);
+ }
+ case 'd':
+ radix = -10;
+ break;
+ case 'u':
+ radix = 10;
+ break;
+ case 'x':
+ radix = 16;
+ break;
+ case 'X':
+ radix = 16;
+ break;
+ case 'o':
+ radix = 8;
+ break;
+ case 'f': {
+ double a = va_arg(*ap, double);
+
+ putFloat(a, fieldwidth, fill);
+ return(f);
+ }
+ default: /* unknown switch! */
+ radix = 3;
+ break;
+ }
}
- case 'd': radix = -10;
- break;
- case 'u': radix = 10;
- break;
- case 'x': radix = 16;
- break;
- case 'X': radix = 16;
- break;
- case 'o': radix = 8;
- break;
- case 'f': {
- double a = va_arg(*ap, double);
-
- putFloat(a, fieldwidth, fill);
- return(f);
- }
- default: /* unknown switch! */
- radix = 3;
- break;
- }
- if (radix) break;
+
+ if (radix)
+ break;
}
- if (leftjust) fieldwidth = -fieldwidth;
- {
- sl a = va_arg(*ap, sl);
- PutNumber(a, radix, fieldwidth, fill);
- }
- return(f);
+
+ if (leftjust)
+ fieldwidth = -fieldwidth;
+
+ long a = va_arg(*ap, long);
+ PutNumber(a, radix, fieldwidth, fill);
+
+ return(f);
}
int
printf(const char *f, ...)
{
- va_list ap;
+ va_list ap;
- va_start(ap, f);
+ va_start(ap, f);
- while (*f) {
- if (*f == '%') f = FormatItem(f + 1, &ap);
- else PutChar(*f++);
- }
+ while (*f) {
+ if (*f == '%')
+ f = FormatItem(f + 1, &ap);
+ else
+ PutChar(*f++);
+ }
- if (*(f-1)=='\n') {
- /* add a line-feed (SimOS console output goes to shell */
- PutChar('\r');
- }
+ if (*(f - 1) == '\n') {
+ /* add a line-feed (SimOS console output goes to shell */
+ PutChar('\r');
+ }
- va_end(ap); /* clean up */
- return 0;
+ va_end(ap); /* clean up */
+ return 0;
}
void
panic(const char *f, ...)
{
- va_list ap;
+ va_list ap;
- va_start(ap, f);
+ va_start(ap, f);
- printf("CONSOLE PANIC (looping): ");
- while (*f) {
- if (*f == '%') f = FormatItem(f + 1, &ap);
- else PutChar(*f++);
+ printf("CONSOLE PANIC (looping): ");
+ while (*f) {
+ if (*f == '%')
+ f = FormatItem(f + 1, &ap);
+ else
+ PutChar(*f++);
}
- va_end(ap); /* clean up */
- while(1);
+ va_end(ap); /* clean up */
+ while(1);
}
-
-