]> granicus.if.org Git - php/commitdiff
Add length modifier L
authorMarcus Boerger <helly@php.net>
Sun, 14 Sep 2003 09:50:36 +0000 (09:50 +0000)
committerMarcus Boerger <helly@php.net>
Sun, 14 Sep 2003 09:50:36 +0000 (09:50 +0000)
main/snprintf.c
main/snprintf.h
main/spprintf.c

index 6c61f21938f2225e23713443dfd144ac8ec24f89..797b50e989dbd185ee9d3f83c4d6a2c725006722 100644 (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
index da659c3bec63087dc847c885d33cebc06c1329b9..81c49e011a43405bd55eb8a599a6f051d806a083 100644 (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);
index f248e8eeb53fc02a5bff767eca2cee448b3243ed..104a2a58f66db048e20b2d224eaa1ad8f8685d6d 100644 (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