helly           Thu Feb  7 18:41:35 2008 UTC

  Modified files:              (Branch: PHP_5_3)
    /php-src/main       snprintf.c spprintf.c 
  Log:
  - MFH Add %Z to *printf
  
http://cvs.php.net/viewvc.cgi/php-src/main/snprintf.c?r1=1.37.2.4.2.14.2.3&r2=1.37.2.4.2.14.2.4&diff_format=u
Index: php-src/main/snprintf.c
diff -u php-src/main/snprintf.c:1.37.2.4.2.14.2.3 
php-src/main/snprintf.c:1.37.2.4.2.14.2.4
--- php-src/main/snprintf.c:1.37.2.4.2.14.2.3   Thu Feb  7 12:47:44 2008
+++ php-src/main/snprintf.c     Thu Feb  7 18:41:35 2008
@@ -16,7 +16,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: snprintf.c,v 1.37.2.4.2.14.2.3 2008/02/07 12:47:44 helly Exp $ */
+/* $Id: snprintf.c,v 1.37.2.4.2.14.2.4 2008/02/07 18:41:35 helly Exp $ */
 
 
 #include "php.h"
@@ -581,16 +581,17 @@
  */
 static int format_converter(register buffy * odp, const char *fmt, va_list ap) 
/* {{{ */
 {
-       register char *sp;
-       register char *bep;
-       register int cc = 0;
-       register int i;
+       char *sp;
+       char *bep;
+       int cc = 0;
+       int i;
 
-       register char *s = NULL;
+       char *s = NULL;
        char *q;
-       int s_len;
+       int s_len, free_zcopy;
+       zval *zvp, zcopy;
 
-       register int min_width = 0;
+       int min_width = 0;
        int precision = 0;
        enum {
                LEFT, RIGHT
@@ -634,6 +635,7 @@
                        alternate_form = print_sign = print_blank = NO;
                        pad_char = ' ';
                        prefix_char = NUL;
+                       free_zcopy = 0;
 
                        fmt++;
 
@@ -780,6 +782,18 @@
                         *   It is reset to ' ' by non-numeric formats
                         */
                        switch (*fmt) {
+                               case 'Z':
+                                       zvp = (zval*) va_arg(ap, zval*);
+                                       zend_make_printable_zval(zvp, &zcopy, 
&free_zcopy);
+                                       if (free_zcopy) {
+                                               zvp = &zcopy;
+                                       }
+                                       s_len = Z_STRLEN_P(zvp);
+                                       s = Z_STRVAL_P(zvp);
+                                       if (adjust_precision && precision < 
s_len) {
+                                               s_len = precision;
+                                       }
+                                       break;
                                case 'u':
                                        switch(modifier) {
                                                default:
@@ -1019,19 +1033,19 @@
                                        }
 
                                        if (zend_isnan(fp_num)) {
-                                               s = "NAN";
-                                               s_len = 3;
-                                               break;
-                                       } else if (zend_isinf(fp_num)) {
-                                               if (fp_num > 0) {
-                                                       s = "INF";
-                                                       s_len = 3;
-                                               } else {
-                                                       s = "-INF";
-                                                       s_len = 4;
-                                               }
-                                               break;
-                                       }
+                                               s = "NAN";
+                                               s_len = 3;
+                                               break;
+                                       } else if (zend_isinf(fp_num)) {
+                                               if (fp_num > 0) {
+                                                       s = "INF";
+                                                       s_len = 3;
+                                               } else {
+                                                       s = "-INF";
+                                                       s_len = 4;
+                                               }
+                                               break;
+                                       }
 
                                        if (adjust_precision == NO) {
                                                precision = FLOAT_DIGITS;
@@ -1161,6 +1175,9 @@
 
                        if (adjust_width && adjust == LEFT && min_width > s_len)
                                PAD(min_width, s_len, pad_char);
+                       if (free_zcopy) {
+                               zval_dtor(&zcopy);
+                       }
                }
 skip_output:
                fmt++;
http://cvs.php.net/viewvc.cgi/php-src/main/spprintf.c?r1=1.25.2.2.2.10.2.3&r2=1.25.2.2.2.10.2.4&diff_format=u
Index: php-src/main/spprintf.c
diff -u php-src/main/spprintf.c:1.25.2.2.2.10.2.3 
php-src/main/spprintf.c:1.25.2.2.2.10.2.4
--- php-src/main/spprintf.c:1.25.2.2.2.10.2.3   Thu Feb  7 12:47:44 2008
+++ php-src/main/spprintf.c     Thu Feb  7 18:41:35 2008
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: spprintf.c,v 1.25.2.2.2.10.2.3 2008/02/07 12:47:44 helly Exp $ */
+/* $Id: spprintf.c,v 1.25.2.2.2.10.2.4 2008/02/07 18:41:35 helly Exp $ */
 
 /* This is the spprintf implementation.
  * It has emerged from apache snprintf. See original header:
@@ -185,11 +185,12 @@
  */
 static void xbuf_format_converter(smart_str *xbuf, const char *fmt, va_list 
ap) /* {{{ */
 {
-       register char *s = NULL;
+       char *s = NULL;
        char *q;
-       int s_len;
+       int s_len, free_zcopy;
+       zval *zvp, zcopy;
 
-       register int min_width = 0;
+       int min_width = 0;
        int precision = 0;
        enum {
                LEFT, RIGHT
@@ -230,6 +231,7 @@
                        alternate_form = print_sign = print_blank = NO;
                        pad_char = ' ';
                        prefix_char = NUL;
+                       free_zcopy = 0;
 
                        fmt++;
 
@@ -376,6 +378,18 @@
                         *   It is reset to ' ' by non-numeric formats
                         */
                        switch (*fmt) {
+                               case 'Z':
+                                       zvp = (zval*) va_arg(ap, zval*);
+                                       zend_make_printable_zval(zvp, &zcopy, 
&free_zcopy);
+                                       if (free_zcopy) {
+                                               zvp = &zcopy;
+                                       }
+                                       s_len = Z_STRLEN_P(zvp);
+                                       s = Z_STRVAL_P(zvp);
+                                       if (adjust_precision && precision < 
s_len) {
+                                               s_len = precision;
+                                       }
+                                       break;
                                case 'u':
                                        switch(modifier) {
                                                default:
@@ -751,6 +765,9 @@
 
                        if (adjust_width && adjust == LEFT && min_width > s_len)
                                PAD(xbuf, min_width - s_len, pad_char);
+                       if (free_zcopy) {
+                               zval_dtor(&zcopy);
+                       }
                }
 skip_output:
                fmt++;

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to