Rev 1880 | Rev 2070 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1880 | Rev 1888 | ||
---|---|---|---|
Line 25... | Line 25... | ||
25 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
26 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
26 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
27 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
28 | */ |
28 | */ |
29 | 29 | ||
30 | /** @addtogroup generic |
30 | /** @addtogroup generic |
31 | * @{ |
31 | * @{ |
32 | */ |
32 | */ |
33 | /** |
33 | /** |
34 | * @file |
34 | * @file |
35 | * @brief Printing functions. |
35 | * @brief Printing functions. |
Line 494... | Line 494... | ||
494 | end = 0; |
494 | end = 0; |
495 | 495 | ||
496 | do { |
496 | do { |
497 | ++i; |
497 | ++i; |
498 | switch (c = fmt[i]) { |
498 | switch (c = fmt[i]) { |
499 | case '#': flags |= __PRINTF_FLAG_PREFIX; break; |
499 | case '#': flags |= __PRINTF_FLAG_PREFIX; break; |
500 | case '-': flags |= __PRINTF_FLAG_LEFTALIGNED; break; |
500 | case '-': flags |= __PRINTF_FLAG_LEFTALIGNED; break; |
501 | case '+': flags |= __PRINTF_FLAG_SHOWPLUS; break; |
501 | case '+': flags |= __PRINTF_FLAG_SHOWPLUS; break; |
502 | case ' ': flags |= __PRINTF_FLAG_SPACESIGN; break; |
502 | case ' ': flags |= __PRINTF_FLAG_SPACESIGN; break; |
503 | case '0': flags |= __PRINTF_FLAG_ZEROPADDED; break; |
503 | case '0': flags |= __PRINTF_FLAG_ZEROPADDED; break; |
504 | default: end = 1; |
504 | default: end = 1; |
505 | }; |
505 | }; |
506 | 506 | ||
507 | } while (end == 0); |
507 | } while (end == 0); |
508 | 508 | ||
509 | /* width & '*' operator */ |
509 | /* width & '*' operator */ |
Line 543... | Line 543... | ||
543 | } |
543 | } |
544 | } |
544 | } |
545 | } |
545 | } |
546 | 546 | ||
547 | switch (fmt[i++]) { |
547 | switch (fmt[i++]) { |
548 | /** TODO: unimplemented qualifiers: |
548 | /** TODO: unimplemented qualifiers: |
549 | * t ptrdiff_t - ISO C 99 |
549 | * t ptrdiff_t - ISO C 99 |
550 | */ |
550 | */ |
551 | case 'h': /* char or short */ |
551 | case 'h': /* char or short */ |
552 | qualifier = PrintfQualifierShort; |
552 | qualifier = PrintfQualifierShort; |
553 | if (fmt[i] == 'h') { |
553 | if (fmt[i] == 'h') { |
554 | i++; |
554 | i++; |
555 | qualifier = PrintfQualifierByte; |
555 | qualifier = PrintfQualifierByte; |
556 | } |
556 | } |
557 | break; |
557 | break; |
558 | case 'l': /* long or long long*/ |
558 | case 'l': /* long or long long*/ |
559 | qualifier = PrintfQualifierLong; |
559 | qualifier = PrintfQualifierLong; |
560 | if (fmt[i] == 'l') { |
560 | if (fmt[i] == 'l') { |
561 | i++; |
561 | i++; |
562 | qualifier = PrintfQualifierLongLong; |
562 | qualifier = PrintfQualifierLongLong; |
563 | } |
563 | } |
564 | break; |
564 | break; |
565 | case 'z': /* unative_t */ |
565 | case 'z': /* unative_t */ |
566 | qualifier = PrintfQualifierNative; |
566 | qualifier = PrintfQualifierNative; |
567 | break; |
567 | break; |
568 | default: |
568 | default: |
569 | qualifier = PrintfQualifierInt; /* default type */ |
569 | qualifier = PrintfQualifierInt; /* default type */ |
570 | --i; |
570 | --i; |
571 | } |
571 | } |
572 | 572 | ||
573 | base = 10; |
573 | base = 10; |
574 | 574 | ||
575 | switch (c = fmt[i]) { |
575 | switch (c = fmt[i]) { |
576 | 576 | ||
577 | /* |
577 | /* |
578 | * String and character conversions. |
578 | * String and character conversions. |
579 | */ |
579 | */ |
580 | case 's': |
580 | case 's': |
581 | if ((retval = print_string(va_arg(ap, char*), width, precision, flags, ps)) < 0) { |
581 | if ((retval = print_string(va_arg(ap, char*), width, precision, flags, ps)) < 0) { |
582 | counter = -counter; |
582 | counter = -counter; |
583 | goto out; |
583 | goto out; |
584 | }; |
584 | }; |
585 | 585 | ||
586 | counter += retval; |
586 | counter += retval; |
587 | j = i + 1; |
587 | j = i + 1; |
588 | goto next_char; |
588 | goto next_char; |
589 | case 'c': |
589 | case 'c': |
590 | c = va_arg(ap, unsigned int); |
590 | c = va_arg(ap, unsigned int); |
591 | if ((retval = print_char(c, width, flags, ps)) < 0) { |
591 | if ((retval = print_char(c, width, flags, ps)) < 0) { |
592 | counter = -counter; |
592 | counter = -counter; |
593 | goto out; |
593 | goto out; |
594 | }; |
594 | }; |
595 | 595 | ||
596 | counter += retval; |
596 | counter += retval; |
597 | j = i + 1; |
597 | j = i + 1; |
598 | goto next_char; |
598 | goto next_char; |
599 | 599 | ||
600 | /* |
600 | /* |
601 | * Integer values |
601 | * Integer values |
602 | */ |
602 | */ |
603 | case 'P': /* pointer */ |
603 | case 'P': /* pointer */ |
604 | flags |= __PRINTF_FLAG_BIGCHARS; |
604 | flags |= __PRINTF_FLAG_BIGCHARS; |
605 | case 'p': |
605 | case 'p': |
606 | flags |= __PRINTF_FLAG_PREFIX; |
606 | flags |= __PRINTF_FLAG_PREFIX; |
607 | base = 16; |
607 | base = 16; |
608 | qualifier = PrintfQualifierPointer; |
608 | qualifier = PrintfQualifierPointer; |
609 | break; |
609 | break; |
610 | case 'b': |
610 | case 'b': |
611 | base = 2; |
611 | base = 2; |
612 | break; |
612 | break; |
613 | case 'o': |
613 | case 'o': |
614 | base = 8; |
614 | base = 8; |
615 | break; |
615 | break; |
616 | case 'd': |
616 | case 'd': |
617 | case 'i': |
617 | case 'i': |
618 | flags |= __PRINTF_FLAG_SIGNED; |
618 | flags |= __PRINTF_FLAG_SIGNED; |
619 | case 'u': |
619 | case 'u': |
620 | break; |
620 | break; |
621 | case 'X': |
621 | case 'X': |
622 | flags |= __PRINTF_FLAG_BIGCHARS; |
622 | flags |= __PRINTF_FLAG_BIGCHARS; |
623 | case 'x': |
623 | case 'x': |
624 | base = 16; |
624 | base = 16; |
625 | break; |
625 | break; |
626 | /* percentile itself */ |
626 | /* percentile itself */ |
627 | case '%': |
627 | case '%': |
628 | j = i; |
628 | j = i; |
629 | goto next_char; |
629 | goto next_char; |
630 | /* |
630 | /* |
631 | * Bad formatting. |
631 | * Bad formatting. |
632 | */ |
632 | */ |
633 | default: |
633 | default: |
634 | /* Unknown format |
634 | /* Unknown format |
635 | * now, the j is index of '%' so we will |
635 | * now, j is index of '%' so we will |
636 | * print whole bad format sequence |
636 | * print whole bad format sequence |
637 | */ |
637 | */ |
638 | goto next_char; |
638 | goto next_char; |
639 | } |
639 | } |
640 | 640 | ||
641 | 641 | ||
642 | /* Print integers */ |
642 | /* Print integers */ |
643 | /* print number */ |
643 | /* print number */ |
644 | switch (qualifier) { |
644 | switch (qualifier) { |
645 | case PrintfQualifierByte: |
645 | case PrintfQualifierByte: |
646 | size = sizeof(unsigned char); |
646 | size = sizeof(unsigned char); |
647 | number = (uint64_t)va_arg(ap, unsigned int); |
647 | number = (uint64_t)va_arg(ap, unsigned int); |
648 | break; |
648 | break; |
649 | case PrintfQualifierShort: |
649 | case PrintfQualifierShort: |
650 | size = sizeof(unsigned short); |
650 | size = sizeof(unsigned short); |
651 | number = (uint64_t)va_arg(ap, unsigned int); |
651 | number = (uint64_t)va_arg(ap, unsigned int); |
652 | break; |
652 | break; |
653 | case PrintfQualifierInt: |
653 | case PrintfQualifierInt: |
654 | size = sizeof(unsigned int); |
654 | size = sizeof(unsigned int); |
655 | number = (uint64_t)va_arg(ap, unsigned int); |
655 | number = (uint64_t)va_arg(ap, unsigned int); |
656 | break; |
656 | break; |
657 | case PrintfQualifierLong: |
657 | case PrintfQualifierLong: |
658 | size = sizeof(unsigned long); |
658 | size = sizeof(unsigned long); |
659 | number = (uint64_t)va_arg(ap, unsigned long); |
659 | number = (uint64_t)va_arg(ap, unsigned long); |
660 | break; |
660 | break; |
661 | case PrintfQualifierLongLong: |
661 | case PrintfQualifierLongLong: |
662 | size = sizeof(unsigned long long); |
662 | size = sizeof(unsigned long long); |
663 | number = (uint64_t)va_arg(ap, unsigned long long); |
663 | number = (uint64_t)va_arg(ap, unsigned long long); |
664 | break; |
664 | break; |
665 | case PrintfQualifierPointer: |
665 | case PrintfQualifierPointer: |
666 | size = sizeof(void *); |
666 | size = sizeof(void *); |
667 | number = (uint64_t)(unsigned long)va_arg(ap, void *); |
667 | number = (uint64_t)(unsigned long)va_arg(ap, void *); |
668 | break; |
668 | break; |
669 | case PrintfQualifierNative: |
669 | case PrintfQualifierNative: |
670 | size = sizeof(unative_t); |
670 | size = sizeof(unative_t); |
671 | number = (uint64_t)va_arg(ap, unative_t); |
671 | number = (uint64_t)va_arg(ap, unative_t); |
672 | break; |
672 | break; |
673 | default: /* Unknown qualifier */ |
673 | default: /* Unknown qualifier */ |
674 | counter = -counter; |
674 | counter = -counter; |
675 | goto out; |
675 | goto out; |
676 | } |
676 | } |
677 | 677 | ||
678 | if (flags & __PRINTF_FLAG_SIGNED) { |
678 | if (flags & __PRINTF_FLAG_SIGNED) { |
679 | if (number & (0x1 << (size*8 - 1))) { |
679 | if (number & (0x1 << (size*8 - 1))) { |
680 | flags |= __PRINTF_FLAG_NEGATIVE; |
680 | flags |= __PRINTF_FLAG_NEGATIVE; |
Line 716... | Line 716... | ||
716 | interrupts_restore(irqpri); |
716 | interrupts_restore(irqpri); |
717 | 717 | ||
718 | return counter; |
718 | return counter; |
719 | } |
719 | } |
720 | 720 | ||
721 | - | ||
722 | /** @} |
721 | /** @} |
723 | */ |
722 | */ |
724 | - |