328 |
{ |
{ |
329 |
char c; |
char c; |
330 |
int count = 0; |
int count = 0; |
331 |
auto void write_char (char ch); |
auto void write_char (unsigned char ch); |
332 |
auto void write_str (const char *s); |
auto void write_str (const char *s); |
333 |
|
|
334 |
void write_char (char ch) |
void write_char (unsigned char ch) |
335 |
{ |
{ |
336 |
if (str) |
if (str) |
337 |
*str++ = ch; |
*str++ = ch; |
375 |
|
|
376 |
case 'c': |
case 'c': |
377 |
n = va_arg (args, int); |
n = va_arg (args, int); |
378 |
write_char (n); |
write_char (n & 0xff); |
379 |
|
break; |
380 |
|
|
381 |
|
case 'C': |
382 |
|
{ |
383 |
|
pupa_uint32_t code = va_arg (args, pupa_uint32_t); |
384 |
|
int shift; |
385 |
|
unsigned mask; |
386 |
|
|
387 |
|
if (code <= 0x7f) |
388 |
|
{ |
389 |
|
shift = 0; |
390 |
|
mask = 0; |
391 |
|
} |
392 |
|
else if (code <= 0x7ff) |
393 |
|
{ |
394 |
|
shift = 6; |
395 |
|
mask = 0xc0; |
396 |
|
} |
397 |
|
else if (code <= 0xffff) |
398 |
|
{ |
399 |
|
shift = 12; |
400 |
|
mask = 0xe0; |
401 |
|
} |
402 |
|
else if (code <= 0x1fffff) |
403 |
|
{ |
404 |
|
shift = 18; |
405 |
|
mask = 0xf0; |
406 |
|
} |
407 |
|
else if (code <= 0x3ffffff) |
408 |
|
{ |
409 |
|
shift = 24; |
410 |
|
mask = 0xf8; |
411 |
|
} |
412 |
|
else if (code <= 0x7fffffff) |
413 |
|
{ |
414 |
|
shift = 30; |
415 |
|
mask = 0xfc; |
416 |
|
} |
417 |
|
else |
418 |
|
{ |
419 |
|
code = '?'; |
420 |
|
shift = 0; |
421 |
|
mask = 0; |
422 |
|
} |
423 |
|
|
424 |
|
write_char (mask | (code >> shift)); |
425 |
|
|
426 |
|
for (shift -= 6; shift >= 0; shift -= 6) |
427 |
|
write_char (0x80 | (0x3f & (code >> shift))); |
428 |
|
} |
429 |
break; |
break; |
430 |
|
|
431 |
case 's': |
case 's': |