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>