diff options
author | Phil Pennock <pdp@exim.org> | 2012-05-26 20:18:31 -0400 |
---|---|---|
committer | Phil Pennock <pdp@exim.org> | 2012-05-26 20:18:31 -0400 |
commit | 91a246f68ff8f8e0f6740def15dc7107b6dcd584 (patch) | |
tree | 1452e03d3357e79b9b1cd5ae106e27cc73945621 /src | |
parent | 1f00591e43de58718045ab86916011cc564e5201 (diff) |
teach sprint_vformat() size_t z modifier (jgh)
Jeremy wrote this, mostly; I just fixed up a comment and pedantically numbered the enum values
Diffstat (limited to 'src')
-rw-r--r-- | src/src/string.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/src/string.c b/src/src/string.c index 08e604594..0e73e2c79 100644 --- a/src/src/string.c +++ b/src/src/string.c @@ -1134,7 +1134,8 @@ return yield; BOOL string_vformat(uschar *buffer, int buflen, const char *format, va_list ap) { -enum { L_NORMAL, L_SHORT, L_LONG, L_LONGLONG, L_LONGDOUBLE }; +/* We assume numbered ascending order, C does not guarantee that */ +enum { L_NORMAL=1, L_SHORT=2, L_LONG=3, L_LONGLONG=4, L_LONGDOUBLE=5, L_SIZE=6 }; BOOL yield = TRUE; int width, precision; @@ -1204,7 +1205,7 @@ while (*fp != 0) } } - /* Skip over 'h', 'L', 'l', and 'll', remembering the item length */ + /* Skip over 'h', 'L', 'l', 'll' and 'z', remembering the item length */ if (*fp == 'h') { fp++; length = L_SHORT; } @@ -1223,6 +1224,8 @@ while (*fp != 0) length = L_LONG; } } + else if (*fp == 'z') + { fp++; length = L_SIZE; } /* Handle each specific format type. */ @@ -1252,6 +1255,7 @@ while (*fp != 0) case L_NORMAL: sprintf(CS p, newformat, va_arg(ap, int)); break; case L_LONG: sprintf(CS p, newformat, va_arg(ap, long int)); break; case L_LONGLONG: sprintf(CS p, newformat, va_arg(ap, LONGLONG_T)); break; + case L_SIZE: sprintf(CS p, newformat, va_arg(ap, size_t)); break; } while (*p) p++; break; |