Rev 3386 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3386 | Rev 4153 | ||
|---|---|---|---|
| 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: |