diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libutil/printf.c | 50 | ||||
-rw-r--r-- | src/libutil/printf.h | 1 |
2 files changed, 37 insertions, 14 deletions
diff --git a/src/libutil/printf.c b/src/libutil/printf.c index 2c339d094..98c896934 100644 --- a/src/libutil/printf.c +++ b/src/libutil/printf.c @@ -29,6 +29,8 @@ * From FreeBSD libutil code */ static const int maxscale = 6; +static const gchar _hex[] = "0123456789abcdef"; +static const gchar _HEX[] = "0123456789ABCDEF"; static gchar * rspamd_humanize_number (gchar *buf, gchar *last, gint64 num, gboolean bytes) @@ -95,8 +97,6 @@ rspamd_sprintf_num (gchar *buf, gchar *last, guint64 ui64, gchar zero, gchar *p, temp[sizeof ("18446744073709551615")]; size_t len; guint32 ui32; - static gchar hex[] = "0123456789abcdef"; - static gchar HEX[] = "0123456789ABCDEF"; p = temp + sizeof(temp); @@ -136,7 +136,7 @@ rspamd_sprintf_num (gchar *buf, gchar *last, guint64 ui64, gchar zero, do { /* the "(guint32)" cast disables the BCC's warning */ - *--p = hex[(guint32) (ui64 & 0xf)]; + *--p = _hex[(guint32) (ui64 & 0xf)]; } while (ui64 >>= 4); @@ -145,7 +145,7 @@ rspamd_sprintf_num (gchar *buf, gchar *last, guint64 ui64, gchar zero, do { /* the "(guint32)" cast disables the BCC's warning */ - *--p = HEX[(guint32) (ui64 & 0xf)]; + *--p = _HEX[(guint32) (ui64 & 0xf)]; } while (ui64 >>= 4); } @@ -299,15 +299,20 @@ rspamd_printf_gstring (GString *s, const gchar *fmt, ...) return r; } -#define RSPAMD_PRINTF_APPEND(buf, len) \ - do { \ - wr = func ((buf), (len), apd); \ - if (wr < (__typeof (wr))(len)) { \ - goto oob; \ - } \ - written += wr; \ - fmt++; \ - buf_start = fmt; \ +#define RSPAMD_PRINTF_APPEND(buf, len) \ + do { \ + RSPAMD_PRINTF_APPEND_BUF(buf, len); \ + fmt++; \ + buf_start = fmt; \ + } while (0) + +#define RSPAMD_PRINTF_APPEND_BUF(buf, len) \ + do { \ + wr = func ((buf), (len), apd); \ + if (wr < (__typeof (wr))(len)) { \ + goto oob; \ + } \ + written += wr; \ } while (0) glong @@ -448,7 +453,24 @@ rspamd_vprintf_common (rspamd_printf_append_func func, /* NULL terminated string */ slen = strlen (p); } - RSPAMD_PRINTF_APPEND (p, slen); + + if (G_LIKELY(hex == 0)) { + RSPAMD_PRINTF_APPEND (p, slen); + } + else { + gchar hexbuf[2]; + while (slen) { + hexbuf[0] = hex == 2 ? _HEX[*p & 0xf] : _hex[*p & 0xf]; + hexbuf[1] = hex == 2 ? _HEX[(*p >> 8) & 0xf] : + _hex[(*p >> 8) & 0xf]; + RSPAMD_PRINTF_APPEND_BUF (hexbuf, 2); + p ++; + slen --; + } + fmt ++; + buf_start = fmt; + + } continue; diff --git a/src/libutil/printf.h b/src/libutil/printf.h index aee982e41..34df20a76 100644 --- a/src/libutil/printf.h +++ b/src/libutil/printf.h @@ -47,6 +47,7 @@ * %V f_str_t * * %v GString * * %s null-terminated string + * %xs hex encoded string * %*s length and string * %Z '\0' * %N '\n' |