Rev 1702 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1702 | Rev 1780 | ||
|---|---|---|---|
| Line 86... | Line 86... | ||
| 86 | 86 | ||
| 87 | /** Compute length of given zero terminated string. |
87 | /** Compute length of given zero terminated string. |
| 88 | * @param str Pointer to valid string. |
88 | * @param str Pointer to valid string. |
| 89 | * @return string length without trailing zero. |
89 | * @return string length without trailing zero. |
| 90 | */ |
90 | */ |
| 91 | static __native strlen(const char *str) |
91 | static unative_t strlen(const char *str) |
| 92 | { |
92 | { |
| 93 | __native counter = 0; |
93 | unative_t counter = 0; |
| 94 | 94 | ||
| 95 | while (str[counter] != 0) { |
95 | while (str[counter] != 0) { |
| 96 | counter++; |
96 | counter++; |
| 97 | } |
97 | } |
| 98 | 98 | ||
| Line 144... | Line 144... | ||
| 144 | * @param c character to print |
144 | * @param c character to print |
| 145 | * @param width |
145 | * @param width |
| 146 | * @param flags |
146 | * @param flags |
| 147 | * @return number of printed characters, negative value on fail |
147 | * @return number of printed characters, negative value on fail |
| 148 | */ |
148 | */ |
| 149 | static int print_char(char c, int width, __u64 flags, struct printf_spec *ps) |
149 | static int print_char(char c, int width, uint64_t flags, struct printf_spec *ps) |
| 150 | { |
150 | { |
| 151 | int counter = 0; |
151 | int counter = 0; |
| 152 | 152 | ||
| 153 | if (!(flags & __PRINTF_FLAG_LEFTALIGNED)) { |
153 | if (!(flags & __PRINTF_FLAG_LEFTALIGNED)) { |
| 154 | while (--width > 0) { /* one space is consumed by character itself hence predecrement */ |
154 | while (--width > 0) { /* one space is consumed by character itself hence predecrement */ |
| Line 174... | Line 174... | ||
| 174 | * @param precision |
174 | * @param precision |
| 175 | * @param flags |
175 | * @param flags |
| 176 | * @return number of printed characters or negative value on fail |
176 | * @return number of printed characters or negative value on fail |
| 177 | */ |
177 | */ |
| 178 | 178 | ||
| 179 | static int print_string(char *s, int width, int precision, __u64 flags, struct printf_spec *ps) |
179 | static int print_string(char *s, int width, int precision, uint64_t flags, struct printf_spec *ps) |
| 180 | { |
180 | { |
| 181 | int counter = 0; |
181 | int counter = 0; |
| 182 | size_t size; |
182 | size_t size; |
| 183 | int retval; |
183 | int retval; |
| 184 | 184 | ||
| Line 234... | Line 234... | ||
| 234 | * be in range 2 .. 16). |
234 | * be in range 2 .. 16). |
| 235 | * @param flags output modifiers |
235 | * @param flags output modifiers |
| 236 | * @return number of written characters or EOF |
236 | * @return number of written characters or EOF |
| 237 | * |
237 | * |
| 238 | */ |
238 | */ |
| 239 | static int print_number(__u64 num, int width, int precision, int base , __u64 flags, struct printf_spec *ps) |
239 | static int print_number(uint64_t num, int width, int precision, int base , uint64_t flags, struct printf_spec *ps) |
| 240 | { |
240 | { |
| 241 | char *digits = digits_small; |
241 | char *digits = digits_small; |
| 242 | char d[PRINT_NUMBER_BUFFER_SIZE]; /* this is good enough even for base == 2, prefix and sign */ |
242 | char d[PRINT_NUMBER_BUFFER_SIZE]; /* this is good enough even for base == 2, prefix and sign */ |
| 243 | char *ptr = &d[PRINT_NUMBER_BUFFER_SIZE - 1]; |
243 | char *ptr = &d[PRINT_NUMBER_BUFFER_SIZE - 1]; |
| 244 | int size = 0; /* size of number with all prefixes and signs */ |
244 | int size = 0; /* size of number with all prefixes and signs */ |
| Line 425... | Line 425... | ||
| 425 | * - "hh" Signed or unsigned char.@n |
425 | * - "hh" Signed or unsigned char.@n |
| 426 | * - "h" Signed or usigned short.@n |
426 | * - "h" Signed or usigned short.@n |
| 427 | * - "" Signed or usigned int (default value).@n |
427 | * - "" Signed or usigned int (default value).@n |
| 428 | * - "l" Signed or usigned long int.@n |
428 | * - "l" Signed or usigned long int.@n |
| 429 | * - "ll" Signed or usigned long long int.@n |
429 | * - "ll" Signed or usigned long long int.@n |
| 430 | * - "z" __native (non-standard extension).@n |
430 | * - "z" unative_t (non-standard extension).@n |
| 431 | * |
431 | * |
| 432 | * |
432 | * |
| 433 | * CONVERSION:@n |
433 | * CONVERSION:@n |
| 434 | * - % Print percentile character itself. |
434 | * - % Print percentile character itself. |
| 435 | * |
435 | * |
| Line 464... | Line 464... | ||
| 464 | int counter; /**< counter of printed characters */ |
464 | int counter; /**< counter of printed characters */ |
| 465 | int retval; /**< used to store return values from called functions */ |
465 | int retval; /**< used to store return values from called functions */ |
| 466 | char c; |
466 | char c; |
| 467 | qualifier_t qualifier; /* type of argument */ |
467 | qualifier_t qualifier; /* type of argument */ |
| 468 | int base; /**< base in which will be parameter (numbers only) printed */ |
468 | int base; /**< base in which will be parameter (numbers only) printed */ |
| 469 | __u64 number; /**< argument value */ |
469 | uint64_t number; /**< argument value */ |
| 470 | size_t size; /**< byte size of integer parameter */ |
470 | size_t size; /**< byte size of integer parameter */ |
| 471 | int width, precision; |
471 | int width, precision; |
| 472 | __u64 flags; |
472 | uint64_t flags; |
| 473 | 473 | ||
| 474 | counter = 0; |
474 | counter = 0; |
| 475 | 475 | ||
| 476 | irqpri = interrupts_disable(); |
476 | irqpri = interrupts_disable(); |
| 477 | spinlock_lock(&printflock); |
477 | spinlock_lock(&printflock); |
| Line 560... | Line 560... | ||
| 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': /* __native */ |
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; |
| Line 642... | Line 642... | ||
| 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 = (__u64)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 = (__u64)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 = (__u64)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 = (__u64)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 = (__u64)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 = (__u64)(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(__native); |
670 | size = sizeof(unative_t); |
| 671 | number = (__u64)va_arg(ap, __native); |
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; |
| 681 | 681 | ||
| 682 | if (size == sizeof(__u64)) { |
682 | if (size == sizeof(uint64_t)) { |
| 683 | number = -((__s64)number); |
683 | number = -((int64_t)number); |
| 684 | } else { |
684 | } else { |
| 685 | number = ~number; |
685 | number = ~number; |
| 686 | number &= (~((0xFFFFFFFFFFFFFFFFll) << (size * 8))); |
686 | number &= (~((0xFFFFFFFFFFFFFFFFll) << (size * 8))); |
| 687 | number++; |
687 | number++; |
| 688 | } |
688 | } |
| Line 701... | Line 701... | ||
| 701 | 701 | ||
| 702 | ++i; |
702 | ++i; |
| 703 | } |
703 | } |
| 704 | 704 | ||
| 705 | if (i > j) { |
705 | if (i > j) { |
| 706 | if ((retval = printf_putnchars(&fmt[j], (__native)(i - j), ps)) < 0) { /* error */ |
706 | if ((retval = printf_putnchars(&fmt[j], (unative_t)(i - j), ps)) < 0) { /* error */ |
| 707 | counter = -counter; |
707 | counter = -counter; |
| 708 | goto out; |
708 | goto out; |
| 709 | 709 | ||
| 710 | } |
710 | } |
| 711 | counter += retval; |
711 | counter += retval; |