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';
}
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)) {
case EILSEQ:
retval = PHP_ICONV_ERR_ILLEGAL_SEQ;
break;
+
case E2BIG:
/* should not happen */
retval = PHP_ICONV_ERR_TOO_BIG;