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>