summaryrefslogtreecommitdiffstats
path: root/qemu/roms/qemu-palcode/printf.c
diff options
context:
space:
mode:
Diffstat (limited to 'qemu/roms/qemu-palcode/printf.c')
-rw-r--r--qemu/roms/qemu-palcode/printf.c203
1 files changed, 0 insertions, 203 deletions
diff --git a/qemu/roms/qemu-palcode/printf.c b/qemu/roms/qemu-palcode/printf.c
deleted file mode 100644
index 469b82cd3..000000000
--- a/qemu/roms/qemu-palcode/printf.c
+++ /dev/null
@@ -1,203 +0,0 @@
-/* A reduced version of the printf function.
-
- Copyright (C) 2011 Richard Henderson
-
- This file is part of QEMU PALcode.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the text
- of the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; see the file COPYING. If not see
- <http://www.gnu.org/licenses/>. */
-
-#include <stdarg.h>
-#include <stdbool.h>
-#include <string.h>
-#include "console.h"
-
-static int print_buf_pad(char *buf, int buflen, char *p, int width, int pad)
-{
- int len = buf + buflen - p;
- int r = 0;
-
- if (width > len)
- {
- *--p = pad;
- len++;
-
- while (width > buflen)
- {
- crb_puts(0, p, 1);
- width--;
- r++;
- }
- while (width > len)
- *--p = pad, len++;
- }
-
- crb_puts(0, p, len);
- return r + len;
-}
-
-static int print_decimal(unsigned long val, int width, int pad)
-{
- char buf[32];
- char *p = buf + sizeof(buf);
-
- if (val == 0)
- *--p = '0';
- else
- {
- do
- {
- unsigned long d, r;
-
- /* Compiling with -Os results in a call to the division routine.
- Do what the compiler ought to have done. */
- d = __builtin_alpha_umulh(val, 0xcccccccccccccccd);
- d >>= 3;
- r = val - (d * 10);
-
- *--p = r + '0';
- val = d;
- }
- while (val);
- }
-
- return print_buf_pad(buf, sizeof(buf), p, width, pad);
-}
-
-static int print_hex(unsigned long val, int width, char pad)
-{
- char buf[32];
- char *p = buf + sizeof(buf);
-
- if (val == 0)
- *--p = '0';
- else
- {
- do
- {
- int d = val % 16;
- *--p = (d < 10 ? '0' : 'a' - 10) + d;
- val /= 16;
- }
- while (val);
- }
-
- return print_buf_pad(buf, sizeof(buf), p, width, pad);
-}
-
-int printf(const char *fmt, ...)
-{
- va_list args;
- unsigned long val;
- int r = 0;
-
- va_start(args, fmt);
-
- for (; *fmt ; fmt++)
- if (*fmt != '%')
- {
- crb_puts(0, fmt, 1);
- r++;
- }
- else
- {
- const char *percent = fmt;
- bool is_long = false;
- char pad = ' ';
- int width = 0;
-
- restart:
- switch (*++fmt)
- {
- case '%':
- crb_puts(0, "%", 1);
- r++;
- break;
-
- case 'l':
- is_long = true;
- goto restart;
-
- case 'd':
- if (is_long)
- {
- long d = va_arg (args, long);
- if (d < 0)
- {
- crb_puts(0, "-", 1);
- d = -d;
- }
- val = d;
- }
- else
- {
- int d = va_arg (args, int);
- if (d < 0)
- {
- crb_puts(0, "-", 1);
- d = -d;
- r++;
- }
- val = d;
- }
- goto do_unsigned;
-
- case 'u':
- if (is_long)
- val = va_arg (args, unsigned long);
- else
- val = va_arg (args, unsigned int);
-
- do_unsigned:
- r += print_decimal (val, width, pad);
- break;
-
- case 'x':
- if (is_long)
- val = va_arg (args, unsigned long);
- else
- val = va_arg (args, unsigned int);
- r += print_hex (val, width, pad);
- break;
-
- case 's':
- {
- const char *s = va_arg (args, const char *);
- int len = strlen(s);
- crb_puts(0, s, len);
- r += len;
- }
- break;
-
- case '0':
- pad = '0';
- case '1' ... '9':
- width = *fmt - '0';
- while (fmt[1] >= '0' && fmt[1] <= '9')
- width = width * 10 + *++fmt - '0';
- goto restart;
-
- default:
- {
- int len = fmt - percent;
- crb_puts(0, percent, len);
- r += len;
- }
- break;
- }
- }
-
- va_end(args);
- return r;
-}