Subversion Repositories HelenOS

Rev

Rev 4199 | Rev 4205 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4199 Rev 4200
Line 592... Line 592...
592
    count_t counter = 0;  /* Number of UTF-8 characters printed */
592
    count_t counter = 0;  /* Number of UTF-8 characters printed */
593
    int retval;           /* Return values from nested functions */
593
    int retval;           /* Return values from nested functions */
594
   
594
   
595
    while (true) {
595
    while (true) {
596
        i = nxt;
596
        i = nxt;
597
        uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
597
        uc = chr_decode(fmt, &nxt, UTF8_NO_LIMIT);
598
 
598
 
599
        if (uc == '\0') break;
599
        if (uc == '\0') break;
600
 
600
 
601
        /* Control character */
601
        /* Control character */
602
        if (uc == '%') {
602
        if (uc == '%') {
Line 616... Line 616...
616
            uint32_t flags = 0;
616
            uint32_t flags = 0;
617
            bool end = false;
617
            bool end = false;
618
           
618
           
619
            do {
619
            do {
620
                i = nxt;
620
                i = nxt;
621
                uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
621
                uc = chr_decode(fmt, &nxt, UTF8_NO_LIMIT);
622
                switch (uc) {
622
                switch (uc) {
623
                case '#':
623
                case '#':
624
                    flags |= __PRINTF_FLAG_PREFIX;
624
                    flags |= __PRINTF_FLAG_PREFIX;
625
                    break;
625
                    break;
626
                case '-':
626
                case '-':
Line 646... Line 646...
646
                while (true) {
646
                while (true) {
647
                    width *= 10;
647
                    width *= 10;
648
                    width += uc - '0';
648
                    width += uc - '0';
649
 
649
 
650
                    i = nxt;
650
                    i = nxt;
651
                    uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
651
                    uc = chr_decode(fmt, &nxt, UTF8_NO_LIMIT);
652
                    if (uc == '\0')
652
                    if (uc == '\0')
653
                        break;
653
                        break;
654
                    if (!isdigit(uc))
654
                    if (!isdigit(uc))
655
                        break;
655
                        break;
656
                }
656
                }
657
            } else if (uc == '*') {
657
            } else if (uc == '*') {
658
                /* Get width value from argument list */
658
                /* Get width value from argument list */
659
                i = nxt;
659
                i = nxt;
660
                uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
660
                uc = chr_decode(fmt, &nxt, UTF8_NO_LIMIT);
661
                width = (int) va_arg(ap, int);
661
                width = (int) va_arg(ap, int);
662
                if (width < 0) {
662
                if (width < 0) {
663
                    /* Negative width sets '-' flag */
663
                    /* Negative width sets '-' flag */
664
                    width *= -1;
664
                    width *= -1;
665
                    flags |= __PRINTF_FLAG_LEFTALIGNED;
665
                    flags |= __PRINTF_FLAG_LEFTALIGNED;
Line 668... Line 668...
668
           
668
           
669
            /* Precision and '*' operator */
669
            /* Precision and '*' operator */
670
            int precision = 0;
670
            int precision = 0;
671
            if (uc == '.') {
671
            if (uc == '.') {
672
                i = nxt;
672
                i = nxt;
673
                uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
673
                uc = chr_decode(fmt, &nxt, UTF8_NO_LIMIT);
674
                if (isdigit(uc)) {
674
                if (isdigit(uc)) {
675
                    while (true) {
675
                    while (true) {
676
                        precision *= 10;
676
                        precision *= 10;
677
                        precision += uc - '0';
677
                        precision += uc - '0';
678
 
678
 
679
                        i = nxt;
679
                        i = nxt;
680
                        uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
680
                        uc = chr_decode(fmt, &nxt, UTF8_NO_LIMIT);
681
                        if (uc == '\0')
681
                        if (uc == '\0')
682
                            break;
682
                            break;
683
                        if (!isdigit(uc))
683
                        if (!isdigit(uc))
684
                            break;
684
                            break;
685
                    }
685
                    }
686
                } else if (uc == '*') {
686
                } else if (uc == '*') {
687
                    /* Get precision value from the argument list */
687
                    /* Get precision value from the argument list */
688
                    i = nxt;
688
                    i = nxt;
689
                    uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
689
                    uc = chr_decode(fmt, &nxt, UTF8_NO_LIMIT);
690
                    precision = (int) va_arg(ap, int);
690
                    precision = (int) va_arg(ap, int);
691
                    if (precision < 0) {
691
                    if (precision < 0) {
692
                        /* Ignore negative precision */
692
                        /* Ignore negative precision */
693
                        precision = 0;
693
                        precision = 0;
694
                    }
694
                    }
Line 703... Line 703...
703
             */
703
             */
704
            case 'h':
704
            case 'h':
705
                /* Char or short */
705
                /* Char or short */
706
                qualifier = PrintfQualifierShort;
706
                qualifier = PrintfQualifierShort;
707
                i = nxt;
707
                i = nxt;
708
                uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
708
                uc = chr_decode(fmt, &nxt, UTF8_NO_LIMIT);
709
                if (uc == 'h') {
709
                if (uc == 'h') {
710
                    i = nxt;
710
                    i = nxt;
711
                    uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
711
                    uc = chr_decode(fmt, &nxt, UTF8_NO_LIMIT);
712
                    qualifier = PrintfQualifierByte;
712
                    qualifier = PrintfQualifierByte;
713
                }
713
                }
714
                break;
714
                break;
715
            case 'l':
715
            case 'l':
716
                /* Long or long long */
716
                /* Long or long long */
717
                qualifier = PrintfQualifierLong;
717
                qualifier = PrintfQualifierLong;
718
                i = nxt;
718
                i = nxt;
719
                uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
719
                uc = chr_decode(fmt, &nxt, UTF8_NO_LIMIT);
720
                if (uc == 'l') {
720
                if (uc == 'l') {
721
                    i = nxt;
721
                    i = nxt;
722
                    uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
722
                    uc = chr_decode(fmt, &nxt, UTF8_NO_LIMIT);
723
                    qualifier = PrintfQualifierLongLong;
723
                    qualifier = PrintfQualifierLongLong;
724
                }
724
                }
725
                break;
725
                break;
726
            default:
726
            default:
727
                /* Default type */
727
                /* Default type */