diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2013-03-14 05:42:27 +0000 |
---|---|---|
committer | <> | 2013-04-03 16:25:08 +0000 |
commit | c4dd7a1a684490673e25aaf4fabec5df138854c4 (patch) | |
tree | 4d57c44caae4480efff02b90b9be86f44bf25409 /ext/recode | |
download | php2-master.tar.gz |
Imported from /home/lorry/working-area/delta_php2/php-5.4.13.tar.bz2.HEADphp-5.4.13master
Diffstat (limited to 'ext/recode')
-rw-r--r-- | ext/recode/CREDITS | 2 | ||||
-rw-r--r-- | ext/recode/config.m4 | 64 | ||||
-rw-r--r-- | ext/recode/config9.m4 | 18 | ||||
-rw-r--r-- | ext/recode/php_recode.h | 39 | ||||
-rw-r--r-- | ext/recode/recode.c | 242 |
5 files changed, 365 insertions, 0 deletions
diff --git a/ext/recode/CREDITS b/ext/recode/CREDITS new file mode 100644 index 0000000..aae8240 --- /dev/null +++ b/ext/recode/CREDITS @@ -0,0 +1,2 @@ +Recode +Kristian Koehntopp diff --git a/ext/recode/config.m4 b/ext/recode/config.m4 new file mode 100644 index 0000000..8df4cfc --- /dev/null +++ b/ext/recode/config.m4 @@ -0,0 +1,64 @@ +dnl +dnl $Id$ +dnl + +PHP_ARG_WITH(recode,for recode support, +[ --with-recode[=DIR] Include recode support]) + +if test "$PHP_RECODE" != "no"; then + RECODE_LIST="$PHP_RECODE /usr/local /usr /opt" + + for i in $RECODE_LIST; do + if test -f $i/include/recode.h; then + RECODE_DIR=$i + RECODE_INC=include + RECODE_LIB=$PHP_LIBDIR + fi + if test -f $i/include/recode/recode.h; then + RECODE_DIR=$i + RECODE_INC=include/recode + RECODE_LIB=$PHP_LIBDIR/recode + fi + if test -f $i/recode/include/recode.h; then + RECODE_DIR=$i/recode + RECODE_INC=include + RECODE_LIB=$PHP_LIBDIR + fi + test -n "$RECODE_DIR" && break + done + + if test -z "$RECODE_DIR"; then + AC_MSG_ERROR([Can not find recode.h anywhere under $RECODE_LIST.]) + fi + + PHP_CHECK_LIBRARY(recode, recode_format_table, + [ + PHP_ADD_LIBRARY_WITH_PATH(recode, $RECODE_DIR/$RECODE_LIB, RECODE_SHARED_LIBADD) + ], [ + old_LDFLAGS=$LDFLAGS + old_LIBS=$LIBS + LDFLAGS="$LDFLAGS -L$RECODE_DIR/$RECODE_LIB" + LIBS="$LIBS -lrecode" + AC_TRY_LINK( + [ +char *program_name; + ],[ +recode_format_table(); + ],[ + PHP_ADD_LIBRARY_DEFER_WITH_PATH(recode, $RECODE_DIR/$RECODE_LIB, RECODE_SHARED_LIBADD) + AC_DEFINE(HAVE_BROKEN_RECODE, 1, [Whether we have librecode 3.5]) + ],[ + AC_MSG_ERROR(I cannot link librecode (-L$RECODE_DIR/$RECODE_LIB -lrecode). Is it installed?) + ]) + LIBS=$old_LIBS + LDFLAGS=$old_LDFLAGS + ], [ + -L$RECODE_DIR/$RECODE_LIB + ]) + + AC_DEFINE(HAVE_LIBRECODE, 1, [Whether we have librecode 3.5 or higher]) + PHP_ADD_INCLUDE($RECODE_DIR/$RECODE_INC) + PHP_SUBST(RECODE_SHARED_LIBADD) + AC_CHECK_HEADERS(stdbool.h) + PHP_NEW_EXTENSION(recode, recode.c, $ext_shared) +fi diff --git a/ext/recode/config9.m4 b/ext/recode/config9.m4 new file mode 100644 index 0000000..66df50e --- /dev/null +++ b/ext/recode/config9.m4 @@ -0,0 +1,18 @@ +dnl +dnl $Id$ +dnl + +dnl Check for extensions with which Recode can not work +if test "$PHP_RECODE" != "no"; then + test "$PHP_IMAP" != "no" && recode_conflict="$recode_conflict imap" + + if test -n "$MYSQL_LIBNAME"; then + PHP_CHECK_LIBRARY($MYSQL_LIBNAME, hash_insert, [ + recode_conflict="$recode_conflict mysql" + ]) + fi + + if test -n "$recode_conflict"; then + AC_MSG_ERROR([recode extension can not be configured together with:$recode_conflict]) + fi +fi diff --git a/ext/recode/php_recode.h b/ext/recode/php_recode.h new file mode 100644 index 0000000..9faa01c --- /dev/null +++ b/ext/recode/php_recode.h @@ -0,0 +1,39 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.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. | + +----------------------------------------------------------------------+ + | Author: Kristian Koehntopp <kris@koehntopp.de> | + +----------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +#ifndef PHP_RECODE_H +#define PHP_RECODE_H + +#if HAVE_LIBRECODE + +extern zend_module_entry recode_module_entry; +#define phpext_recode_ptr &recode_module_entry + +PHP_MINIT_FUNCTION(recode); +PHP_MSHUTDOWN_FUNCTION(recode); +PHP_MINFO_FUNCTION(recode); +PHP_FUNCTION(recode_string); +PHP_FUNCTION(recode_file); + +#else +#define phpext_recode_ptr NULL +#endif + +#endif /* PHP_RECODE_H */ diff --git a/ext/recode/recode.c b/ext/recode/recode.c new file mode 100644 index 0000000..00a7a04 --- /dev/null +++ b/ext/recode/recode.c @@ -0,0 +1,242 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.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. | + +----------------------------------------------------------------------+ + | Author: Kristian Koehntopp <kris@koehntopp.de> | + +----------------------------------------------------------------------+ + */ + +/* $Id: 7203cb24eac014995ca467859ef8dbcf5d315589 $ */ + +/* {{{ includes & prototypes */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "php.h" +#include "php_streams.h" + +#if HAVE_LIBRECODE + +/* For recode 3.5 */ +#if HAVE_BROKEN_RECODE +extern char *program_name; +char *program_name = "php"; +#endif + +#ifdef HAVE_STDBOOL_H +# include <stdbool.h> +#else + typedef enum {false = 0, true = 1} bool; +#endif + +#include <stdio.h> +#include <sys/types.h> +#include <unistd.h> +#include <recode.h> + +#include "php_recode.h" +#include "ext/standard/info.h" +#include "ext/standard/file.h" +#include "ext/standard/php_string.h" + +/* }}} */ + +ZEND_BEGIN_MODULE_GLOBALS(recode) + RECODE_OUTER outer; +ZEND_END_MODULE_GLOBALS(recode) + +#ifdef ZTS +# define ReSG(v) TSRMG(recode_globals_id, zend_recode_globals *, v) +#else +# define ReSG(v) (recode_globals.v) +#endif + +ZEND_DECLARE_MODULE_GLOBALS(recode) +static PHP_GINIT_FUNCTION(recode); + +/* {{{ arginfo */ +ZEND_BEGIN_ARG_INFO_EX(arginfo_recode_string, 0, 0, 2) + ZEND_ARG_INFO(0, request) + ZEND_ARG_INFO(0, str) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_recode_file, 0, 0, 3) + ZEND_ARG_INFO(0, request) + ZEND_ARG_INFO(0, input) + ZEND_ARG_INFO(0, output) +ZEND_END_ARG_INFO() +/* }}} */ + +/* {{{ module stuff */ +static const zend_function_entry php_recode_functions[] = { + PHP_FE(recode_string, arginfo_recode_string) + PHP_FE(recode_file, arginfo_recode_file) + PHP_FALIAS(recode, recode_string, arginfo_recode_string) + PHP_FE_END +}; + +zend_module_entry recode_module_entry = { + STANDARD_MODULE_HEADER, + "recode", + php_recode_functions, + PHP_MINIT(recode), + PHP_MSHUTDOWN(recode), + NULL, + NULL, + PHP_MINFO(recode), + NO_VERSION_YET, + PHP_MODULE_GLOBALS(recode), + PHP_GINIT(recode), + NULL, + NULL, + STANDARD_MODULE_PROPERTIES_EX +}; + +#ifdef COMPILE_DL_RECODE +ZEND_GET_MODULE(recode) +#endif + +static PHP_GINIT_FUNCTION(recode) +{ + recode_globals->outer = NULL; +} + +PHP_MINIT_FUNCTION(recode) +{ + ReSG(outer) = recode_new_outer(false); + if (ReSG(outer) == NULL) { + return FAILURE; + } + + return SUCCESS; +} + +PHP_MSHUTDOWN_FUNCTION(recode) +{ + if (ReSG(outer)) { + recode_delete_outer(ReSG(outer)); + } + return SUCCESS; +} + +PHP_MINFO_FUNCTION(recode) +{ + php_info_print_table_start(); + php_info_print_table_row(2, "Recode Support", "enabled"); + php_info_print_table_row(2, "Revision", "$Id: 7203cb24eac014995ca467859ef8dbcf5d315589 $"); + php_info_print_table_end(); +} + +/* {{{ proto string recode_string(string request, string str) + Recode string str according to request string */ +PHP_FUNCTION(recode_string) +{ + RECODE_REQUEST request = NULL; + char *r = NULL; + size_t r_len = 0, r_alen = 0; + int req_len, str_len; + char *req, *str; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &req, &req_len, &str, &str_len) == FAILURE) { + return; + } + + request = recode_new_request(ReSG(outer)); + + if (request == NULL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot allocate request structure"); + RETURN_FALSE; + } + + if (!recode_scan_request(request, req)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Illegal recode request '%s'", req); + goto error_exit; + } + + recode_buffer_to_buffer(request, str, str_len, &r, &r_len, &r_alen); + if (!r) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Recoding failed."); +error_exit: + RETVAL_FALSE; + } else { + RETVAL_STRINGL(r, r_len, 1); + free(r); + } + + recode_delete_request(request); + + return; +} +/* }}} */ + +/* {{{ proto bool recode_file(string request, resource input, resource output) + Recode file input into file output according to request */ +PHP_FUNCTION(recode_file) +{ + RECODE_REQUEST request = NULL; + char *req; + int req_len; + zval *input, *output; + php_stream *instream, *outstream; + FILE *in_fp, *out_fp; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "srr", &req, &req_len, &input, &output) == FAILURE) { + return; + } + + php_stream_from_zval(instream, &input); + php_stream_from_zval(outstream, &output); + + if (FAILURE == php_stream_cast(instream, PHP_STREAM_AS_STDIO, (void**)&in_fp, REPORT_ERRORS)) { + RETURN_FALSE; + } + + if (FAILURE == php_stream_cast(outstream, PHP_STREAM_AS_STDIO, (void**)&out_fp, REPORT_ERRORS)) { + RETURN_FALSE; + } + + request = recode_new_request(ReSG(outer)); + if (request == NULL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot allocate request structure"); + RETURN_FALSE; + } + + if (!recode_scan_request(request, req)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Illegal recode request '%s'", req); + goto error_exit; + } + + if (!recode_file_to_file(request, in_fp, out_fp)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Recoding failed."); + goto error_exit; + } + + recode_delete_request(request); + RETURN_TRUE; + +error_exit: + recode_delete_request(request); + RETURN_FALSE; +} +/* }}} */ + +#endif + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ |