Subversion Repositories HelenOS

Rev

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

Rev 4185 Rev 4199
Line 255... Line 255...
255
   
255
   
256
    /* Print leading spaces */
256
    /* Print leading spaces */
257
    size_t size = strlen_utf8(str);
257
    size_t size = strlen_utf8(str);
258
    if (precision == 0)
258
    if (precision == 0)
259
        precision = size;
259
        precision = size;
260
   
260
 
261
    count_t counter = 0;
261
    count_t counter = 0;
262
    width -= precision;
262
    width -= precision;
263
    if (!(flags & __PRINTF_FLAG_LEFTALIGNED)) {
263
    if (!(flags & __PRINTF_FLAG_LEFTALIGNED)) {
264
        while (width-- > 0) {
264
        while (width-- > 0) {
265
            if (printf_putchar(' ', ps) == 1)
265
            if (printf_putchar(' ', ps) == 1)
266
                counter++;
266
                counter++;
267
        }
267
        }
268
    }
268
    }
269
   
269
 
270
    int retval;
270
    int retval;
271
    size_t bytes = utf8_count_bytes(str, min(size, precision));
271
    size_t bytes = utf8_count_bytes(str, min(size, precision));
272
    if ((retval = printf_putnchars_utf8(str, bytes, ps)) < 0)
272
    if ((retval = printf_putnchars_utf8(str, bytes, ps)) < 0)
273
        return -counter;
273
        return -counter;
274
   
274
   
Line 276... Line 276...
276
   
276
   
277
    while (width-- > 0) {
277
    while (width-- > 0) {
278
        if (printf_putchar(' ', ps) == 1)
278
        if (printf_putchar(' ', ps) == 1)
279
            counter++;
279
            counter++;
280
    }
280
    }
281
   
281
 
282
    return ((int) counter);
282
    return ((int) counter);
283
}
283
}
284
 
284
 
285
/** Print UTF-32 string.
285
/** Print UTF-32 string.
286
 *
286
 *
Line 583... Line 583...
583
 *
583
 *
584
 */
584
 */
585
int printf_core(const char *fmt, printf_spec_t *ps, va_list ap)
585
int printf_core(const char *fmt, printf_spec_t *ps, va_list ap)
586
{
586
{
587
    index_t i = 0;  /* Index of the currently processed character from fmt */
587
    index_t i = 0;  /* Index of the currently processed character from fmt */
-
 
588
    index_t nxt = 0;
588
    index_t j = 0;  /* Index to the first not printed nonformating character */
589
    index_t j = 0;  /* Index to the first not printed nonformating character */
589
   
590
   
590
    wchar_t uc;           /* Current UTF-32 character decoded from fmt */
591
    wchar_t uc;           /* Current UTF-32 character decoded from fmt */
591
    count_t counter = 0;  /* Number of UTF-8 characters printed */
592
    count_t counter = 0;  /* Number of UTF-8 characters printed */
592
    int retval;           /* Return values from nested functions */
593
    int retval;           /* Return values from nested functions */
593
   
594
   
-
 
595
    while (true) {
-
 
596
        i = nxt;
594
    while ((uc = utf8_decode(fmt, &i, UTF8_NO_LIMIT)) != 0) {
597
        uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
-
 
598
 
-
 
599
        if (uc == '\0') break;
-
 
600
 
595
        /* Control character */
601
        /* Control character */
596
        if (uc == '%') {
602
        if (uc == '%') {
597
            /* Print common characters if any processed */
603
            /* Print common characters if any processed */
598
            if (i > j) {
604
            if (i > j) {
599
                if ((retval = printf_putnchars_utf8(&fmt[j], i - j, ps)) < 0) {
605
                if ((retval = printf_putnchars_utf8(&fmt[j], i - j, ps)) < 0) {
Line 609... Line 615...
609
            /* Parse modifiers */
615
            /* Parse modifiers */
610
            uint32_t flags = 0;
616
            uint32_t flags = 0;
611
            bool end = false;
617
            bool end = false;
612
           
618
           
613
            do {
619
            do {
614
                i++;
620
                i = nxt;
615
                uc = utf8_decode(fmt, &i, UTF8_NO_LIMIT);
621
                uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
616
                switch (uc) {
622
                switch (uc) {
617
                case '#':
623
                case '#':
618
                    flags |= __PRINTF_FLAG_PREFIX;
624
                    flags |= __PRINTF_FLAG_PREFIX;
619
                    break;
625
                    break;
620
                case '-':
626
                case '-':
Line 635... Line 641...
635
            } while (!end);
641
            } while (!end);
636
           
642
           
637
            /* Width & '*' operator */
643
            /* Width & '*' operator */
638
            int width = 0;
644
            int width = 0;
639
            if (isdigit(uc)) {
645
            if (isdigit(uc)) {
640
                while ((uc = utf8_decode(fmt, &i, UTF8_NO_LIMIT)) != 0) {
-
 
641
                    if (!isdigit(uc))
646
                while (true) {
642
                        break;
-
 
643
                   
-
 
644
                    width *= 10;
647
                    width *= 10;
645
                    width += uc - '0';
648
                    width += uc - '0';
-
 
649
 
646
                    i++;
650
                    i = nxt;
-
 
651
                    uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
-
 
652
                    if (uc == '\0')
-
 
653
                        break;
-
 
654
                    if (!isdigit(uc))
-
 
655
                        break;
647
                }
656
                }
648
            } else if (uc == '*') {
657
            } else if (uc == '*') {
649
                /* Get width value from argument list */
658
                /* Get width value from argument list */
650
                i++;
659
                i = nxt;
651
                uc = utf8_decode(fmt, &i, UTF8_NO_LIMIT);
660
                uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
652
                width = (int) va_arg(ap, int);
661
                width = (int) va_arg(ap, int);
653
                if (width < 0) {
662
                if (width < 0) {
654
                    /* Negative width sets '-' flag */
663
                    /* Negative width sets '-' flag */
655
                    width *= -1;
664
                    width *= -1;
656
                    flags |= __PRINTF_FLAG_LEFTALIGNED;
665
                    flags |= __PRINTF_FLAG_LEFTALIGNED;
Line 658... Line 667...
658
            }
667
            }
659
           
668
           
660
            /* Precision and '*' operator */
669
            /* Precision and '*' operator */
661
            int precision = 0;
670
            int precision = 0;
662
            if (uc == '.') {
671
            if (uc == '.') {
663
                i++;
672
                i = nxt;
664
                uc = utf8_decode(fmt, &i, UTF8_NO_LIMIT);
673
                uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
665
                if (isdigit(uc)) {
674
                if (isdigit(uc)) {
666
                    while ((uc = utf8_decode(fmt, &i, UTF8_NO_LIMIT)) != 0) {
-
 
667
                        if (!isdigit(uc))
675
                    while (true) {
668
                            break;
-
 
669
                       
-
 
670
                        precision *= 10;
676
                        precision *= 10;
671
                        precision += uc - '0';
677
                        precision += uc - '0';
-
 
678
 
672
                        i++;
679
                        i = nxt;
-
 
680
                        uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
-
 
681
                        if (uc == '\0')
-
 
682
                            break;
-
 
683
                        if (!isdigit(uc))
-
 
684
                            break;
673
                    }
685
                    }
674
                } else if (fmt[i] == '*') {
686
                } else if (uc == '*') {
675
                    /* Get precision value from the argument list */
687
                    /* Get precision value from the argument list */
676
                    i++;
688
                    i = nxt;
677
                    uc = utf8_decode(fmt, &i, UTF8_NO_LIMIT);
689
                    uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
678
                    precision = (int) va_arg(ap, int);
690
                    precision = (int) va_arg(ap, int);
679
                    if (precision < 0) {
691
                    if (precision < 0) {
680
                        /* Ignore negative precision */
692
                        /* Ignore negative precision */
681
                        precision = 0;
693
                        precision = 0;
682
                    }
694
                    }
Line 690... Line 702...
690
             *        t ptrdiff_t - ISO C 99
702
             *        t ptrdiff_t - ISO C 99
691
             */
703
             */
692
            case 'h':
704
            case 'h':
693
                /* Char or short */
705
                /* Char or short */
694
                qualifier = PrintfQualifierShort;
706
                qualifier = PrintfQualifierShort;
695
                i++;
707
                i = nxt;
696
                uc = utf8_decode(fmt, &i, UTF8_NO_LIMIT);
708
                uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
697
                if (uc == 'h') {
709
                if (uc == 'h') {
698
                    i++;
710
                    i = nxt;
699
                    uc = utf8_decode(fmt, &i, UTF8_NO_LIMIT);
711
                    uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
700
                    qualifier = PrintfQualifierByte;
712
                    qualifier = PrintfQualifierByte;
701
                }
713
                }
702
                break;
714
                break;
703
            case 'l':
715
            case 'l':
704
                /* Long or long long */
716
                /* Long or long long */
705
                qualifier = PrintfQualifierLong;
717
                qualifier = PrintfQualifierLong;
706
                i++;
718
                i = nxt;
707
                uc = utf8_decode(fmt, &i, UTF8_NO_LIMIT);
719
                uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
708
                if (uc == 'l') {
720
                if (uc == 'l') {
709
                    i++;
721
                    i = nxt;
710
                    uc = utf8_decode(fmt, &i, UTF8_NO_LIMIT);
722
                    uc = utf8_decode(fmt, &nxt, UTF8_NO_LIMIT);
711
                    qualifier = PrintfQualifierLongLong;
723
                    qualifier = PrintfQualifierLongLong;
712
                }
724
                }
713
                break;
725
                break;
714
            default:
726
            default:
715
                /* Default type */
727
                /* Default type */
Line 732... Line 744...
732
                    counter = -counter;
744
                    counter = -counter;
733
                    goto out;
745
                    goto out;
734
                }
746
                }
735
               
747
               
736
                counter += retval;
748
                counter += retval;
737
                j = i + 1;
749
                j = nxt;
738
                goto next_char;
750
                goto next_char;
739
            case 'c':
751
            case 'c':
740
                if (qualifier == PrintfQualifierLong)
752
                if (qualifier == PrintfQualifierLong)
741
                    retval = print_wchar(va_arg(ap, wchar_t), width, flags, ps);
753
                    retval = print_wchar(va_arg(ap, wchar_t), width, flags, ps);
742
                else
754
                else
Line 746... Line 758...
746
                    counter = -counter;
758
                    counter = -counter;
747
                    goto out;
759
                    goto out;
748
                };
760
                };
749
               
761
               
750
                counter += retval;
762
                counter += retval;
751
                j = i + 1;
763
                j = nxt;
752
                goto next_char;
764
                goto next_char;
753
           
765
           
754
            /*
766
            /*
755
             * Integer values
767
             * Integer values
756
             */
768
             */
Line 850... Line 862...
850
                counter = -counter;
862
                counter = -counter;
851
                goto out;
863
                goto out;
852
            }
864
            }
853
           
865
           
854
            counter += retval;
866
            counter += retval;
855
            j = i + 1;
867
            j = nxt;
856
        }
868
        }
857
next_char:
869
next_char:
858
       
870
        ;
859
        i++;
-
 
860
    }
871
    }
861
   
872
   
862
    if (i > j) {
873
    if (i > j) {
863
        if ((retval = printf_putnchars_utf8(&fmt[j], i - j, ps)) < 0) {
874
        if ((retval = printf_putnchars_utf8(&fmt[j], i - j, ps)) < 0) {
864
            /* Error */
875
            /* Error */