Annotation of embedaddon/php/ext/recode/recode.c, revision 1.1.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>