summaryrefslogtreecommitdiff
path: root/ext/iconv
diff options
context:
space:
mode:
authorRui Hirokawa <hirokawa@php.net>2001-01-09 15:22:45 +0000
committerRui Hirokawa <hirokawa@php.net>2001-01-09 15:22:45 +0000
commit4e035d035aa0d4fdd2d9618e41398c20a1f24e9b (patch)
tree3a61b10f0cab202d7d422ce53de33092312a6bb4 /ext/iconv
parent0afcb03de3816d745ba79c5e27bbe3d7998106eb (diff)
downloadphp-git-4e035d035aa0d4fdd2d9618e41398c20a1f24e9b.tar.gz
move iconv related functions to separate iconv extension.
Diffstat (limited to 'ext/iconv')
-rw-r--r--ext/iconv/Makefile.in8
-rw-r--r--ext/iconv/config.m438
-rw-r--r--ext/iconv/iconv.c241
-rw-r--r--ext/iconv/php_iconv.h77
4 files changed, 364 insertions, 0 deletions
diff --git a/ext/iconv/Makefile.in b/ext/iconv/Makefile.in
new file mode 100644
index 0000000000..728f5db4a6
--- /dev/null
+++ b/ext/iconv/Makefile.in
@@ -0,0 +1,8 @@
+# $Id$
+
+LTLIBRARY_NAME = libiconv.la
+LTLIBRARY_SOURCES = iconv.c
+LTLIBRARY_SHARED_NAME = iconv.la
+LTLIBRARY_SHARED_LIBADD = $(ICONV_SHARED_LIBADD)
+
+include $(top_srcdir)/build/dynlib.mk
diff --git a/ext/iconv/config.m4 b/ext/iconv/config.m4
new file mode 100644
index 0000000000..2bf91e395b
--- /dev/null
+++ b/ext/iconv/config.m4
@@ -0,0 +1,38 @@
+dnl $Id$
+dnl config.m4 for extension iconv
+
+PHP_ARG_WITH(iconv, for iconv support,
+[ --with-iconv[=DIR] Include iconv support])
+
+if test "$PHP_ICONV" != "no"; then
+
+ if test -r $PHP_ICONV/include/iconv.h; then
+ ICONV_DIR=$PHP_ICONV
+ else
+ AC_MSG_CHECKING(for iconv in default path)
+ for i in /usr/local /usr; do
+ if test -r $i/include/iconv.h; then
+ ICONV_DIR=$i
+ AC_MSG_RESULT(found in $i)
+ fi
+ done
+ fi
+
+ if test -z "$ICONV_DIR"; then
+ AC_MSG_RESULT(not found)
+ AC_MSG_ERROR(Please reinstall the iconv library)
+ fi
+
+ AC_ADD_INCLUDE($ICONV_DIR/include)
+
+ PHP_SUBST(ICONV_SHARED_LIBADD)
+
+ if test -f $ICONV_DIR/lib/libconv.a -o -f $ICONV_DIR/lib/libiconv.so ; then
+ AC_CHECK_LIB(iconv, iconv_open, AC_DEFINE(HAVE_ICONV, 1, [ ]))
+ AC_ADD_LIBRARY_WITH_PATH(iconv, $ICONV_DIR/lib, ICONV_SHARED_LIBADD)
+ else
+ AC_CHECK_LIB(c, iconv_open, AC_DEFINE(HAVE_ICONV, 1, [ ]))
+ fi
+
+ PHP_EXTENSION(iconv, $ext_shared)
+fi
diff --git a/ext/iconv/iconv.c b/ext/iconv/iconv.c
new file mode 100644
index 0000000000..b28ecf3bf6
--- /dev/null
+++ b/ext/iconv/iconv.c
@@ -0,0 +1,241 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP version 4.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 2.02 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available at through the world-wide-web at |
+ | http://www.php.net/license/2_02.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Rui Hirokawa <louis@cityfujisawa.ne.jp> |
+ | Stig Bakken <ssb@fast.no> |
+ +----------------------------------------------------------------------+
+ */
+
+#include "php.h"
+
+#if HAVE_ICONV
+
+#include "php_ini.h"
+#include "php_iconv.h"
+
+
+ZEND_DECLARE_MODULE_GLOBALS(iconv)
+
+/* True global resources - no need for thread safety here */
+static int le_iconv;
+
+/* Every user visible function must have an entry in iconv_functions[].
+*/
+function_entry iconv_functions[] = {
+ PHP_FE(iconv, NULL)
+ PHP_FE(ob_iconv_handler, NULL)
+ PHP_FE(iconv_set_encoding, NULL)
+ {NULL, NULL, NULL}
+};
+
+zend_module_entry iconv_module_entry = {
+ "iconv",
+ iconv_functions,
+ PHP_MINIT(iconv),
+ PHP_MSHUTDOWN(iconv),
+ NULL,
+ NULL,
+ PHP_MINFO(iconv),
+ STANDARD_MODULE_PROPERTIES
+};
+
+#ifdef COMPILE_DL_ICONV
+ZEND_GET_MODULE(iconv)
+#endif
+
+int php_iconv_string(char *, char **, char *, char *);
+
+
+static PHP_INI_MH(OnUpdateIconvOutputEncoding)
+{
+ ICONVLS_FETCH();
+
+ if (ICONVG(iconv_output_encoding)) {
+ free(ICONVG(iconv_output_encoding));
+ }
+ ICONVG(iconv_output_encoding) = zend_strndup(new_value, new_value_length);
+ return SUCCESS;
+}
+
+static PHP_INI_MH(OnUpdateIconvInternalEncoding)
+{
+ ICONVLS_FETCH();
+
+ if (ICONVG(iconv_internal_encoding)) {
+ free(ICONVG(iconv_internal_encoding));
+ }
+ ICONVG(iconv_internal_encoding) = zend_strndup(new_value, new_value_length);
+ return SUCCESS;
+}
+
+
+PHP_INI_BEGIN()
+ 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)
+PHP_INI_END()
+
+
+PHP_MINIT_FUNCTION(iconv)
+{
+/* Remove comments if you have entries in php.ini
+ REGISTER_INI_ENTRIES();
+*/
+ return SUCCESS;
+}
+
+PHP_MSHUTDOWN_FUNCTION(iconv)
+{
+/* Remove comments if you have entries in php.ini
+ UNREGISTER_INI_ENTRIES();
+*/
+ return SUCCESS;
+}
+
+PHP_MINFO_FUNCTION(iconv)
+{
+ php_info_print_table_start();
+ php_info_print_table_header(2, "iconv support", "enabled");
+ php_info_print_table_end();
+
+ DISPLAY_INI_ENTRIES();
+}
+
+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)
+{
+ zval **in_charset, **out_charset, **in_buffer;
+ unsigned int in_size, out_size;
+ char *out_buffer, *in_p, *out_p;
+ size_t result;
+ typedef unsigned int ucs4_t;
+
+ if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &in_charset, &out_charset, &in_buffer) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string_ex(in_charset);
+ convert_to_string_ex(out_charset);
+ convert_to_string_ex(in_buffer);
+
+ 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;
+ }
+}
+
+/* {{{ 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;
+ ICONVLS_FETCH();
+
+ if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &zv_string)==FAILURE) {
+ ZEND_WRONG_PARAM_COUNT();
+ }
+
+ if (php_iconv_string(Z_STRVAL_PP(zv_string), &out_buffer,
+ ICONVG(iconv_internal_encoding),
+ ICONVG(iconv_output_encoding))==SUCCESS) {
+ RETVAL_STRING(out_buffer, 0);
+ } else {
+ zval_dtor(return_value);
+ *return_value = **zv_string;
+ zval_copy_ctor(return_value);
+ }
+
+}
+
+/* {{{ proto bool iconv_set_encoding(string int_charset, string out_charset)
+ set internal encoding and output encoding for ob_iconv_handler().
+*/
+PHP_FUNCTION(iconv_set_encoding)
+{
+ zval **int_charset, **out_charset;
+ ICONVLS_FETCH();
+
+ if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &int_charset, &out_charset) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string_ex(int_charset);
+ convert_to_string_ex(out_charset);
+
+ if (ICONVG(iconv_internal_encoding)) {
+ free(ICONVG(iconv_internal_encoding));
+ }
+ ICONVG(iconv_internal_encoding) = estrndup(Z_STRVAL_PP(int_charset), Z_STRLEN_PP(int_charset));
+
+ if (ICONVG(iconv_output_encoding)) {
+ free(ICONVG(iconv_output_encoding));
+ }
+ ICONVG(iconv_output_encoding) = estrndup(Z_STRVAL_PP(out_charset),Z_STRLEN_PP(out_charset));
+
+ RETURN_TRUE;
+}
+
+/* }}} */
+#endif
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/iconv/php_iconv.h b/ext/iconv/php_iconv.h
new file mode 100644
index 0000000000..271bf74d24
--- /dev/null
+++ b/ext/iconv/php_iconv.h
@@ -0,0 +1,77 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP version 4.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 2.02 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available at through the world-wide-web at |
+ | http://www.php.net/license/2_02.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Rui Hirokawa <louis@cityfujisawa.ne.jp> |
+ | Stig Bakken <ssb@fast.no> |
+ +----------------------------------------------------------------------+
+ */
+
+#ifndef PHP_ICONV_H
+#define PHP_ICONV_H
+
+#include <iconv.h>
+#include "SAPI.h"
+
+extern zend_module_entry iconv_module_entry;
+#define phpext_iconv_ptr &iconv_module_entry
+
+#ifdef PHP_WIN32
+#define PHP_ICONV_API __declspec(dllexport)
+#else
+#define PHP_ICONV_API
+#endif
+
+PHP_MINIT_FUNCTION(iconv);
+PHP_MSHUTDOWN_FUNCTION(iconv);
+PHP_RINIT_FUNCTION(iconv);
+PHP_RSHUTDOWN_FUNCTION(iconv);
+PHP_MINFO_FUNCTION(iconv);
+
+PHP_FUNCTION(iconv);
+PHP_FUNCTION(ob_iconv_handler);
+PHP_FUNCTION(iconv_set_encoding);
+
+ZEND_BEGIN_MODULE_GLOBALS(iconv)
+ char *iconv_internal_encoding;
+ char *iconv_output_encoding;
+ int global_variable;
+ZEND_END_MODULE_GLOBALS(iconv)
+
+/* In every function that needs to use variables in php_iconv_globals,
+ do call ICONVLS_FETCH(); after declaring other variables used by
+ that function, and always refer to them as ICONVG(variable).
+ You are encouraged to rename these macros something shorter, see
+ examples in any other php module directory.
+*/
+
+#ifdef ZTS
+#define ICONVG(v) (iconv_globals->v)
+#define ICONVLS_FETCH() php_iconv_globals *iconv_globals = ts_resource(iconv_globals_id)
+#else
+#define ICONVG(v) (iconv_globals.v)
+#define ICONVLS_FETCH()
+#endif
+
+#define ICONV_OUTPUT_ENCODING "ISO-8859-1"
+#define ICONV_INTERNAL_ENCODING "ISO-8859-1"
+
+#endif /* PHP_ICONV_H */
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */