Subversion Repositories HelenOS

Rev

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
 
-