summaryrefslogtreecommitdiff
path: root/cord/cordprnt.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2022-04-25 22:04:15 +0300
committerIvan Maidanski <ivmai@mail.ru>2022-04-25 22:04:15 +0300
commitd82755f6fbdad03226eac6d70815e32db9ffcf4d (patch)
tree14e566cfd486ceb523dc67727978a4447c804d5d /cord/cordprnt.c
parent40f1ed85b3f13d2a28dbf51f24a6323e738d6a8b (diff)
downloadbdwgc-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.c13
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;