Annotation of embedaddon/php/ext/recode/recode.c, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | PHP Version 5 |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 1997-2012 The PHP Group |
! 6: +----------------------------------------------------------------------+
! 7: | This source file is subject to version 3.01 of the PHP license, |
! 8: | that is bundled with this package in the file LICENSE, and is |
! 9: | available through the world-wide-web at the following url: |
! 10: | http://www.php.net/license/3_01.txt |
! 11: | If you did not receive a copy of the PHP license and are unable to |
! 12: | obtain it through the world-wide-web, please send a note to |
! 13: | license@php.net so we can mail you a copy immediately. |
! 14: +----------------------------------------------------------------------+
! 15: | Author: Kristian Koehntopp <kris@koehntopp.de> |
! 16: +----------------------------------------------------------------------+
! 17: */
! 18:
! 19: /* $Id: recode.c 321634 2012-01-01 13:15:04Z felipe $ */
! 20:
! 21: /* {{{ includes & prototypes */
! 22:
! 23: #ifdef HAVE_CONFIG_H
! 24: #include "config.h"
! 25: #endif
! 26:
! 27: #include "php.h"
! 28: #include "php_streams.h"
! 29:
! 30: #if HAVE_LIBRECODE
! 31:
! 32: /* For recode 3.5 */
! 33: #if HAVE_BROKEN_RECODE
! 34: extern char *program_name;
! 35: char *program_name = "php";
! 36: #endif
! 37:
! 38: #ifdef HAVE_STDBOOL_H
! 39: # include <stdbool.h>
! 40: #else
! 41: typedef enum {false = 0, true = 1} bool;
! 42: #endif
! 43:
! 44: #include <stdio.h>
! 45: #include <sys/types.h>
! 46: #include <unistd.h>
! 47: #include <recode.h>
! 48:
! 49: #include "php_recode.h"
! 50: #include "ext/standard/info.h"
! 51: #include "ext/standard/file.h"
! 52: #include "ext/standard/php_string.h"
! 53:
! 54: /* }}} */
! 55:
! 56: ZEND_BEGIN_MODULE_GLOBALS(recode)
! 57: RECODE_OUTER outer;
! 58: ZEND_END_MODULE_GLOBALS(recode)
! 59:
! 60: #ifdef ZTS
! 61: # define ReSG(v) TSRMG(recode_globals_id, zend_recode_globals *, v)
! 62: #else
! 63: # define ReSG(v) (recode_globals.v)
! 64: #endif
! 65:
! 66: ZEND_DECLARE_MODULE_GLOBALS(recode);
! 67: static PHP_GINIT_FUNCTION(recode);
! 68:
! 69: /* {{{ arginfo */
! 70: ZEND_BEGIN_ARG_INFO_EX(arginfo_recode_string, 0, 0, 2)
! 71: ZEND_ARG_INFO(0, request)
! 72: ZEND_ARG_INFO(0, str)
! 73: ZEND_END_ARG_INFO()
! 74:
! 75: ZEND_BEGIN_ARG_INFO_EX(arginfo_recode_file, 0, 0, 3)
! 76: ZEND_ARG_INFO(0, request)
! 77: ZEND_ARG_INFO(0, input)
! 78: ZEND_ARG_INFO(0, output)
! 79: ZEND_END_ARG_INFO()
! 80: /* }}} */
! 81:
! 82: /* {{{ module stuff */
! 83: static const zend_function_entry php_recode_functions[] = {
! 84: PHP_FE(recode_string, arginfo_recode_string)
! 85: PHP_FE(recode_file, arginfo_recode_file)
! 86: PHP_FALIAS(recode, recode_string, arginfo_recode_string)
! 87: PHP_FE_END
! 88: };
! 89:
! 90: zend_module_entry recode_module_entry = {
! 91: STANDARD_MODULE_HEADER,
! 92: "recode",
! 93: php_recode_functions,
! 94: PHP_MINIT(recode),
! 95: PHP_MSHUTDOWN(recode),
! 96: NULL,
! 97: NULL,
! 98: PHP_MINFO(recode),
! 99: NO_VERSION_YET,
! 100: PHP_MODULE_GLOBALS(recode),
! 101: PHP_GINIT(recode),
! 102: NULL,
! 103: NULL,
! 104: STANDARD_MODULE_PROPERTIES_EX
! 105: };
! 106:
! 107: #ifdef COMPILE_DL_RECODE
! 108: ZEND_GET_MODULE(recode)
! 109: #endif
! 110:
! 111: static PHP_GINIT_FUNCTION(recode)
! 112: {
! 113: recode_globals->outer = NULL;
! 114: }
! 115:
! 116: PHP_MINIT_FUNCTION(recode)
! 117: {
! 118: ReSG(outer) = recode_new_outer(false);
! 119: if (ReSG(outer) == NULL) {
! 120: return FAILURE;
! 121: }
! 122:
! 123: return SUCCESS;
! 124: }
! 125:
! 126: PHP_MSHUTDOWN_FUNCTION(recode)
! 127: {
! 128: if (ReSG(outer)) {
! 129: recode_delete_outer(ReSG(outer));
! 130: }
! 131: return SUCCESS;
! 132: }
! 133:
! 134: PHP_MINFO_FUNCTION(recode)
! 135: {
! 136: php_info_print_table_start();
! 137: php_info_print_table_row(2, "Recode Support", "enabled");
! 138: php_info_print_table_row(2, "Revision", "$Revision: 321634 $");
! 139: php_info_print_table_end();
! 140: }
! 141:
! 142: /* {{{ proto string recode_string(string request, string str)
! 143: Recode string str according to request string */
! 144: PHP_FUNCTION(recode_string)
! 145: {
! 146: RECODE_REQUEST request = NULL;
! 147: char *r = NULL;
! 148: size_t r_len = 0, r_alen = 0;
! 149: int req_len, str_len;
! 150: char *req, *str;
! 151:
! 152: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &req, &req_len, &str, &str_len) == FAILURE) {
! 153: return;
! 154: }
! 155:
! 156: request = recode_new_request(ReSG(outer));
! 157:
! 158: if (request == NULL) {
! 159: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot allocate request structure");
! 160: RETURN_FALSE;
! 161: }
! 162:
! 163: if (!recode_scan_request(request, req)) {
! 164: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Illegal recode request '%s'", req);
! 165: goto error_exit;
! 166: }
! 167:
! 168: recode_buffer_to_buffer(request, str, str_len, &r, &r_len, &r_alen);
! 169: if (!r) {
! 170: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Recoding failed.");
! 171: error_exit:
! 172: RETVAL_FALSE;
! 173: } else {
! 174: RETVAL_STRINGL(r, r_len, 1);
! 175: free(r);
! 176: }
! 177:
! 178: recode_delete_request(request);
! 179:
! 180: return;
! 181: }
! 182: /* }}} */
! 183:
! 184: /* {{{ proto bool recode_file(string request, resource input, resource output)
! 185: Recode file input into file output according to request */
! 186: PHP_FUNCTION(recode_file)
! 187: {
! 188: RECODE_REQUEST request = NULL;
! 189: char *req;
! 190: int req_len;
! 191: zval *input, *output;
! 192: php_stream *instream, *outstream;
! 193: FILE *in_fp, *out_fp;
! 194:
! 195: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "srr", &req, &req_len, &input, &output) == FAILURE) {
! 196: return;
! 197: }
! 198:
! 199: php_stream_from_zval(instream, &input);
! 200: php_stream_from_zval(outstream, &output);
! 201:
! 202: if (FAILURE == php_stream_cast(instream, PHP_STREAM_AS_STDIO, (void**)&in_fp, REPORT_ERRORS)) {
! 203: RETURN_FALSE;
! 204: }
! 205:
! 206: if (FAILURE == php_stream_cast(outstream, PHP_STREAM_AS_STDIO, (void**)&out_fp, REPORT_ERRORS)) {
! 207: RETURN_FALSE;
! 208: }
! 209:
! 210: request = recode_new_request(ReSG(outer));
! 211: if (request == NULL) {
! 212: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot allocate request structure");
! 213: RETURN_FALSE;
! 214: }
! 215:
! 216: if (!recode_scan_request(request, req)) {
! 217: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Illegal recode request '%s'", req);
! 218: goto error_exit;
! 219: }
! 220:
! 221: if (!recode_file_to_file(request, in_fp, out_fp)) {
! 222: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Recoding failed.");
! 223: goto error_exit;
! 224: }
! 225:
! 226: recode_delete_request(request);
! 227: RETURN_TRUE;
! 228:
! 229: error_exit:
! 230: recode_delete_request(request);
! 231: RETURN_FALSE;
! 232: }
! 233: /* }}} */
! 234:
! 235: #endif
! 236:
! 237: /*
! 238: * Local variables:
! 239: * tab-width: 4
! 240: * c-basic-offset: 4
! 241: * End:
! 242: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>