]> git.saurik.com Git - apple/boot.git/blob - i386/libsa/prf.c
boot-93.tar.gz
[apple/boot.git] / i386 / libsa / prf.c
1 /*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7 * Reserved. This file contains Original Code and/or Modifications of
8 * Original Code as defined in and that are subject to the Apple Public
9 * Source License Version 1.1 (the "License"). You may not use this file
10 * except in compliance with the License. Please obtain a copy of the
11 * License at http://www.apple.com/publicsource and read it before using
12 * this file.
13 *
14 * The Original Code and all software distributed under the License are
15 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the
19 * License for the specific language governing rights and limitations
20 * under the License.
21 *
22 * @APPLE_LICENSE_HEADER_END@
23 */
24 /*
25 * Mach Operating System
26 * Copyright (c) 1990 Carnegie-Mellon University
27 * Copyright (c) 1989 Carnegie-Mellon University
28 * Copyright (c) 1988 Carnegie-Mellon University
29 * Copyright (c) 1987 Carnegie-Mellon University
30 * All rights reserved. The CMU software License Agreement specifies
31 * the terms and conditions for use and redistribution.
32 */
33 /*
34 * Copyright (c) 1982, 1986 Regents of the University of California.
35 * All rights reserved. The Berkeley software License Agreement
36 * specifies the terms and conditions for redistribution.
37 *
38 * @(#)prf.c 7.1 (Berkeley) 6/5/86
39 */
40
41 #include <sys/param.h>
42
43 #define SPACE 1
44 #define ZERO 2
45
46 /*
47 * Scaled down version of C Library printf.
48 * Used to print diagnostic information directly on console tty.
49 * Since it is not interrupt driven, all system activities are
50 * suspended.
51 *
52 */
53
54 /*
55 * Printn prints a number n in base b.
56 * We don't use recursion to avoid deep kernel stacks.
57 */
58 static void
59 printn(n, b, flag, minwidth, putfn_p, putfn_arg)
60 u_long n;
61 int b, flag, minwidth;
62 void (*putfn_p)();
63 void *putfn_arg;
64 {
65 char prbuf[11];
66 register char *cp;
67 int width = 0, neg = 0;
68
69 if (b == 10 && (int)n < 0) {
70 neg = 1;
71 n = (unsigned)(-(int)n);
72 }
73 cp = prbuf;
74 do {
75 *cp++ = "0123456789abcdef"[n%b];
76 n /= b;
77 width++;
78 } while (n);
79
80 if (neg) {
81 (*putfn_p)('-', putfn_arg);
82 width++;
83 }
84 while (width++ < minwidth)
85 (*putfn_p)( (flag & ZERO) ? '0' : ' ', putfn_arg);
86
87 do
88 (*putfn_p)(*--cp, putfn_arg);
89 while (cp > prbuf);
90 }
91
92 void prf(
93 char *fmt,
94 unsigned int *adx,
95 void (*putfn_p)(),
96 void *putfn_arg
97 )
98 {
99 int b, c;
100 char *s;
101 int flag = 0, minwidth = 0, width = 0;
102
103 loop:
104 while ((c = *fmt++) != '%') {
105 if(c == '\0')
106 return;
107 (*putfn_p)(c, putfn_arg);
108 }
109 again:
110 c = *fmt++;
111 switch (c) {
112 case 'l':
113 goto again;
114 case ' ':
115 flag |= SPACE;
116 goto again;
117 case '0':
118 if (minwidth == 0) {
119 /* this is a flag */
120 flag |= ZERO;
121 goto again;
122 } /* fall through */
123 case '1':
124 case '2':
125 case '3':
126 case '4':
127 case '5':
128 case '6':
129 case '7':
130 case '8':
131 case '9':
132 minwidth *= 10;
133 minwidth += c - '0';
134 goto again;
135 case 'x': case 'X':
136 b = 16;
137 goto number;
138 case 'd':
139 b = 10;
140 goto number;
141 case 'o': case 'O':
142 b = 8;
143 number:
144 printn((u_long)*adx, b, flag, minwidth, putfn_p, putfn_arg);
145 break;
146 case 's':
147 s = (char *)*adx;
148 while (c = *s++) {
149 (*putfn_p)(c, putfn_arg);
150 width++;
151 }
152 while (width++ < minwidth)
153 (*putfn_p)(' ', putfn_arg);
154 break;
155 case 'c':
156 (*putfn_p)((char)*adx, putfn_arg);
157 break;
158 }
159 adx++;
160 goto loop;
161 }