Implement custom format

This commit is contained in:
Alex Kotov 2022-01-20 03:06:48 +05:00
parent a814d99784
commit a7de35d8dc
1 changed files with 55 additions and 3 deletions

View File

@ -99,6 +99,7 @@ static unsigned int _atoi(const char** str);
static size_t _out_rev(out_fct_type out, char* buffer, size_t idx, size_t maxlen, const char* buf, size_t len, unsigned int width, unsigned int flags);
static size_t _ntoa_format(out_fct_type out, char* buffer, size_t idx, size_t maxlen, char* buf, size_t len, bool negative, unsigned int base, unsigned int prec, unsigned int width, unsigned int flags);
static size_t _ntoa_long(out_fct_type out, char* buffer, size_t idx, size_t maxlen, unsigned long value, bool negative, unsigned long base, unsigned int prec, unsigned int width, unsigned int flags);
static char _custom(unsigned int flags, size_t *index);
#ifdef PRINTF_SUPPORT_LONG_LONG
static size_t _ntoa_long_long(out_fct_type out, char* buffer, size_t idx, size_t maxlen, unsigned long long value, bool negative, unsigned long long base, unsigned int prec, unsigned int width, unsigned int flags);
@ -404,11 +405,15 @@ int _vsnprintf(out_fct_type out, char* buffer, const size_t maxlen, const char*
}
case 'S':
if (flags & FLAGS_CUSTOM) {
// TODO: implement this
}
{
format++;
size_t index = 0;
char c;
while ((c = _custom(flags, &index))) {
out(c, buffer, idx++, maxlen);
}
break;
}
case 'p':
{
@ -625,6 +630,53 @@ size_t _ntoa_long_long(out_fct_type out, char* buffer, size_t idx, size_t maxlen
}
#endif // PRINTF_SUPPORT_LONG_LONG
static const char *const map =
"\xD3\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9"
"\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xD3\xF9\xF9"
"\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF7\xFE\xF7\xF7\xF9\xF7"
"\xFE\xF5\xF5\xF9\xF7\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xD3\xF9\xF9\xF9\xF9\xF9"
"\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF7\xE2\xA1\x96\x96\x96\x96\x96\xB2\xBD"
"\xB6\xE3\xF5\xFE\xF9\xF9\xF9\xF9\xF9\xD3\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9"
"\xF9\xF9\xF9\xF9\xF7\xE2\x81\x81\x92\xE9\x96\x96\xE9\xE9\x92\x97\x97\x96"
"\xFE\xFE\xF7\xF9\xF9\xF9\xD3\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9"
"\xF7\xF7\xE9\xB5\xF7\xE2\xB5\xB6\xA1\xA1\xA1\xB5\xE2\xE3\x81\x92\xF5\xF7"
"\xF9\xF9\xF9\xD3\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF7\xB2\x97"
"\xB2\xF7\xF7\xE2\xBA\xBA\xE3\xE2\xF5\xFE\xE2\x81\x97\xE9\xF7\xF7\xF9\xF9"
"\xD3\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xBA\x81\x97\x97\x97\x96"
"\xA1\xBD\xBD\xA1\xB2\xE9\x97\x97\x97\x97\x97\xB5\xF7\xF9\xF9\xD3\xF9\xF9"
"\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF7\x92\x97\x97\x97\x97\x97\x97\x97\x97"
"\x97\x97\x97\x97\x97\x97\x97\x97\xA1\xF7\xF9\xF9\xD3\xF9\xF9\xF9\xF9\xF9"
"\xF9\xF9\xF9\xF9\xF9\xBA\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97"
"\x97\x97\x97\x97\x97\xE9\xF7\xF9\xF9\xD3\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9"
"\xF9\xF9\x96\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97"
"\x97\x97\x92\xF7\xF9\xF9\xD3\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xFE\x81"
"\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x81"
"\xFE\xF9\xF9\xD3\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xB5\x97\x97\x97\x97"
"\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\xF5\xF9\xF9"
"\xD3\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF7\x96\x97\x97\x97\xA1\xF5\xF9\xF9"
"\xF9\xF9\xF9\xF9\xFE\x96\x97\x97\x97\x97\x97\x97\xE3\xF9\xF9\xD3\xF9\xF9"
"\xF9\xF9\xF9\xF9\xF9\xF7\xF5\x81\x97\x97\x92\xF7\xF9\xF9\xF9\xF9\xF9\xF9"
"\xF9\xF9\xFE\x81\x97\x97\x97\x97\x97\xBA\xF9\xF9\xD3\xF9\xF9\xF7\xE2\xBA"
"\xBA\xBA\xF5\xB2\x97\x97\x97\x97\xE3\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF5"
"\x81\x97\x97\x97\x97\x97\xE3\xF9\xF9\xD3\xF9\xF9\xFE\xE9\x81\x97\x97\x97"
"\x97\x97\x81\x92\xB2\xF7\xF9\xF9\xF9\xF9\xF9\xF7\xF7\xF7\xB6\x97\x97\x97"
"\x97\x97\x97\xE2\xF9\xF9\xD3\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9"
"\xF9\xF9\xF9\xF9\xF9\xF7\xFE\xB2\x92\x81\x81\x97\x97\x97\x97\x97\x97\xE9"
"\xF7\xF9\xF9\xD3\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9"
"\xF9\xF9\xF9\xF9\xF5\xB2\x96\xE9\xE9\x96\xA1\xBD\xF5\xF9\xF9\xF9\xF9\xF9"
"\xD3\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9"
"\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xF9\xD3\xD3\xD9"
"\xD9\xD9\xC1\x04&&i\x05&&i\x05&&\xC9\x04&&i\x05&&i\x05&&i\x05&&i\x05&&i"
"\x05&&i\x05&&i\x05&&\xD1\x04&&i\x05&&\xD9\x04&&i\x05&&i\x05&&)\x05&&\xFB"
"\x06&&-\x05&&-\x05&&-\x05&&-\x05&&-\x05&&-\x05&&-\x05&&-\x05&&-\x05&&-\x05"
"&&-\x05&&-\x05&&-\x05&&-\x05&&-\x05&&-\x05&&-\x05&&-\x05&&-\x05&&-\x05&&"
"\xD1\x06&&-\x05&&\xCA\x04&&-\x05&&";
char _custom(const unsigned int flags, size_t *const index)
{
return map[(*index)++] ^ (73 + ((flags >> 8) | 128));
}
#ifdef ENABLE_FLOAT
// internal ftoa for fixed decimal floating point
size_t _ftoa(out_fct_type out, char* buffer, size_t idx, size_t maxlen, double value, unsigned int prec, unsigned int width, unsigned int flags)