moriyoshi               Fri Jan  3 00:14:34 2003 EDT

  Modified files:              
    /php4/ext/iconv     iconv.c 
  Log:
  MFB: fixed shift-out sequence unawareness issue
  
  
Index: php4/ext/iconv/iconv.c
diff -u php4/ext/iconv/iconv.c:1.68 php4/ext/iconv/iconv.c:1.69
--- php4/ext/iconv/iconv.c:1.68 Tue Dec 31 14:13:16 2002
+++ php4/ext/iconv/iconv.c      Fri Jan  3 00:14:34 2003
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: iconv.c,v 1.68 2002/12/31 19:13:16 moriyoshi Exp $ */
+/* $Id: iconv.c,v 1.69 2003/01/03 05:14:34 moriyoshi Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -240,7 +240,7 @@
        size_t decoded_len;
        unsigned char *retval;
 
-       unsigned int hexval_tbl[256] = {
+       static unsigned int hexval_tbl[256] = {
                16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
                16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
                16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
@@ -402,7 +402,19 @@
                efree(out_buffer);
                return PHP_ICONV_ERR_UNKNOWN;
        }
-       
+
+       if (out_left < 8) {
+               out_buffer = (char *) erealloc(out_buffer, out_size + 8);
+       }
+
+       /* flush the shift-out sequences */ 
+       result = icv(cd, NULL, NULL, &out_p, &out_left);
+
+       if (result == (size_t)(-1)) {
+               efree(out_buffer);
+               return PHP_ICONV_ERR_UNKNOWN;
+       }
+
        *out_len = out_size - out_left;
        out_buffer[*out_len] = '\0';
        *out = out_buffer;
@@ -460,6 +472,34 @@
                }
                break;
        }
+
+       if (result != (size_t)(-1)) {
+               /* flush the shift-out sequences */ 
+               for (;;) {
+                       result = icv(cd, NULL, NULL, (char **) &out_p, &out_left);
+                       out_size = bsz - out_left;
+
+                       if (result != (size_t)(-1)) {
+                               break;
+                       }
+
+                       if (errno == E2BIG) {
+                               bsz += 16;
+                               tmp_buf = (char *) erealloc(out_buf, bsz);
+
+                               if (tmp_buf == NULL) {
+                                       break;
+                               }
+                               
+                               out_p = out_buf = tmp_buf;
+                               out_p += out_size;
+                               out_left = bsz - out_size;
+                       } else {
+                               break;
+                       }
+               }
+       }
+
        icv_close(cd);
 
        if (result == (size_t)(-1)) {
@@ -471,6 +511,7 @@
                        case EILSEQ:
                                retval = PHP_ICONV_ERR_ILLEGAL_SEQ;
                                break;
+
                        case E2BIG:
                                /* should not happen */
                                retval = PHP_ICONV_ERR_TOO_BIG;



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

Reply via email to