helly           Sat Feb 24 18:33:03 2007 UTC

  Modified files:              
    /php-src/main       snprintf.c 
  Log:
  - Make [v]s[nl]printf compatible with 5.2 versions and [v]spprintf of head
  
http://cvs.php.net/viewvc.cgi/php-src/main/snprintf.c?r1=1.50&r2=1.51&diff_format=u
Index: php-src/main/snprintf.c
diff -u php-src/main/snprintf.c:1.50 php-src/main/snprintf.c:1.51
--- php-src/main/snprintf.c:1.50        Sat Feb 24 18:24:06 2007
+++ php-src/main/snprintf.c     Sat Feb 24 18:33:03 2007
@@ -16,7 +16,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: snprintf.c,v 1.50 2007/02/24 18:24:06 helly Exp $ */
+/* $Id: snprintf.c,v 1.51 2007/02/24 18:33:03 helly Exp $ */
 
 
 #include "php.h"
@@ -569,8 +569,9 @@
        register int i;
 
        register char *s = NULL;
+       register UChar *u = NULL;
        char *q;
-       int s_len;
+       int s_len, s_unicode, u_len;
 
        register int min_width = 0;
        int precision = 0;
@@ -586,6 +587,7 @@
 
        char num_buf[NUM_BUF_SIZE];
        char char_buf[2];                       /* for printing %% and 
%<unknown> */
+       zend_bool free_s; /* free string if allocated here */
 
 #ifdef HAVE_LOCALE_H
        struct lconv *lconv = NULL;
@@ -616,6 +618,8 @@
                        alternate_form = print_sign = print_blank = NO;
                        pad_char = ' ';
                        prefix_char = NUL;
+                       free_s = 0;
+                       s_unicode = 0;
 
                        fmt++;
 
@@ -909,8 +913,59 @@
                                        }
                                        break;
 
+                               case 'v':
+                                       if (UG(unicode)) {
+                                               goto fmt_unicode;
+                                       } else {
+                                               goto fmt_string;
+                                       }
+                                       break;
+
+                               case 'R':
+                               {
+                                       int type = va_arg(ap, int);
+                                       if (type != IS_UNICODE) {
+                                               if (alternate_form) {
+                                                       va_arg(ap, UConverter 
*);
+                                               }
+                                               goto fmt_string;
+                                       }
+                               }
+                               /* break omitted */
+
+                               case 'r':
+fmt_unicode:
+                               {
+                                       UConverter *conv = 
ZEND_U_CONVERTER(UG(output_encoding_conv));
+                                       UErrorCode status = U_ZERO_ERROR;
+                                       char *res = NULL;
+
+                                       if (alternate_form) {
+                                               conv = va_arg(ap, UConverter *);
+                                       }
+
+                                       u = va_arg(ap, UChar *);
+                                       if (u == NULL) {
+                                               s = S_NULL;
+                                               s_len = S_NULL_LEN;
+                                               break;
+                                       }
+
+                                       u_len = u_strlen(u);
+                                       zend_unicode_to_string_ex(conv, &res, 
&s_len, u, u_len, &status);
+                                       if (U_FAILURE(status)) {
+                                               php_error(E_WARNING, "Could not 
convert Unicode to printable form in s[np]printf call");
+                                               return (cc);
+                                       }
+                                       s = res;
+                                       free_s = 1;
+                                               
+                                       pad_char = ' ';
+                                       break;
+                               }
 
                                case 's':
+fmt_string:
                                        s = va_arg(ap, char *);
                                        if (s != NULL) {
                                                s_len = strlen(s);
@@ -923,7 +978,6 @@
                                        pad_char = ' ';
                                        break;
 
-                               
                                case 'f':
                                case 'F':
                                case 'e':
@@ -1102,7 +1156,7 @@
                        if (adjust_width && adjust == RIGHT && min_width > 
s_len) {
                                if (pad_char == '0' && prefix_char != NUL) {
                                        INS_CHAR(*s, sp, bep, cc)
-                                               s++;
+                                       s++;
                                        s_len--;
                                        min_width--;
                                }
@@ -1116,6 +1170,8 @@
                                s++;
                        }
 
+                       if (free_s) efree(s);
+
                        if (adjust_width && adjust == LEFT && min_width > s_len)
                                PAD(min_width, s_len, pad_char);
                }

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

Reply via email to