cvs: php4 /ext/standard basic_functions.c basic_functions.h php_string.h string.c
| From: | Rui Hirokawa | Date: | Mon, 08 Jan 2001 01:40:34 +0000 |
| Subject: | cvs: php4 /ext/standard basic_functions.c basic_functions.h php_string.h string.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-3430@lists.php.net to get a copy of this message | ||
hirokawa Sun Jan 7 17:40:34 2001 EDT
Modified files:
/php4/ext/standard basic_functions.c basic_functions.h php_string.h
string.c
Log:
added a output handler function ob_iconv_handler which tranforms output encoding using iconv().
Index: php4/ext/standard/basic_functions.c
diff -u php4/ext/standard/basic_functions.c:1.291 php4/ext/standard/basic_functions.c:1.292
--- php4/ext/standard/basic_functions.c:1.291 Wed Dec 27 07:43:05 2000
+++ php4/ext/standard/basic_functions.c Sun Jan 7 17:40:33 2001
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: basic_functions.c,v 1.291 2000/12/27 15:43:05 zeev Exp $ */
+/* $Id: basic_functions.c,v 1.292 2001/01/08 01:40:33 hirokawa Exp $ */
#include "php.h"
#include "php_main.h"
@@ -196,6 +196,7 @@
PHP_FE(fscanf, third_and_rest_force_ref)
#ifdef HAVE_ICONV
PHP_FE(iconv, NULL)
+ PHP_FE(ob_iconv_handler, NULL)
#endif
PHP_FE(parse_url, NULL)
PHP_FE(urlencode, NULL)
@@ -600,10 +601,38 @@
return SUCCESS;
}
+#ifdef HAVE_ICONV
+static PHP_INI_MH(OnUpdateIconvOutputEncoding)
+{
+ BLS_FETCH();
+
+ if (BG(iconv_output_encoding)) {
+ free(BG(iconv_output_encoding));
+ }
+ BG(iconv_output_encoding) = zend_strndup(new_value, new_value_length);
+ return SUCCESS;
+}
+
+static PHP_INI_MH(OnUpdateIconvInternalEncoding)
+{
+ BLS_FETCH();
+
+ if (BG(iconv_internal_encoding)) {
+ free(BG(iconv_internal_encoding));
+ }
+ BG(iconv_internal_encoding) = zend_strndup(new_value, new_value_length);
+ return SUCCESS;
+}
+#endif
+
PHP_INI_BEGIN()
PHP_INI_ENTRY_EX("safe_mode_protected_env_vars", SAFE_MODE_PROTECTED_ENV_VARS, PHP_INI_SYSTEM, OnUpdateSafeModeProtectedEnvVars, NULL)
PHP_INI_ENTRY_EX("safe_mode_allowed_env_vars", SAFE_MODE_ALLOWED_ENV_VARS, PHP_INI_SYSTEM, OnUpdateSafeModeAllowedEnvVars, NULL)
+#ifdef HAVE_ICONV
+ PHP_INI_ENTRY_EX("iconv.output_encoding", ICONV_OUTPUT_ENCODING, PHP_INI_SYSTEM, OnUpdateIconvOutputEncoding, NULL)
+ PHP_INI_ENTRY_EX("iconv.internal_encoding", ICONV_INTERNAL_ENCODING, PHP_INI_SYSTEM, OnUpdateIconvInternalEncoding, NULL)
+#endif
STD_PHP_INI_ENTRY("session.use_trans_sid",
"1", PHP_INI_ALL, OnUpdateBool, use_trans_sid, php_basic_globals, basic_globals)
PHP_INI_END()
Index: php4/ext/standard/basic_functions.h
diff -u php4/ext/standard/basic_functions.h:1.71 php4/ext/standard/basic_functions.h:1.72
--- php4/ext/standard/basic_functions.h:1.71 Mon Dec 18 11:23:50 2000
+++ php4/ext/standard/basic_functions.h Sun Jan 7 17:40:33 2001
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: basic_functions.h,v 1.71 2000/12/18 19:23:50 zak Exp $ */
+/* $Id: basic_functions.h,v 1.72 2001/01/08 01:40:33 hirokawa Exp $ */
#ifndef BASIC_FUNCTIONS_H
#define BASIC_FUNCTIONS_H
@@ -158,6 +158,11 @@
HashTable sm_protected_env_vars;
char *sm_allowed_env_vars;
+#ifdef HAVE_ICONV
+ char *iconv_internal_encoding;
+ char *iconv_output_encoding;
+#endif
+
/* pageinfo.c */
long page_uid;
long page_inode;
@@ -221,5 +226,8 @@
*/
#define SAFE_MODE_PROTECTED_ENV_VARS "LD_LIBRARY_PATH"
#define SAFE_MODE_ALLOWED_ENV_VARS "PHP_"
+
+#define ICONV_OUTPUT_ENCODING "ISO-8859-1"
+#define ICONV_INTERNAL_ENCODING "ISO-8859-1"
#endif /* BASIC_FUNCTIONS_H */
Index: php4/ext/standard/php_string.h
diff -u php4/ext/standard/php_string.h:1.28 php4/ext/standard/php_string.h:1.29
--- php4/ext/standard/php_string.h:1.28 Thu Dec 14 17:01:13 2000
+++ php4/ext/standard/php_string.h Sun Jan 7 17:40:33 2001
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_string.h,v 1.28 2000/12/15 01:01:13 ssb Exp $ */
+/* $Id: php_string.h,v 1.29 2001/01/08 01:40:33 hirokawa Exp $ */
/* Synced with php 3.0 revision 1.43 1999-06-16 [ssb] */
@@ -79,6 +79,7 @@
PHP_FUNCTION(str_pad);
PHP_FUNCTION(sscanf);
PHP_FUNCTION(iconv);
+PHP_FUNCTION(ob_iconv_handler);
#define strnatcmp(a, b) \
strnatcmp_ex(a, strlen(a), b, strlen(b), 0)
Index: php4/ext/standard/string.c
diff -u php4/ext/standard/string.c:1.177 php4/ext/standard/string.c:1.178
--- php4/ext/standard/string.c:1.177 Wed Dec 27 17:02:44 2000
+++ php4/ext/standard/string.c Sun Jan 7 17:40:33 2001
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: string.c,v 1.177 2000/12/28 01:02:44 jon Exp $ */
+/* $Id: string.c,v 1.178 2001/01/08 01:40:33 hirokawa Exp $ */
/* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */
@@ -32,6 +32,7 @@
#endif
#ifdef HAVE_ICONV
# include <iconv.h>
+# include "SAPI.h"
#endif
#include "scanf.h"
#include "zend_API.h"
@@ -71,6 +72,7 @@
}
int php_tag_find(char *tag, int len, char *set);
+int php_iconv_string(char *, char **, char *, char *);
/* this is read-only, so it's ok */
static char hexconvtab[] = "0123456789abcdef";
@@ -3003,7 +3005,44 @@
/* }}} */
#ifdef HAVE_ICONV
-/* {{{ proto iconv(string in_charset, string out_charset, string str)
+
+int php_iconv_string(char *in_p, char **out, char *in_charset, char *out_charset) {
+ unsigned int in_size, out_size;
+ char *out_buffer, *out_p;
+ iconv_t cd;
+ size_t result;
+ typedef unsigned int ucs4_t;
+
+ in_size = strlen(in_p) * sizeof(char) + 1;
+ out_size = strlen(in_p) * sizeof(ucs4_t) + 1;
+
+ out_buffer = (char *) emalloc(out_size);
+ *out = out_buffer;
+ out_p = out_buffer;
+
+ cd = iconv_open(out_charset, in_charset);
+
+ if (cd == (iconv_t)(-1)) {
+ php_error(E_WARNING, "iconv: cannot convert from
%s' to %s'",
+ in_charset, out_charset);
+ efree(out_buffer);
+ return -1;
+ }
+
+ result = iconv(cd, (const char **) &in_p, &in_size, (char **)
+ &out_p, &out_size);
+
+ if (result == (size_t)(-1)) {
+ sprintf(out_buffer, "???") ;
+ return -1;
+ }
+
+ iconv_close(cd);
+
+ return SUCCESS;
+}
+
+/* {{{ proto string iconv(string in_charset, string out_charset, string str)
Returns str converted to the out_charset character set.
*/
PHP_FUNCTION(iconv)
@@ -3023,34 +3062,40 @@
convert_to_string_ex(out_charset);
convert_to_string_ex(in_buffer);
- in_size = Z_STRLEN_PP(in_buffer) * sizeof(char) + 1;
- out_size = Z_STRLEN_PP(in_buffer) * sizeof(ucs4_t) + 1;
-
- out_buffer = (char *) emalloc(out_size);
-
- in_p = Z_STRVAL_PP(in_buffer);
- out_p = out_buffer;
-
- cd = iconv_open(Z_STRVAL_PP(out_charset), Z_STRVAL_PP(in_charset));
-
- if (cd == (iconv_t)(-1)) {
- php_error(E_WARNING, "iconv: cannot convert from %s' to
%s'",
- Z_STRVAL_PP(in_charset), Z_STRVAL_PP(out_charset));
- efree(out_buffer);
- RETURN_FALSE;
- }
-
- result = iconv(cd, (const char **) &in_p, &in_size, (char **)
- &out_p, &out_size);
+ if (php_iconv_string(Z_STRVAL_PP(in_buffer), &out_buffer,
+ Z_STRVAL_PP(in_charset), Z_STRVAL_PP(out_charset)) == SUCCESS) {
+ RETVAL_STRING(out_buffer, 0);
+ } else {
+ RETURN_FALSE;
+ }
+}
- if (result == (size_t)(-1)) {
- sprintf(out_buffer, "???") ;
- }
+/* {{{ proto string ob_iconv_handler(string contents)
+ Returns str in output buffer converted to the iconv.output_encoding
+ character set.
+*/
+PHP_FUNCTION(ob_iconv_handler)
+{
+ int coding;
+ char *out_buffer;
+ zval **zv_string;
- iconv_close(cd);
+ if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &zv_string)==FAILURE) {
+ ZEND_WRONG_PARAM_COUNT();
+ }
- RETVAL_STRING(out_buffer, 0);
+ if (php_iconv_string(Z_STRVAL_PP(zv_string), &out_buffer,
+ BG(iconv_internal_encoding),
+ BG(iconv_output_encoding))==SUCCESS) {
+ RETVAL_STRING(out_buffer, 0);
+ } else {
+ zval_dtor(return_value);
+ *return_value = **zv_string;
+ zval_copy_ctor(return_value);
+ }
+
}
+
#endif
/*