MCPcopy Create free account
hub / github.com/GJDuck/e9patch / printf_put_num

Function printf_put_num

examples/stdlib.c:3821–3907  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3819}
3820
3821static __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 {

Callers 1

vsnprintfFunction · 0.70

Calls 1

printf_put_charFunction · 0.70

Tested by

no test coverage detected