mirror of
https://github.com/php/php-src.git
synced 2026-04-26 01:18:19 +02:00
Add length modifier L
This commit is contained in:
+38
-2
@@ -670,6 +670,10 @@ static int format_converter(register buffy * odp, const char *fmt,
|
||||
* Modifier check
|
||||
*/
|
||||
switch (*fmt) {
|
||||
case 'L':
|
||||
fmt++;
|
||||
modifier = LM_LONG_DOUBLE;
|
||||
break;
|
||||
case 'l':
|
||||
fmt++;
|
||||
#if SIZEOF_LONG_LONG
|
||||
@@ -681,9 +685,11 @@ static int format_converter(register buffy * odp, const char *fmt,
|
||||
modifier = LM_LONG;
|
||||
break;
|
||||
case 'z':
|
||||
fmt++;
|
||||
modifier = LM_SIZE_T;
|
||||
break;
|
||||
case 'j':
|
||||
fmt++;
|
||||
#if SIZEOF_INTMAX_T
|
||||
modifier = LM_INTMAX_T;
|
||||
#else
|
||||
@@ -691,6 +697,7 @@ static int format_converter(register buffy * odp, const char *fmt,
|
||||
#endif
|
||||
break;
|
||||
case 't':
|
||||
fmt++;
|
||||
#if SIZEOF_PTRDIFF_T
|
||||
modifier = LM_PTRDIFF_T;
|
||||
#else
|
||||
@@ -725,6 +732,8 @@ static int format_converter(register buffy * odp, const char *fmt,
|
||||
default:
|
||||
i_num = (wide_int) va_arg(ap, unsigned int);
|
||||
break;
|
||||
case LM_LONG_DOUBLE:
|
||||
goto fmt_error;
|
||||
case LM_LONG:
|
||||
i_num = (wide_int) va_arg(ap, unsigned long int);
|
||||
break;
|
||||
@@ -761,6 +770,8 @@ static int format_converter(register buffy * odp, const char *fmt,
|
||||
default:
|
||||
i_num = (wide_int) va_arg(ap, int);
|
||||
break;
|
||||
case LM_LONG_DOUBLE:
|
||||
goto fmt_error;
|
||||
case LM_LONG:
|
||||
i_num = (wide_int) va_arg(ap, long int);
|
||||
break;
|
||||
@@ -808,6 +819,8 @@ static int format_converter(register buffy * odp, const char *fmt,
|
||||
default:
|
||||
ui_num = (u_wide_int) va_arg(ap, unsigned int);
|
||||
break;
|
||||
case LM_LONG_DOUBLE:
|
||||
goto fmt_error;
|
||||
case LM_LONG:
|
||||
ui_num = (u_wide_int) va_arg(ap, unsigned long int);
|
||||
break;
|
||||
@@ -846,6 +859,8 @@ static int format_converter(register buffy * odp, const char *fmt,
|
||||
default:
|
||||
ui_num = (u_wide_int) va_arg(ap, unsigned int);
|
||||
break;
|
||||
case LM_LONG_DOUBLE:
|
||||
goto fmt_error;
|
||||
case LM_LONG:
|
||||
ui_num = (u_wide_int) va_arg(ap, unsigned long int);
|
||||
break;
|
||||
@@ -896,7 +911,16 @@ static int format_converter(register buffy * odp, const char *fmt,
|
||||
case 'f':
|
||||
case 'e':
|
||||
case 'E':
|
||||
fp_num = va_arg(ap, double);
|
||||
switch(modifier) {
|
||||
case LM_LONG_DOUBLE:
|
||||
fp_num = (double) va_arg(ap, long double);
|
||||
break;
|
||||
case LM_STD:
|
||||
fp_num = va_arg(ap, double);
|
||||
break;
|
||||
default:
|
||||
goto fmt_error;
|
||||
}
|
||||
|
||||
if (zend_isnan(fp_num)) {
|
||||
s = "nan";
|
||||
@@ -920,6 +944,16 @@ static int format_converter(register buffy * odp, const char *fmt,
|
||||
|
||||
case 'g':
|
||||
case 'G':
|
||||
switch(modifier) {
|
||||
case LM_LONG_DOUBLE:
|
||||
fp_num = (double) va_arg(ap, long double);
|
||||
break;
|
||||
case LM_STD:
|
||||
fp_num = va_arg(ap, double);
|
||||
break;
|
||||
default:
|
||||
goto fmt_error;
|
||||
}
|
||||
if (adjust_precision == NO)
|
||||
precision = FLOAT_DIGITS;
|
||||
else if (precision == 0)
|
||||
@@ -927,7 +961,7 @@ static int format_converter(register buffy * odp, const char *fmt,
|
||||
/*
|
||||
* * We use &num_buf[ 1 ], so that we have room for the sign
|
||||
*/
|
||||
s = ap_php_gcvt(va_arg(ap, double), precision, &num_buf[1],
|
||||
s = ap_php_gcvt(fp_num, precision, &num_buf[1],
|
||||
alternate_form);
|
||||
if (*s == '-')
|
||||
prefix_char = *s++;
|
||||
@@ -999,6 +1033,8 @@ static int format_converter(register buffy * odp, const char *fmt,
|
||||
continue;
|
||||
|
||||
|
||||
fmt_error:
|
||||
php_error(E_ERROR, "Illegal length modifier specified '%c' in s[np]printf call", *fmt);
|
||||
/*
|
||||
* The default case is for unrecognized %'s.
|
||||
* We print %<char> to help the user identify what
|
||||
|
||||
+2
-1
@@ -95,7 +95,8 @@ typedef enum {
|
||||
LM_LONG_LONG,
|
||||
#endif
|
||||
LM_SIZE_T,
|
||||
LM_LONG
|
||||
LM_LONG,
|
||||
LM_LONG_DOUBLE
|
||||
} length_modifier_e;
|
||||
|
||||
extern char * ap_php_cvt(double arg, int ndigits, int *decpt, int *sign, int eflag, char *buf);
|
||||
|
||||
+38
-2
@@ -285,6 +285,10 @@ static void xbuf_format_converter(smart_str *xbuf, const char *fmt, va_list ap)
|
||||
* Modifier check
|
||||
*/
|
||||
switch (*fmt) {
|
||||
case 'L':
|
||||
fmt++;
|
||||
modifier = LM_LONG_DOUBLE;
|
||||
break;
|
||||
case 'l':
|
||||
fmt++;
|
||||
#if SIZEOF_LONG_LONG
|
||||
@@ -296,9 +300,11 @@ static void xbuf_format_converter(smart_str *xbuf, const char *fmt, va_list ap)
|
||||
modifier = LM_LONG;
|
||||
break;
|
||||
case 'z':
|
||||
fmt++;
|
||||
modifier = LM_SIZE_T;
|
||||
break;
|
||||
case 'j':
|
||||
fmt++;
|
||||
#if SIZEOF_INTMAX_T
|
||||
modifier = LM_INTMAX_T;
|
||||
#else
|
||||
@@ -306,6 +312,7 @@ static void xbuf_format_converter(smart_str *xbuf, const char *fmt, va_list ap)
|
||||
#endif
|
||||
break;
|
||||
case 't':
|
||||
fmt++;
|
||||
#if SIZEOF_PTRDIFF_T
|
||||
modifier = LM_PTRDIFF_T;
|
||||
#else
|
||||
@@ -340,6 +347,8 @@ static void xbuf_format_converter(smart_str *xbuf, const char *fmt, va_list ap)
|
||||
default:
|
||||
i_num = (wide_int) va_arg(ap, unsigned int);
|
||||
break;
|
||||
case LM_LONG_DOUBLE:
|
||||
goto fmt_error;
|
||||
case LM_LONG:
|
||||
i_num = (wide_int) va_arg(ap, unsigned long int);
|
||||
break;
|
||||
@@ -376,6 +385,8 @@ static void xbuf_format_converter(smart_str *xbuf, const char *fmt, va_list ap)
|
||||
default:
|
||||
i_num = (wide_int) va_arg(ap, int);
|
||||
break;
|
||||
case LM_LONG_DOUBLE:
|
||||
goto fmt_error;
|
||||
case LM_LONG:
|
||||
i_num = (wide_int) va_arg(ap, long int);
|
||||
break;
|
||||
@@ -423,6 +434,8 @@ static void xbuf_format_converter(smart_str *xbuf, const char *fmt, va_list ap)
|
||||
default:
|
||||
ui_num = (u_wide_int) va_arg(ap, unsigned int);
|
||||
break;
|
||||
case LM_LONG_DOUBLE:
|
||||
goto fmt_error;
|
||||
case LM_LONG:
|
||||
ui_num = (u_wide_int) va_arg(ap, unsigned long int);
|
||||
break;
|
||||
@@ -461,6 +474,8 @@ static void xbuf_format_converter(smart_str *xbuf, const char *fmt, va_list ap)
|
||||
default:
|
||||
ui_num = (u_wide_int) va_arg(ap, unsigned int);
|
||||
break;
|
||||
case LM_LONG_DOUBLE:
|
||||
goto fmt_error;
|
||||
case LM_LONG:
|
||||
ui_num = (u_wide_int) va_arg(ap, unsigned long int);
|
||||
break;
|
||||
@@ -511,7 +526,16 @@ static void xbuf_format_converter(smart_str *xbuf, const char *fmt, va_list ap)
|
||||
case 'f':
|
||||
case 'e':
|
||||
case 'E':
|
||||
fp_num = va_arg(ap, double);
|
||||
switch(modifier) {
|
||||
case LM_LONG_DOUBLE:
|
||||
fp_num = (double) va_arg(ap, long double);
|
||||
break;
|
||||
case LM_STD:
|
||||
fp_num = va_arg(ap, double);
|
||||
break;
|
||||
default:
|
||||
goto fmt_error;
|
||||
}
|
||||
|
||||
if (zend_isnan(fp_num)) {
|
||||
s = "nan";
|
||||
@@ -535,6 +559,16 @@ static void xbuf_format_converter(smart_str *xbuf, const char *fmt, va_list ap)
|
||||
|
||||
case 'g':
|
||||
case 'G':
|
||||
switch(modifier) {
|
||||
case LM_LONG_DOUBLE:
|
||||
fp_num = (double) va_arg(ap, long double);
|
||||
break;
|
||||
case LM_STD:
|
||||
fp_num = va_arg(ap, double);
|
||||
break;
|
||||
default:
|
||||
goto fmt_error;
|
||||
}
|
||||
if (adjust_precision == NO)
|
||||
precision = FLOAT_DIGITS;
|
||||
else if (precision == 0)
|
||||
@@ -542,7 +576,7 @@ static void xbuf_format_converter(smart_str *xbuf, const char *fmt, va_list ap)
|
||||
/*
|
||||
* * We use &num_buf[ 1 ], so that we have room for the sign
|
||||
*/
|
||||
s = ap_php_gcvt(va_arg(ap, double), precision, &num_buf[1],
|
||||
s = ap_php_gcvt(fp_num, precision, &num_buf[1],
|
||||
alternate_form);
|
||||
if (*s == '-')
|
||||
prefix_char = *s++;
|
||||
@@ -614,6 +648,8 @@ static void xbuf_format_converter(smart_str *xbuf, const char *fmt, va_list ap)
|
||||
continue;
|
||||
|
||||
|
||||
fmt_error:
|
||||
php_error(E_ERROR, "Illegal length modifier specified '%c' in s[np]printf call", *fmt);
|
||||
/*
|
||||
* The default case is for unrecognized %'s.
|
||||
* We print %<char> to help the user identify what
|
||||
|
||||
Reference in New Issue
Block a user