]> granicus.if.org Git - php/commitdiff
added a output handler function ob_iconv_handler which tranforms output encoding...
authorRui Hirokawa <hirokawa@php.net>
Mon, 8 Jan 2001 01:40:33 +0000 (01:40 +0000)
committerRui Hirokawa <hirokawa@php.net>
Mon, 8 Jan 2001 01:40:33 +0000 (01:40 +0000)
ext/standard/basic_functions.c
ext/standard/basic_functions.h
ext/standard/php_string.h
ext/standard/string.c

index 27f19b957b399d31585fedbd54a726dcf1df05ce..da694a48d4f93b3223da1fd124f4328a8020fc36 100644 (file)
@@ -196,6 +196,7 @@ function_entry basic_functions[] = {
     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 @@ static PHP_INI_MH(OnUpdateSafeModeAllowedEnvVars)
        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 247c42271d269afb61eb4ee5a24ae46c3ce5bea3..fa403f2a96115247c878b3bf7b7861176873750d 100644 (file)
@@ -158,6 +158,11 @@ typedef struct {
        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;
@@ -222,4 +227,7 @@ typedef struct {
 #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 c60c21483098591d46ed18610549281f63911f07..da8a568954e55236bf24a078bad7eb6ce37f5f0b 100644 (file)
@@ -79,6 +79,7 @@ PHP_FUNCTION(substr_count);
 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 f6010e71dc166afde654333f046480e55f7a91b5..34dc4cf6e471a8ba5406e767b05d839db0d3c869 100644 (file)
@@ -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 @@ void register_string_constants(INIT_FUNC_ARGS)
 }
 
 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 @@ PHP_FUNCTION(sscanf)
 /* }}} */
 
 #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 @@ PHP_FUNCTION(iconv)
     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
 
 /*