1
0
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:
Marcus Boerger
2003-09-14 09:50:36 +00:00
parent 9b98e42f35
commit 9f329adb02
3 changed files with 78 additions and 5 deletions
+38 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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