summaryrefslogtreecommitdiff
path: root/main/snprintf.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/snprintf.c')
-rw-r--r--main/snprintf.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/main/snprintf.c b/main/snprintf.c
index 80a7a9267c..e9cbd19646 100644
--- a/main/snprintf.c
+++ b/main/snprintf.c
@@ -578,6 +578,7 @@ static int format_converter(register buffy * odp, const char *fmt,
* Flag variables
*/
boolean_e is_long;
+ boolean_e is_size_t;
boolean_e alternate_form;
boolean_e print_sign;
boolean_e print_blank;
@@ -670,9 +671,16 @@ static int format_converter(register buffy * odp, const char *fmt,
*/
if (*fmt == 'l') {
is_long = YES;
+ is_size_t = NO;
fmt++;
- } else
+ } else if (*fmt == 'z') {
+ is_size_t = YES;
+ is_long = NO;
+ fmt++;
+ } else {
+ is_size_t = NO;
is_long = NO;
+ }
/*
* Argument extraction and printing.
@@ -689,6 +697,8 @@ static int format_converter(register buffy * odp, const char *fmt,
case 'u':
if (is_long)
i_num = va_arg(ap, u_wide_int);
+ else if (is_size_t)
+ i_num = (wide_int) va_arg(ap, size_t);
else
i_num = (wide_int) va_arg(ap, unsigned int);
/*
@@ -703,6 +713,8 @@ static int format_converter(register buffy * odp, const char *fmt,
if ((*fmt) != 'u') {
if (is_long)
i_num = va_arg(ap, wide_int);
+ else if (is_size_t)
+ i_num = (wide_int) va_arg(ap, size_t);
else
i_num = (wide_int) va_arg(ap, int);
};
@@ -724,6 +736,8 @@ static int format_converter(register buffy * odp, const char *fmt,
case 'o':
if (is_long)
ui_num = va_arg(ap, u_wide_int);
+ else if (is_size_t)
+ ui_num = (u_wide_int) va_arg(ap, size_t);
else
ui_num = (u_wide_int) va_arg(ap, unsigned int);
s = ap_php_conv_p2(ui_num, 3, *fmt,
@@ -740,6 +754,8 @@ static int format_converter(register buffy * odp, const char *fmt,
case 'X':
if (is_long)
ui_num = (u_wide_int) va_arg(ap, u_wide_int);
+ else if (is_size_t)
+ ui_num = (u_wide_int) va_arg(ap, size_t);
else
ui_num = (u_wide_int) va_arg(ap, unsigned int);
s = ap_php_conv_p2(ui_num, 4, *fmt,
@@ -848,12 +864,16 @@ static int format_converter(register buffy * odp, const char *fmt,
* we print "%p" to indicate that we don't handle "%p".
*/
case 'p':
- ui_num = (u_wide_int) va_arg(ap, char *);
-
- if (sizeof(char *) <= sizeof(u_wide_int))
- s = ap_php_conv_p2(ui_num, 4, 'x',
- &num_buf[NUM_BUF_SIZE], &s_len);
- else {
+ if (sizeof(char *) <= sizeof(u_wide_int)) {
+ ui_num = (u_wide_int) va_arg(ap, char *);
+ s = ap_php_conv_p2(ui_num, 4, 'x',
+ &num_buf[NUM_BUF_SIZE], &s_len);
+ if (i_num != 0) {
+ *--s = 'x';
+ *--s = '0';
+ s_len += 2;
+ }
+ } else {
s = "%p";
s_len = 2;
}