Rev 1444 | Rev 1617 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1444 | Rev 1616 | ||
|---|---|---|---|
| Line 35... | Line 35... | ||
| 35 | #include <unistd.h> |
35 | #include <unistd.h> |
| 36 | #include <stdio.h> |
36 | #include <stdio.h> |
| 37 | #include <io/printf_core.h> |
37 | #include <io/printf_core.h> |
| 38 | #include <ctype.h> |
38 | #include <ctype.h> |
| 39 | #include <string.h> |
39 | #include <string.h> |
| - | 40 | /* For serialization */ |
|
| - | 41 | #include <async.h> |
|
| 40 | 42 | ||
| 41 | #define __PRINTF_FLAG_PREFIX 0x00000001 /**< show prefixes 0x or 0*/ |
43 | #define __PRINTF_FLAG_PREFIX 0x00000001 /**< show prefixes 0x or 0*/ |
| 42 | #define __PRINTF_FLAG_SIGNED 0x00000002 /**< signed / unsigned number */ |
44 | #define __PRINTF_FLAG_SIGNED 0x00000002 /**< signed / unsigned number */ |
| 43 | #define __PRINTF_FLAG_ZEROPADDED 0x00000004 /**< print leading zeroes */ |
45 | #define __PRINTF_FLAG_ZEROPADDED 0x00000004 /**< print leading zeroes */ |
| 44 | #define __PRINTF_FLAG_LEFTALIGNED 0x00000010 /**< align to left */ |
46 | #define __PRINTF_FLAG_LEFTALIGNED 0x00000010 /**< align to left */ |
| Line 442... | Line 444... | ||
| 442 | uint64_t number; /* argument value */ |
444 | uint64_t number; /* argument value */ |
| 443 | size_t size; /* byte size of integer parameter */ |
445 | size_t size; /* byte size of integer parameter */ |
| 444 | int width, precision; |
446 | int width, precision; |
| 445 | uint64_t flags; |
447 | uint64_t flags; |
| 446 | 448 | ||
| - | 449 | /* Don't let other threads interfere */ |
|
| - | 450 | async_serialize_start(); |
|
| - | 451 | ||
| 447 | counter = 0; |
452 | counter = 0; |
| 448 | 453 | ||
| 449 | while ((c = fmt[i])) { |
454 | while ((c = fmt[i])) { |
| 450 | /* control character */ |
455 | /* control character */ |
| 451 | if (c == '%' ) { |
456 | if (c == '%' ) { |
| 452 | /* print common characters if any processed */ |
457 | /* print common characters if any processed */ |
| 453 | if (i > j) { |
458 | if (i > j) { |
| 454 | if ((retval = printf_putnchars(&fmt[j], (size_t)(i - j), ps)) == EOF) { /* error */ |
459 | if ((retval = printf_putnchars(&fmt[j], (size_t)(i - j), ps)) == EOF) { /* error */ |
| 455 | return -counter; |
460 | goto minus_out; |
| 456 | } |
461 | } |
| 457 | counter += retval; |
462 | counter += retval; |
| 458 | } |
463 | } |
| 459 | 464 | ||
| 460 | j = i; |
465 | j = i; |
| Line 546... | Line 551... | ||
| 546 | /* |
551 | /* |
| 547 | * String and character conversions. |
552 | * String and character conversions. |
| 548 | */ |
553 | */ |
| 549 | case 's': |
554 | case 's': |
| 550 | if ((retval = print_string(va_arg(ap, char*), width, precision, flags, ps)) == EOF) { |
555 | if ((retval = print_string(va_arg(ap, char*), width, precision, flags, ps)) == EOF) { |
| 551 | return -counter; |
556 | goto minus_out; |
| 552 | }; |
557 | }; |
| 553 | 558 | ||
| 554 | counter += retval; |
559 | counter += retval; |
| 555 | j = i + 1; |
560 | j = i + 1; |
| 556 | goto next_char; |
561 | goto next_char; |
| 557 | case 'c': |
562 | case 'c': |
| 558 | c = va_arg(ap, unsigned int); |
563 | c = va_arg(ap, unsigned int); |
| 559 | if ((retval = print_char(c, width, flags, ps)) == EOF) { |
564 | if ((retval = print_char(c, width, flags, ps)) == EOF) { |
| 560 | return -counter; |
565 | goto minus_out; |
| 561 | }; |
566 | }; |
| 562 | 567 | ||
| 563 | counter += retval; |
568 | counter += retval; |
| 564 | j = i + 1; |
569 | j = i + 1; |
| 565 | goto next_char; |
570 | goto next_char; |
| Line 636... | Line 641... | ||
| 636 | case PrintfQualifierSizeT: |
641 | case PrintfQualifierSizeT: |
| 637 | size = sizeof(size_t); |
642 | size = sizeof(size_t); |
| 638 | number = (uint64_t)va_arg(ap, size_t); |
643 | number = (uint64_t)va_arg(ap, size_t); |
| 639 | break; |
644 | break; |
| 640 | default: /* Unknown qualifier */ |
645 | default: /* Unknown qualifier */ |
| 641 | return -counter; |
646 | goto minus_out; |
| 642 | 647 | ||
| 643 | } |
648 | } |
| 644 | 649 | ||
| 645 | if (flags & __PRINTF_FLAG_SIGNED) { |
650 | if (flags & __PRINTF_FLAG_SIGNED) { |
| 646 | if (number & (0x1 << (size*8 - 1))) { |
651 | if (number & (0x1 << (size*8 - 1))) { |
| Line 655... | Line 660... | ||
| 655 | } |
660 | } |
| 656 | } |
661 | } |
| 657 | } |
662 | } |
| 658 | 663 | ||
| 659 | if ((retval = print_number(number, width, precision, base, flags, ps)) == EOF ) { |
664 | if ((retval = print_number(number, width, precision, base, flags, ps)) == EOF ) { |
| 660 | return -counter; |
665 | goto minus_out; |
| 661 | }; |
666 | }; |
| 662 | 667 | ||
| 663 | counter += retval; |
668 | counter += retval; |
| 664 | j = i + 1; |
669 | j = i + 1; |
| 665 | } |
670 | } |
| Line 668... | Line 673... | ||
| 668 | ++i; |
673 | ++i; |
| 669 | } |
674 | } |
| 670 | 675 | ||
| 671 | if (i > j) { |
676 | if (i > j) { |
| 672 | if ((retval = printf_putnchars(&fmt[j], (size_t)(i - j), ps)) == EOF) { /* error */ |
677 | if ((retval = printf_putnchars(&fmt[j], (size_t)(i - j), ps)) == EOF) { /* error */ |
| 673 | return -counter; |
678 | goto minus_out; |
| 674 | } |
679 | } |
| 675 | counter += retval; |
680 | counter += retval; |
| 676 | } |
681 | } |
| 677 | 682 | ||
| - | 683 | async_serialize_end(); |
|
| 678 | return counter; |
684 | return counter; |
| - | 685 | minus_out: |
|
| - | 686 | async_serialize_end(); |
|
| - | 687 | return -counter; |
|
| 679 | } |
688 | } |
| 680 | 689 | ||