cvs: php4 /ext/standard basic_functions.c basic_functions.h php_string.h string.c

From: 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 /*

« previous php.cvs (#3430) next »