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 | - | ||