derick          Tue Aug 16 14:02:41 2005 EDT

  Modified files:              
    /php-src/ext/standard       php_smart_str.h 
    /php-src/main       spprintf.c 
  Log:
  - Fixed a couple of bugs in the new smart_str macros, and allow them to
    allocate two extra bytes (so that we can pad them with two \0's for UTF-16)
  - Fixed usage of smart_str's in the PAD and INS_STRING macros.
  
  
http://cvs.php.net/diff.php/php-src/ext/standard/php_smart_str.h?r1=1.31&r2=1.32&ty=u
Index: php-src/ext/standard/php_smart_str.h
diff -u php-src/ext/standard/php_smart_str.h:1.31 
php-src/ext/standard/php_smart_str.h:1.32
--- php-src/ext/standard/php_smart_str.h:1.31   Sun Aug 14 13:14:40 2005
+++ php-src/ext/standard/php_smart_str.h        Tue Aug 16 14:02:39 2005
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_smart_str.h,v 1.31 2005/08/14 17:14:40 helly Exp $ */
+/* $Id: php_smart_str.h,v 1.32 2005/08/16 18:02:39 derick Exp $ */
 
 #ifndef PHP_SMART_STR_H
 #define PHP_SMART_STR_H
@@ -28,9 +28,12 @@
 #include <zend.h>
 #endif
 
+/* It's safe to write to "one behind the length" as we allocate two extra bytes
+ * to allow for Unicode trailers */
 #define smart_str_0(x) do {                                                    
                                \
        if ((x)->c) {                                                           
                                        \
                (x)->c[(x)->len] = '\0';                                        
                                \
+               (x)->c[(x)->len + 1] = '\0';                                    
                        \
        }                                                                       
                                                        \
 } while (0)
 
@@ -49,7 +52,7 @@
 #endif
 
 #define SMART_STR_DO_REALLOC(d, what) \
-       (d)->c = SMART_STR_REALLOC((d)->c, (d)->a + 1, (what))
+       (d)->c = SMART_STR_REALLOC((d)->c, (d)->a + 2, (what))
 
 #define smart_str_alloc4(d, n, what, newlen) do {                              
        \
        if (!(d)->c) {                                                          
                                        \
@@ -78,15 +81,15 @@
 #define smart_str_appends(dest, src) \
        smart_str_appendl((dest), (src), strlen(src))
 
-/* normall character appending */
+/* normal character appending */
 #define smart_str_appendc(dest, c) \
        smart_str_appendc_ex((dest), (c), 0)
 
 /* appending of a single UTF-16 code unit (2 byte)*/
-#define smart_str_append2c(dest, c) while (0) {        \
+#define smart_str_append2c(dest, c) do {       \
        smart_str_appendc_ex((dest), (c&0xFF), 0);      \
        smart_str_appendc_ex((dest), (c&0xFF00 ? c>>8 : '\0'), 0);      \
-}
+} while (0)
 
 #define smart_str_free(s) \
        smart_str_free_ex((s), 0)
http://cvs.php.net/diff.php/php-src/main/spprintf.c?r1=1.31&r2=1.32&ty=u
Index: php-src/main/spprintf.c
diff -u php-src/main/spprintf.c:1.31 php-src/main/spprintf.c:1.32
--- php-src/main/spprintf.c:1.31        Mon Aug 15 03:19:10 2005
+++ php-src/main/spprintf.c     Tue Aug 16 14:02:41 2005
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: spprintf.c,v 1.31 2005/08/15 07:19:10 dmitry Exp $ */
+/* $Id: spprintf.c,v 1.32 2005/08/16 18:02:41 derick Exp $ */
 
 /* This is the spprintf implementation.
  * It has emerged from apache snprintf. See original header:
@@ -126,22 +126,22 @@
        }                                                                       
                        \
 } while (0)
 
-#define INS_STRING(unicode, s_uni, xbuf, s, slen)      \
+#define INS_STRING(unicode, s_unicode, xbuf, s, s_len) \
 do {                                                                           
                \
        if (unicode) {                                                          
        \
-               size_t newlen, p, sz = 2*(slen);                        \
+               size_t newlen, p, sz = 2*(s_len);                       \
                smart_str_alloc(xbuf, (sz), 0);                         \
-               if (s_uni) {                                                    
        \
+               if (s_unicode) {                                                
        \
                        memcpy(xbuf->c + xbuf->len, s, (sz));   \
                } else {                                                        
                \
-                       p = (slen);                                             
                \
+                       p = (s_len);                                            
        \
                        while(p--) {                            \
-                               smart_str_append2c(xbuf, *s++);         \
+                               smart_str_append2c(xbuf, *s);           \
+                               *s++;                                           
                \
                        }                                                       
                        \
                }                                                               
                        \
-               xbuf->len += (sz);                                              
        \
        } else {                                                                
                \
-               smart_str_appendl(xbuf, s, slen);                       \
+               smart_str_appendl(xbuf, s, s_len);                      \
        }                                                                       
                        \
 } while (0)
        
@@ -163,8 +163,8 @@
                } else {                                                        
                \
                        smart_str_alloc(xbuf, sz, 0);                   \
                        memset(xbuf->c + xbuf->len, ch, sz);    \
+                       xbuf->len += sz;                                        
        \
                }                                                               
                        \
-               xbuf->len += sz;                                                
        \
        }                                                                       
                        \
 } while (0)
 
@@ -847,7 +847,6 @@
        if (max_len && xbuf.len > max_len) {
                xbuf.len = max_len;
        }
-       smart_str_appendc(&xbuf, '\0'); /* we need \0\0 as termination */
        smart_str_0(&xbuf);
                
        *pbuf = xbuf.c;

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

Reply via email to