From: Vsevolod Stakhov Date: Thu, 2 Oct 2014 23:36:50 +0000 (+0100) Subject: Allow hex encoded output of strings. X-Git-Tag: 0.7.2~38 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6569d234e875867754e38bfc0cd8840b4f556b29;p=thirdparty%2Frspamd.git Allow hex encoded output of strings. --- diff --git a/src/libutil/printf.c b/src/libutil/printf.c index 2c339d0945..98c8969349 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 aee982e418..34df20a76b 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'