moriyoshi               Fri Jan  3 00:13:11 2003 EDT

  Modified files:              (Branch: PHP_4_3)
    /php4/ext/iconv     iconv.c 
  Log:
  Fixed shift-out sequence unawareness issue
  
  
Index: php4/ext/iconv/iconv.c
diff -u php4/ext/iconv/iconv.c:1.65.2.2 php4/ext/iconv/iconv.c:1.65.2.3
--- php4/ext/iconv/iconv.c:1.65.2.2     Tue Dec 31 11:34:43 2002
+++ php4/ext/iconv/iconv.c      Fri Jan  3 00:13:11 2003
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: iconv.c,v 1.65.2.2 2002/12/31 16:34:43 sebastian Exp $ */
+/* $Id: iconv.c,v 1.65.2.3 2003/01/03 05:13:11 moriyoshi Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -230,6 +230,18 @@
                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';
@@ -288,6 +300,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)) {
@@ -299,6 +339,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