Rev 2465 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2465 | Rev 4034 | ||
---|---|---|---|
Line 81... | Line 81... | ||
81 | * be in range 2 .. 16). |
81 | * be in range 2 .. 16). |
82 | * |
82 | * |
83 | */ |
83 | */ |
84 | static void print_number(const unative_t num, const unsigned int base) |
84 | static void print_number(const unative_t num, const unsigned int base) |
85 | { |
85 | { |
86 | int val = num; |
86 | int val = num; |
- | 87 | ||
- | 88 | /* This is enough even for base 2. */ |
|
87 | char d[sizeof(unative_t) * 8 + 1]; /* this is good enough even for base == 2 */ |
89 | char d[sizeof(unative_t) * 8 + 1]; |
88 | int i = sizeof(unative_t) * 8 - 1; |
90 | int i = sizeof(unative_t) * 8 - 1; |
89 | 91 | ||
90 | do { |
92 | do { |
91 | d[i--] = digits[val % base]; |
93 | d[i--] = digits[val % base]; |
92 | } while (val /= base); |
94 | } while (val /= base); |
93 | 95 | ||
94 | d[sizeof(unative_t) * 8] = 0; |
96 | d[sizeof(unative_t) * 8] = 0; |
95 | puts(&d[i + 1]); |
97 | puts(&d[i + 1]); |
96 | } |
98 | } |
97 | 99 | ||
98 | 100 | ||
Line 154... | Line 156... | ||
154 | void printf(const char *fmt, ...) |
156 | void printf(const char *fmt, ...) |
155 | { |
157 | { |
156 | int i = 0; |
158 | int i = 0; |
157 | va_list ap; |
159 | va_list ap; |
158 | char c; |
160 | char c; |
159 | 161 | ||
160 | va_start(ap, fmt); |
162 | va_start(ap, fmt); |
161 | 163 | ||
162 | while ((c = fmt[i++])) { |
164 | while ((c = fmt[i++])) { |
163 | switch (c) { |
165 | switch (c) { |
164 | 166 | ||
165 | /* control character */ |
167 | /* control character */ |
- | 168 | case '%': |
|
- | 169 | ||
- | 170 | switch (c = fmt[i++]) { |
|
- | 171 | ||
- | 172 | /* percentile itself */ |
|
166 | case '%': |
173 | case '%': |
- | 174 | break; |
|
- | 175 | ||
- | 176 | /* |
|
- | 177 | * String and character conversions. |
|
- | 178 | */ |
|
- | 179 | case 's': |
|
- | 180 | puts(va_arg(ap, char_ptr)); |
|
- | 181 | goto loop; |
|
- | 182 | ||
- | 183 | case 'c': |
|
- | 184 | c = (char) va_arg(ap, int); |
|
- | 185 | break; |
|
- | 186 | ||
- | 187 | /* |
|
- | 188 | * Hexadecimal conversions with fixed width. |
|
- | 189 | */ |
|
- | 190 | case 'P': |
|
- | 191 | puts("0x"); |
|
- | 192 | case 'p': |
|
- | 193 | print_fixed_hex(va_arg(ap, unative_t), |
|
- | 194 | sizeof(unative_t)); |
|
- | 195 | goto loop; |
|
- | 196 | ||
- | 197 | case 'Q': |
|
- | 198 | puts("0x"); |
|
- | 199 | case 'q': |
|
- | 200 | print_fixed_hex(va_arg(ap, uint64_t), INT64); |
|
- | 201 | goto loop; |
|
- | 202 | ||
- | 203 | case 'L': |
|
- | 204 | puts("0x"); |
|
- | 205 | case 'l': |
|
- | 206 | print_fixed_hex(va_arg(ap, unative_t), INT32); |
|
- | 207 | goto loop; |
|
- | 208 | ||
- | 209 | case 'W': |
|
- | 210 | puts("0x"); |
|
- | 211 | case 'w': |
|
- | 212 | print_fixed_hex(va_arg(ap, unative_t), INT16); |
|
- | 213 | goto loop; |
|
- | 214 | ||
- | 215 | case 'B': |
|
- | 216 | puts("0x"); |
|
- | 217 | case 'b': |
|
- | 218 | print_fixed_hex(va_arg(ap, unative_t), INT8); |
|
- | 219 | goto loop; |
|
- | 220 | ||
- | 221 | /* |
|
- | 222 | * Decimal and hexadecimal conversions. |
|
- | 223 | */ |
|
- | 224 | case 'd': |
|
- | 225 | print_number(va_arg(ap, unative_t), 10); |
|
- | 226 | goto loop; |
|
167 | 227 | ||
168 | switch (c = fmt[i++]) { |
- | |
169 | - | ||
170 | /* percentile itself */ |
- | |
171 | case '%': |
- | |
172 | break; |
- | |
173 | - | ||
174 | /* |
- | |
175 | * String and character conversions. |
- | |
176 | */ |
- | |
177 | case 's': |
- | |
178 | puts(va_arg(ap, char_ptr)); |
- | |
179 | goto loop; |
- | |
180 | - | ||
181 | case 'c': |
- | |
182 | c = (char) va_arg(ap, int); |
- | |
183 | break; |
- | |
184 | - | ||
185 | /* |
- | |
186 | * Hexadecimal conversions with fixed width. |
- | |
187 | */ |
- | |
188 | case 'P': |
- | |
189 | puts("0x"); |
- | |
190 | case 'p': |
- | |
191 | print_fixed_hex(va_arg(ap, unative_t), sizeof(unative_t)); |
- | |
192 | goto loop; |
- | |
193 | - | ||
194 | case 'Q': |
- | |
195 | puts("0x"); |
- | |
196 | case 'q': |
- | |
197 | print_fixed_hex(va_arg(ap, uint64_t), INT64); |
- | |
198 | goto loop; |
- | |
199 | - | ||
200 | case 'L': |
- | |
201 | puts("0x"); |
- | |
202 | case 'l': |
- | |
203 | print_fixed_hex(va_arg(ap, unative_t), INT32); |
- | |
204 | goto loop; |
- | |
205 | - | ||
206 | case 'W': |
- | |
207 | puts("0x"); |
- | |
208 | case 'w': |
- | |
209 | print_fixed_hex(va_arg(ap, unative_t), INT16); |
- | |
210 | goto loop; |
- | |
211 | - | ||
212 | case 'B': |
- | |
213 | puts("0x"); |
- | |
214 | case 'b': |
- | |
215 | print_fixed_hex(va_arg(ap, unative_t), INT8); |
- | |
216 | goto loop; |
- | |
217 | - | ||
218 | /* |
- | |
219 | * Decimal and hexadecimal conversions. |
- | |
220 | */ |
- | |
221 | case 'd': |
- | |
222 | print_number(va_arg(ap, unative_t), 10); |
- | |
223 | goto loop; |
- | |
224 | - | ||
225 | case 'X': |
228 | case 'X': |
226 | puts("0x"); |
229 | puts("0x"); |
227 | case 'x': |
230 | case 'x': |
228 | print_number(va_arg(ap, unative_t), 16); |
231 | print_number(va_arg(ap, unative_t), 16); |
229 | goto loop; |
232 | goto loop; |
230 | 233 | ||
231 | /* |
234 | /* |
232 | * Bad formatting. |
235 | * Bad formatting. |
233 | */ |
236 | */ |
234 | default: |
- | |
235 | goto out; |
- | |
236 | } |
- | |
237 | - | ||
238 | default: |
237 | default: |
- | 238 | goto out; |
|
- | 239 | } |
|
- | 240 | ||
- | 241 | default: |
|
239 | write(&c, 1); |
242 | write(&c, 1); |
240 | } |
243 | } |
241 | - | ||
242 | loop: |
244 | loop: |
243 | ; |
245 | ; |
244 | } |
246 | } |
245 | 247 | ||
246 | out: |
248 | out: |