From db511536834cafbcdfdb73e6a73b8ee6800270a8 Mon Sep 17 00:00:00 2001 From: Philipp Schafft Date: Wed, 12 Sep 2018 09:14:27 +0000 Subject: [PATCH] Feature: Support alternative quoting with %#H --- log/log.c | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/log/log.c b/log/log.c index 95ef1c9..ba3a5cd 100644 --- a/log/log.c +++ b/log/log.c @@ -445,6 +445,7 @@ static void __vsnprintf(char *str, size_t size, const char *format, va_list ap) int block_size = 0; int block_len = 0; int block_space = 0; + int block_alt = 0; const char * arg; char buf[80]; @@ -457,6 +458,7 @@ static void __vsnprintf(char *str, size_t size, const char *format, va_list ap) block_size = 0; block_len = 0; block_space = 0; + block_alt = 0; } else { @@ -485,6 +487,9 @@ static void __vsnprintf(char *str, size_t size, const char *format, va_list ap) case ' ': block_space = 1; break; + case '#': + block_alt = 1; + break; case '1': case '2': case '3': @@ -544,15 +549,36 @@ static void __vsnprintf(char *str, size_t size, const char *format, va_list ap) // TODO. if (!arg) arg = va_arg(ap, const char *); - if (!arg) + if (*format != 'H') { + block_alt = 0; + } + if (!arg && !block_alt) arg = "(null)"; - if (!block_len) - block_len = strlen(arg); + if (!block_len) { + if (arg) { + block_len = strlen(arg) + ((block_alt) ? 2 : 0); + } else { + block_len = 1; + } + } // the if() is the outer structure so the inner for() // is branch optimized. - if (*format == 'H') + if (*format == 'H' && !arg) { + if (size && block_len) { + *(str++) = '-'; + size--; + block_len--; + } + } + else if (*format == 'H') + { + if (block_alt && size && block_len) { + *(str++) = '"'; + size--; + block_len--; + } for (; *arg && block_len && size; arg++, size--, block_len--) { if ((*arg <= '"' || *arg == '`' || *arg == '\\') && !(block_space && *arg == ' ')) { @@ -572,6 +598,11 @@ static void __vsnprintf(char *str, size_t size, const char *format, va_list ap) *(str++) = *arg; } } + if (block_alt && size && block_len) { + *(str++) = '"'; + size--; + block_len--; + } } else {