Rev 3022 | Rev 4221 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3022 | Rev 4055 | ||
---|---|---|---|
Line 38... | Line 38... | ||
38 | #include <printf/printf_core.h> |
38 | #include <printf/printf_core.h> |
39 | #include <putchar.h> |
39 | #include <putchar.h> |
40 | #include <print.h> |
40 | #include <print.h> |
41 | #include <arch/arg.h> |
41 | #include <arch/arg.h> |
42 | #include <macros.h> |
42 | #include <macros.h> |
43 | #include <func.h> |
43 | #include <string.h> |
44 | #include <arch.h> |
44 | #include <arch.h> |
45 | 45 | ||
46 | /** show prefixes 0x or 0 */ |
46 | /** show prefixes 0x or 0 */ |
47 | #define __PRINTF_FLAG_PREFIX 0x00000001 |
47 | #define __PRINTF_FLAG_PREFIX 0x00000001 |
48 | /** signed / unsigned number */ |
48 | /** signed / unsigned number */ |
Line 73... | Line 73... | ||
73 | PrintfQualifierByte = 0, |
73 | PrintfQualifierByte = 0, |
74 | PrintfQualifierShort, |
74 | PrintfQualifierShort, |
75 | PrintfQualifierInt, |
75 | PrintfQualifierInt, |
76 | PrintfQualifierLong, |
76 | PrintfQualifierLong, |
77 | PrintfQualifierLongLong, |
77 | PrintfQualifierLongLong, |
78 | PrintfQualifierNative, |
- | |
79 | PrintfQualifierPointer |
78 | PrintfQualifierPointer |
80 | } qualifier_t; |
79 | } qualifier_t; |
81 | 80 | ||
82 | static char digits_small[] = "0123456789abcdef"; |
81 | static char digits_small[] = "0123456789abcdef"; |
83 | static char digits_big[] = "0123456789ABCDEF"; |
82 | static char digits_big[] = "0123456789ABCDEF"; |
Line 430... | Line 429... | ||
430 | * - "hh" Signed or unsigned char.@n |
429 | * - "hh" Signed or unsigned char.@n |
431 | * - "h" Signed or unsigned short.@n |
430 | * - "h" Signed or unsigned short.@n |
432 | * - "" Signed or unsigned int (default value).@n |
431 | * - "" Signed or unsigned int (default value).@n |
433 | * - "l" Signed or unsigned long int.@n |
432 | * - "l" Signed or unsigned long int.@n |
434 | * - "ll" Signed or unsigned long long int.@n |
433 | * - "ll" Signed or unsigned long long int.@n |
435 | * - "z" unative_t (non-standard extension).@n |
- | |
436 | * |
434 | * |
437 | * |
435 | * |
438 | * CONVERSION:@n |
436 | * CONVERSION:@n |
439 | * - % Print percentile character itself. |
437 | * - % Print percentile character itself. |
440 | * |
438 | * |
Line 484... | Line 482... | ||
484 | 482 | ||
485 | counter = 0; |
483 | counter = 0; |
486 | 484 | ||
487 | while ((c = fmt[i])) { |
485 | while ((c = fmt[i])) { |
488 | /* control character */ |
486 | /* control character */ |
489 | if (c == '%' ) { |
487 | if (c == '%') { |
490 | /* print common characters if any processed */ |
488 | /* print common characters if any processed */ |
491 | if (i > j) { |
489 | if (i > j) { |
492 | if ((retval = printf_putnchars(&fmt[j], |
490 | if ((retval = printf_putnchars(&fmt[j], |
493 | (size_t)(i - j), ps)) < 0) { /* error */ |
491 | (size_t)(i - j), ps)) < 0) { /* error */ |
494 | counter = -counter; |
492 | counter = -counter; |
Line 534... | Line 532... | ||
534 | width += fmt[i++] - '0'; |
532 | width += fmt[i++] - '0'; |
535 | } |
533 | } |
536 | } else if (fmt[i] == '*') { |
534 | } else if (fmt[i] == '*') { |
537 | /* get width value from argument list */ |
535 | /* get width value from argument list */ |
538 | i++; |
536 | i++; |
539 | width = (int)va_arg(ap, int); |
537 | width = (int) va_arg(ap, int); |
540 | if (width < 0) { |
538 | if (width < 0) { |
541 | /* negative width sets '-' flag */ |
539 | /* negative width sets '-' flag */ |
542 | width *= -1; |
540 | width *= -1; |
543 | flags |= __PRINTF_FLAG_LEFTALIGNED; |
541 | flags |= __PRINTF_FLAG_LEFTALIGNED; |
544 | } |
542 | } |
Line 557... | Line 555... | ||
557 | /* |
555 | /* |
558 | * Get precision value from the argument |
556 | * Get precision value from the argument |
559 | * list. |
557 | * list. |
560 | */ |
558 | */ |
561 | i++; |
559 | i++; |
562 | precision = (int)va_arg(ap, int); |
560 | precision = (int) va_arg(ap, int); |
563 | if (precision < 0) { |
561 | if (precision < 0) { |
564 | /* ignore negative precision */ |
562 | /* ignore negative precision */ |
565 | precision = 0; |
563 | precision = 0; |
566 | } |
564 | } |
567 | } |
565 | } |
Line 583... | Line 581... | ||
583 | if (fmt[i] == 'l') { |
581 | if (fmt[i] == 'l') { |
584 | i++; |
582 | i++; |
585 | qualifier = PrintfQualifierLongLong; |
583 | qualifier = PrintfQualifierLongLong; |
586 | } |
584 | } |
587 | break; |
585 | break; |
588 | case 'z': /* unative_t */ |
- | |
589 | qualifier = PrintfQualifierNative; |
- | |
590 | break; |
- | |
591 | default: |
586 | default: |
592 | /* default type */ |
587 | /* default type */ |
593 | qualifier = PrintfQualifierInt; |
588 | qualifier = PrintfQualifierInt; |
594 | --i; |
589 | --i; |
595 | } |
590 | } |
Line 625... | Line 620... | ||
625 | 620 | ||
626 | /* |
621 | /* |
627 | * Integer values |
622 | * Integer values |
628 | */ |
623 | */ |
629 | case 'P': /* pointer */ |
624 | case 'P': /* pointer */ |
630 | flags |= __PRINTF_FLAG_BIGCHARS; |
625 | flags |= __PRINTF_FLAG_BIGCHARS; |
631 | case 'p': |
626 | case 'p': |
632 | flags |= __PRINTF_FLAG_PREFIX; |
627 | flags |= __PRINTF_FLAG_PREFIX; |
633 | base = 16; |
628 | base = 16; |
634 | qualifier = PrintfQualifierPointer; |
629 | qualifier = PrintfQualifierPointer; |
635 | break; |
630 | break; |
Line 668... | Line 663... | ||
668 | /* Print integers */ |
663 | /* Print integers */ |
669 | /* print number */ |
664 | /* print number */ |
670 | switch (qualifier) { |
665 | switch (qualifier) { |
671 | case PrintfQualifierByte: |
666 | case PrintfQualifierByte: |
672 | size = sizeof(unsigned char); |
667 | size = sizeof(unsigned char); |
673 | number = (uint64_t)va_arg(ap, unsigned int); |
668 | number = (uint64_t) va_arg(ap, unsigned int); |
674 | break; |
669 | break; |
675 | case PrintfQualifierShort: |
670 | case PrintfQualifierShort: |
676 | size = sizeof(unsigned short); |
671 | size = sizeof(unsigned short); |
677 | number = (uint64_t)va_arg(ap, unsigned int); |
672 | number = (uint64_t) va_arg(ap, unsigned int); |
678 | break; |
673 | break; |
679 | case PrintfQualifierInt: |
674 | case PrintfQualifierInt: |
680 | size = sizeof(unsigned int); |
675 | size = sizeof(unsigned int); |
681 | number = (uint64_t)va_arg(ap, unsigned int); |
676 | number = (uint64_t) va_arg(ap, unsigned int); |
682 | break; |
677 | break; |
683 | case PrintfQualifierLong: |
678 | case PrintfQualifierLong: |
684 | size = sizeof(unsigned long); |
679 | size = sizeof(unsigned long); |
685 | number = (uint64_t)va_arg(ap, unsigned long); |
680 | number = (uint64_t) va_arg(ap, unsigned long); |
686 | break; |
681 | break; |
687 | case PrintfQualifierLongLong: |
682 | case PrintfQualifierLongLong: |
688 | size = sizeof(unsigned long long); |
683 | size = sizeof(unsigned long long); |
689 | number = (uint64_t)va_arg(ap, |
684 | number = (uint64_t) va_arg(ap, unsigned long long); |
690 | unsigned long long); |
- | |
691 | break; |
685 | break; |
692 | case PrintfQualifierPointer: |
686 | case PrintfQualifierPointer: |
693 | size = sizeof(void *); |
687 | size = sizeof(void *); |
694 | number = (uint64_t)(unsigned long)va_arg(ap, |
688 | number = (uint64_t) (unsigned long) va_arg(ap, void *); |
695 | void *); |
- | |
696 | break; |
- | |
697 | case PrintfQualifierNative: |
- | |
698 | size = sizeof(unative_t); |
- | |
699 | number = (uint64_t)va_arg(ap, unative_t); |
- | |
700 | break; |
689 | break; |
701 | default: /* Unknown qualifier */ |
690 | default: /* Unknown qualifier */ |
702 | counter = -counter; |
691 | counter = -counter; |
703 | goto out; |
692 | goto out; |
704 | } |
693 | } |
Line 706... | Line 695... | ||
706 | if (flags & __PRINTF_FLAG_SIGNED) { |
695 | if (flags & __PRINTF_FLAG_SIGNED) { |
707 | if (number & (0x1 << (size * 8 - 1))) { |
696 | if (number & (0x1 << (size * 8 - 1))) { |
708 | flags |= __PRINTF_FLAG_NEGATIVE; |
697 | flags |= __PRINTF_FLAG_NEGATIVE; |
709 | 698 | ||
710 | if (size == sizeof(uint64_t)) { |
699 | if (size == sizeof(uint64_t)) { |
711 | number = -((int64_t)number); |
700 | number = -((int64_t) number); |
712 | } else { |
701 | } else { |
713 | number = ~number; |
702 | number = ~number; |
714 | number &= |
703 | number &= |
715 | ~(0xFFFFFFFFFFFFFFFFll << |
704 | ~(0xFFFFFFFFFFFFFFFFll << |
716 | (size * 8)); |
705 | (size * 8)); |
Line 732... | Line 721... | ||
732 | 721 | ||
733 | ++i; |
722 | ++i; |
734 | } |
723 | } |
735 | 724 | ||
736 | if (i > j) { |
725 | if (i > j) { |
737 | if ((retval = printf_putnchars(&fmt[j], (unative_t)(i - j), |
726 | if ((retval = printf_putnchars(&fmt[j], (unative_t) (i - j), |
738 | ps)) < 0) { /* error */ |
727 | ps)) < 0) { /* error */ |
739 | counter = -counter; |
728 | counter = -counter; |
740 | goto out; |
729 | goto out; |
741 | 730 | ||
742 | } |
731 | } |
743 | counter += retval; |
732 | counter += retval; |
744 | } |
733 | } |
745 | 734 | ||
746 | out: |
735 | out: |
747 | - | ||
748 | return counter; |
736 | return counter; |
749 | } |
737 | } |
750 | 738 | ||
751 | /** @} |
739 | /** @} |
752 | */ |
740 | */ |