| 3819 | } |
| 3820 | |
| 3821 | static __attribute__((__noinline__)) size_t printf_put_num(char *str, |
| 3822 | size_t size, size_t idx, unsigned flags, size_t width, size_t precision, |
| 3823 | unsigned long long x) |
| 3824 | { |
| 3825 | char prefix[2] = {'\0', '\0'}; |
| 3826 | char buf[32]; |
| 3827 | size_t i = 0; |
| 3828 | bool seen = false; |
| 3829 | if (flags & (PRINTF_FLAG_HEX | PRINTF_FLAG_OCTAL)) |
| 3830 | { |
| 3831 | if (flags & PRINTF_FLAG_HASH) |
| 3832 | { |
| 3833 | prefix[0] = '0'; |
| 3834 | if (flags & PRINTF_FLAG_HEX) |
| 3835 | prefix[1] = (flags & PRINTF_FLAG_UPPER? 'X': 'x'); |
| 3836 | } |
| 3837 | const char digs[] = "0123456789abcdef"; |
| 3838 | const char DIGS[] = "0123456789ABCDEF"; |
| 3839 | const char *ds = (flags & PRINTF_FLAG_UPPER? DIGS: digs); |
| 3840 | int shift = (flags & PRINTF_FLAG_HEX? 60: 63), |
| 3841 | dec = (flags & PRINTF_FLAG_HEX? 4: 3), |
| 3842 | mask = (flags & PRINTF_FLAG_HEX? 0xF: 0x7); |
| 3843 | while (shift >= 0) |
| 3844 | { |
| 3845 | char c = ds[(x >> shift) & mask]; |
| 3846 | shift -= dec; |
| 3847 | if (!seen && c == '0') |
| 3848 | continue; |
| 3849 | seen = true; |
| 3850 | buf[i++] = c; |
| 3851 | } |
| 3852 | if (!seen) |
| 3853 | buf[i++] = '0'; |
| 3854 | } |
| 3855 | else |
| 3856 | { |
| 3857 | if (flags & PRINTF_FLAG_NEG) |
| 3858 | prefix[0] = '-'; |
| 3859 | else if (flags & PRINTF_FLAG_PLUS) |
| 3860 | prefix[0] = '+'; |
| 3861 | else if (flags & PRINTF_FLAG_SPACE) |
| 3862 | prefix[0] = ' '; |
| 3863 | unsigned long long r = 10000000000000000000ull; |
| 3864 | while (r != 0) |
| 3865 | { |
| 3866 | char c = '0' + x / r; |
| 3867 | x %= r; |
| 3868 | r /= 10; |
| 3869 | if (!seen && c == '0') |
| 3870 | continue; |
| 3871 | seen = true; |
| 3872 | buf[i++] = c; |
| 3873 | } |
| 3874 | if (!seen) |
| 3875 | buf[i++] = '0'; |
| 3876 | } |
| 3877 | if ((flags & PRINTF_FLAG_ZERO) && !(flags & PRINTF_FLAG_PRECISION)) |
| 3878 | { |
no test coverage detected