- PCHify freeldr and cleanup some headers (just a start).
[reactos.git] / reactos / boot / freeldr / freeldr / rtl / print.c
1 /*
2 * FreeLoader
3 * Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19
20 #include <freeldr.h>
21
22 /*
23 * print() - prints unformatted text to stdout
24 */
25 void print(char *str)
26 {
27 size_t i;
28
29 for (i = 0; i < strlen(str); i++)
30 MachConsPutChar(str[i]);
31 }
32
33 /*
34 * printf() - prints formatted text to stdout
35 * originally from GRUB
36 */
37 int printf(const char *format, ... )
38 {
39 va_list ap;
40 va_start(ap,format);
41 char c, *ptr, str[16];
42 int ll;
43
44 while ((c = *(format++)))
45 {
46 if (c != '%')
47 {
48 MachConsPutChar(c);
49 }
50 else
51 {
52 if (*format == 'I' && *(format+1) == '6' && *(format+2) == '4')
53 {
54 ll = 1;
55 format += 3;
56 }
57 else
58 {
59 ll = 0;
60 }
61 switch (c = *(format++))
62 {
63 case 'd': case 'u': case 'x':
64 if (ll)
65 {
66 *convert_i64_to_ascii(str, c, va_arg(ap, unsigned long long)) = 0;
67 }
68 else
69 {
70 *convert_to_ascii(str, c, va_arg(ap, unsigned long)) = 0;
71 }
72
73 ptr = str;
74
75 while (*ptr)
76 {
77 MachConsPutChar(*(ptr++));
78 }
79 break;
80
81 case 'c': MachConsPutChar((va_arg(ap,int))&0xff); break;
82
83 case 's':
84 ptr = va_arg(ap,char *);
85
86 while ((c = *(ptr++)))
87 {
88 MachConsPutChar(c);
89 }
90 break;
91 case '%':
92 MachConsPutChar(c);
93 break;
94 default:
95 printf("\nprintf() invalid format specifier - %%%c\n", c);
96 break;
97 }
98 }
99 }
100
101 va_end(ap);
102
103 return 0;
104 }
105
106 int sprintf(char *buffer, const char *format, ... )
107 {
108 va_list ap;
109 char c, *ptr, str[16];
110 char *p = buffer;
111 int ll;
112
113 va_start(ap,format);
114
115 while ((c = *(format++)))
116 {
117 if (c != '%')
118 {
119 *p = c;
120 p++;
121 }
122 else
123 {
124 if (*format == 'I' && *(format+1) == '6' && *(format+2) == '4')
125 {
126 ll = 1;
127 format += 3;
128 }
129 else
130 {
131 ll = 0;
132 }
133 switch (c = *(format++))
134 {
135 case 'd': case 'u': case 'x':
136 if (ll)
137 {
138 *convert_i64_to_ascii(str, c, va_arg(ap, unsigned long long)) = 0;
139 }
140 else
141 {
142 *convert_to_ascii(str, c, va_arg(ap, unsigned long)) = 0;
143 }
144
145 ptr = str;
146
147 while (*ptr)
148 {
149 *p = *(ptr++);
150 p++;
151 }
152 break;
153
154 case 'c':
155 *p = va_arg(ap,int)&0xff;
156 p++;
157 break;
158
159 case 's':
160 ptr = va_arg(ap,char *);
161
162 while ((c = *(ptr++)))
163 {
164 *p = c;
165 p++;
166 }
167 break;
168 case '%':
169 *p = c;
170 p++;
171 break;
172 default:
173 printf("\nsprintf() invalid format specifier - %%%c\n", c);
174 break;
175 }
176 }
177 }
178 va_end(ap);
179 *p=0;
180
181 return 0;
182 }