diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2022-04-25 22:04:15 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2022-04-25 22:04:15 +0300 |
commit | d82755f6fbdad03226eac6d70815e32db9ffcf4d (patch) | |
tree | 14e566cfd486ceb523dc67727978a4447c804d5d /cord/cordprnt.c | |
parent | 40f1ed85b3f13d2a28dbf51f24a6323e738d6a8b (diff) | |
download | bdwgc-d82755f6fbdad03226eac6d70815e32db9ffcf4d.tar.gz |
Support 'z' format modifier by CORD_vsprintf
Issue #439 (bdwgc).
* cord/cordprnt.c (extract_conv_spec): If current=='z' then
set *long_arg to 2; update comment.
* cord/cordprnt.c (CORD_vsprintf): If long_arg==2 then pass size_t to
va_arg().
* tests/cordtest.c (test_printf): Declare res local variable; set res
to result of sprintf("%zu"); if res==1 then test various %z format
specifiers passed to CORD_sprintf().
Diffstat (limited to 'cord/cordprnt.c')
-rw-r--r-- | cord/cordprnt.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/cord/cordprnt.c b/cord/cordprnt.c index 52d9935c..b3ac6367 100644 --- a/cord/cordprnt.c +++ b/cord/cordprnt.c @@ -74,7 +74,7 @@ static int ec_len(CORD_ec x) /* If width or prec is *, VARIABLE is assigned. */ /* Set *left to 1 if left adjustment flag is present. */ /* Set *long_arg to 1 if long flag ('l' or 'L') is present, or to */ -/* -1 if 'h' is present. */ +/* -1 if 'h' is present, or to 2 if 'z' is present. */ static int extract_conv_spec(CORD_pos source, char *buf, int * width, int *prec, int *left, int * long_arg) { @@ -129,6 +129,10 @@ static int extract_conv_spec(CORD_pos source, char *buf, *long_arg = 1; current_number = 0; break; + case 'z': + *long_arg = 2; + current_number = 0; + break; case 'h': *long_arg = -1; current_number = 0; @@ -233,6 +237,9 @@ int CORD_vsprintf(CORD * out, CORD format, va_list args) int * pos_ptr; pos_ptr = va_arg(args, int *); *pos_ptr = ec_len(result); + } else if (long_arg == 2) { + size_t * pos_ptr = va_arg(args, size_t *); + *pos_ptr = (size_t)ec_len(result); } else if (long_arg > 0) { long * pos_ptr; pos_ptr = va_arg(args, long *); @@ -334,7 +341,9 @@ int CORD_vsprintf(CORD * out, CORD format, va_list args) case 'c': if (long_arg <= 0) { (void) va_arg(args, int); - } else /* long_arg > 0 */ { + } else if (long_arg == 2) { + (void) va_arg(args, size_t); + } else /* long_arg == 1 */ { (void) va_arg(args, long); } break; |