Annotation of embedaddon/php/ext/gettext/gettext.c, revision 1.1.1.3
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | PHP Version 5 |
4: +----------------------------------------------------------------------+
1.1.1.3 ! misho 5: | Copyright (c) 1997-2013 The PHP Group |
1.1 misho 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: Alex Plotnick <alex@wgate.com> |
16: +----------------------------------------------------------------------+
17: */
18:
1.1.1.2 misho 19: /* $Id$ */
1.1 misho 20:
21: #ifdef HAVE_CONFIG_H
22: #include "config.h"
23: #endif
24:
25: #include "php.h"
26:
27: #if HAVE_LIBINTL
28:
29: #include <stdio.h>
30: #include "ext/standard/info.h"
31: #include "php_gettext.h"
32:
33: /* {{{ arginfo */
34: ZEND_BEGIN_ARG_INFO(arginfo_textdomain, 0)
35: ZEND_ARG_INFO(0, domain)
36: ZEND_END_ARG_INFO()
37:
38: ZEND_BEGIN_ARG_INFO(arginfo_gettext, 0)
39: ZEND_ARG_INFO(0, msgid)
40: ZEND_END_ARG_INFO()
41:
42: ZEND_BEGIN_ARG_INFO(arginfo_dgettext, 0)
43: ZEND_ARG_INFO(0, domain_name)
44: ZEND_ARG_INFO(0, msgid)
45: ZEND_END_ARG_INFO()
46:
47: ZEND_BEGIN_ARG_INFO(arginfo_dcgettext, 0)
48: ZEND_ARG_INFO(0, domain_name)
49: ZEND_ARG_INFO(0, msgid)
50: ZEND_ARG_INFO(0, category)
51: ZEND_END_ARG_INFO()
52:
53: ZEND_BEGIN_ARG_INFO(arginfo_bindtextdomain, 0)
54: ZEND_ARG_INFO(0, domain_name)
55: ZEND_ARG_INFO(0, dir)
56: ZEND_END_ARG_INFO()
57:
58: #if HAVE_NGETTEXT
59: ZEND_BEGIN_ARG_INFO(arginfo_ngettext, 0)
60: ZEND_ARG_INFO(0, msgid1)
61: ZEND_ARG_INFO(0, msgid2)
62: ZEND_ARG_INFO(0, count)
63: ZEND_END_ARG_INFO()
64: #endif
65:
66: #if HAVE_DNGETTEXT
67: ZEND_BEGIN_ARG_INFO(arginfo_dngettext, 0)
68: ZEND_ARG_INFO(0, domain)
69: ZEND_ARG_INFO(0, msgid1)
70: ZEND_ARG_INFO(0, msgid2)
71: ZEND_ARG_INFO(0, count)
72: ZEND_END_ARG_INFO()
73: #endif
74:
75: #if HAVE_DCNGETTEXT
76: ZEND_BEGIN_ARG_INFO(arginfo_dcngettext, 0)
77: ZEND_ARG_INFO(0, domain)
78: ZEND_ARG_INFO(0, msgid1)
79: ZEND_ARG_INFO(0, msgid2)
80: ZEND_ARG_INFO(0, count)
81: ZEND_ARG_INFO(0, category)
82: ZEND_END_ARG_INFO()
83: #endif
84:
85: #if HAVE_BIND_TEXTDOMAIN_CODESET
86: ZEND_BEGIN_ARG_INFO(arginfo_bind_textdomain_codeset, 0)
87: ZEND_ARG_INFO(0, domain)
88: ZEND_ARG_INFO(0, codeset)
89: ZEND_END_ARG_INFO()
90: #endif
91: /* }}} */
92:
93: /* {{{ php_gettext_functions[]
94: */
95: const zend_function_entry php_gettext_functions[] = {
96: PHP_NAMED_FE(textdomain, zif_textdomain, arginfo_textdomain)
97: PHP_NAMED_FE(gettext, zif_gettext, arginfo_gettext)
98: /* Alias for gettext() */
99: PHP_NAMED_FE(_, zif_gettext, arginfo_gettext)
100: PHP_NAMED_FE(dgettext, zif_dgettext, arginfo_dgettext)
101: PHP_NAMED_FE(dcgettext, zif_dcgettext, arginfo_dcgettext)
102: PHP_NAMED_FE(bindtextdomain, zif_bindtextdomain, arginfo_bindtextdomain)
103: #if HAVE_NGETTEXT
104: PHP_NAMED_FE(ngettext, zif_ngettext, arginfo_ngettext)
105: #endif
106: #if HAVE_DNGETTEXT
107: PHP_NAMED_FE(dngettext, zif_dngettext, arginfo_dngettext)
108: #endif
109: #if HAVE_DCNGETTEXT
110: PHP_NAMED_FE(dcngettext, zif_dcngettext, arginfo_dcngettext)
111: #endif
112: #if HAVE_BIND_TEXTDOMAIN_CODESET
113: PHP_NAMED_FE(bind_textdomain_codeset, zif_bind_textdomain_codeset, arginfo_bind_textdomain_codeset)
114: #endif
115: PHP_FE_END
116: };
117: /* }}} */
118:
119: #include <libintl.h>
120:
121: zend_module_entry php_gettext_module_entry = {
122: STANDARD_MODULE_HEADER,
123: "gettext",
124: php_gettext_functions,
125: NULL,
126: NULL,
127: NULL,
128: NULL,
129: PHP_MINFO(php_gettext),
130: NO_VERSION_YET,
131: STANDARD_MODULE_PROPERTIES
132: };
133:
134: #ifdef COMPILE_DL_GETTEXT
135: ZEND_GET_MODULE(php_gettext)
136: #endif
137:
138: #define PHP_GETTEXT_MAX_DOMAIN_LENGTH 1024
139: #define PHP_GETTEXT_MAX_MSGID_LENGTH 4096
140:
141: #define PHP_GETTEXT_DOMAIN_LENGTH_CHECK \
142: if (domain_len > PHP_GETTEXT_MAX_DOMAIN_LENGTH) { \
143: php_error_docref(NULL TSRMLS_CC, E_WARNING, "domain passed too long"); \
144: RETURN_FALSE; \
145: }
146:
147: #define PHP_GETTEXT_LENGTH_CHECK(check_name, check_len) \
148: if (check_len > PHP_GETTEXT_MAX_MSGID_LENGTH) { \
149: php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s passed too long", check_name); \
150: RETURN_FALSE; \
151: }
152:
153: PHP_MINFO_FUNCTION(php_gettext)
154: {
155: php_info_print_table_start();
156: php_info_print_table_row(2, "GetText Support", "enabled");
157: php_info_print_table_end();
158: }
159:
160: /* {{{ proto string textdomain(string domain)
161: Set the textdomain to "domain". Returns the current domain */
162: PHP_NAMED_FUNCTION(zif_textdomain)
163: {
164: char *domain, *domain_name, *retval;
165: int domain_len;
166:
167: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &domain, &domain_len) == FAILURE) {
168: return;
169: }
170:
171: PHP_GETTEXT_DOMAIN_LENGTH_CHECK
172:
173: if (strcmp(domain, "") && strcmp(domain, "0")) {
174: domain_name = domain;
175: } else {
176: domain_name = NULL;
177: }
178:
179: retval = textdomain(domain_name);
180:
181: RETURN_STRING(retval, 1);
182: }
183: /* }}} */
184:
185: /* {{{ proto string gettext(string msgid)
186: Return the translation of msgid for the current domain, or msgid unaltered if a translation does not exist */
187: PHP_NAMED_FUNCTION(zif_gettext)
188: {
189: char *msgid, *msgstr;
190: int msgid_len;
191:
192: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &msgid, &msgid_len) == FAILURE) {
193: return;
194: }
195:
196: PHP_GETTEXT_LENGTH_CHECK("msgid", msgid_len)
197: msgstr = gettext(msgid);
198:
199: RETURN_STRING(msgstr, 1);
200: }
201: /* }}} */
202:
203: /* {{{ proto string dgettext(string domain_name, string msgid)
204: Return the translation of msgid for domain_name, or msgid unaltered if a translation does not exist */
205: PHP_NAMED_FUNCTION(zif_dgettext)
206: {
207: char *domain, *msgid, *msgstr;
208: int domain_len, msgid_len;
209:
210: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &domain, &domain_len, &msgid, &msgid_len) == FAILURE) {
211: return;
212: }
213:
214: PHP_GETTEXT_DOMAIN_LENGTH_CHECK
215: PHP_GETTEXT_LENGTH_CHECK("msgid", msgid_len)
216:
217: msgstr = dgettext(domain, msgid);
218:
219: RETURN_STRING(msgstr, 1);
220: }
221: /* }}} */
222:
223: /* {{{ proto string dcgettext(string domain_name, string msgid, long category)
224: Return the translation of msgid for domain_name and category, or msgid unaltered if a translation does not exist */
225: PHP_NAMED_FUNCTION(zif_dcgettext)
226: {
227: char *domain, *msgid, *msgstr;
228: int domain_len, msgid_len;
229: long category;
230:
231: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ssl", &domain, &domain_len, &msgid, &msgid_len, &category) == FAILURE) {
232: return;
233: }
234:
235: PHP_GETTEXT_DOMAIN_LENGTH_CHECK
236: PHP_GETTEXT_LENGTH_CHECK("msgid", msgid_len)
237:
238: msgstr = dcgettext(domain, msgid, category);
239:
240: RETURN_STRING(msgstr, 1);
241: }
242: /* }}} */
243:
244: /* {{{ proto string bindtextdomain(string domain_name, string dir)
245: Bind to the text domain domain_name, looking for translations in dir. Returns the current domain */
246: PHP_NAMED_FUNCTION(zif_bindtextdomain)
247: {
248: char *domain, *dir;
249: int domain_len, dir_len;
250: char *retval, dir_name[MAXPATHLEN];
251:
252: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &domain, &domain_len, &dir, &dir_len) == FAILURE) {
253: return;
254: }
255:
256: PHP_GETTEXT_DOMAIN_LENGTH_CHECK
257:
258: if (domain[0] == '\0') {
259: php_error(E_WARNING, "The first parameter of bindtextdomain must not be empty");
260: RETURN_FALSE;
261: }
262:
263: if (dir[0] != '\0' && strcmp(dir, "0")) {
264: if (!VCWD_REALPATH(dir, dir_name)) {
265: RETURN_FALSE;
266: }
267: } else if (!VCWD_GETCWD(dir_name, MAXPATHLEN)) {
268: RETURN_FALSE;
269: }
270:
271: retval = bindtextdomain(domain, dir_name);
272:
273: RETURN_STRING(retval, 1);
274: }
275: /* }}} */
276:
277: #if HAVE_NGETTEXT
278: /* {{{ proto string ngettext(string MSGID1, string MSGID2, int N)
279: Plural version of gettext() */
280: PHP_NAMED_FUNCTION(zif_ngettext)
281: {
282: char *msgid1, *msgid2, *msgstr;
283: int msgid1_len, msgid2_len;
284: long count;
285:
286: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ssl", &msgid1, &msgid1_len, &msgid2, &msgid2_len, &count) == FAILURE) {
287: return;
288: }
289:
290: PHP_GETTEXT_LENGTH_CHECK("msgid1", msgid1_len)
291: PHP_GETTEXT_LENGTH_CHECK("msgid2", msgid2_len)
292:
293: msgstr = ngettext(msgid1, msgid2, count);
294: if (msgstr) {
295: RETVAL_STRING(msgstr, 1);
296: }
297: }
298: /* }}} */
299: #endif
300:
301: #if HAVE_DNGETTEXT
302: /* {{{ proto string dngettext (string domain, string msgid1, string msgid2, int count)
303: Plural version of dgettext() */
304: PHP_NAMED_FUNCTION(zif_dngettext)
305: {
306: char *domain, *msgid1, *msgid2, *msgstr = NULL;
307: int domain_len, msgid1_len, msgid2_len;
308: long count;
309:
310: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sssl", &domain, &domain_len,
311: &msgid1, &msgid1_len, &msgid2, &msgid2_len, &count) == FAILURE) {
312: return;
313: }
314:
315: PHP_GETTEXT_DOMAIN_LENGTH_CHECK
316: PHP_GETTEXT_LENGTH_CHECK("msgid1", msgid1_len)
317: PHP_GETTEXT_LENGTH_CHECK("msgid2", msgid2_len)
318:
319: msgstr = dngettext(domain, msgid1, msgid2, count);
320: if (msgstr) {
321: RETVAL_STRING(msgstr, 1);
322: }
323: }
324: /* }}} */
325: #endif
326:
327: #if HAVE_DCNGETTEXT
328: /* {{{ proto string dcngettext (string domain, string msgid1, string msgid2, int n, int category)
329: Plural version of dcgettext() */
330: PHP_NAMED_FUNCTION(zif_dcngettext)
331: {
332: char *domain, *msgid1, *msgid2, *msgstr = NULL;
333: int domain_len, msgid1_len, msgid2_len;
334: long count, category;
335:
336: RETVAL_FALSE;
337:
338: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sssll", &domain, &domain_len,
339: &msgid1, &msgid1_len, &msgid2, &msgid2_len, &count, &category) == FAILURE) {
340: return;
341: }
342:
343: PHP_GETTEXT_DOMAIN_LENGTH_CHECK
344: PHP_GETTEXT_LENGTH_CHECK("msgid1", msgid1_len)
345: PHP_GETTEXT_LENGTH_CHECK("msgid2", msgid2_len)
346:
347: msgstr = dcngettext(domain, msgid1, msgid2, count, category);
348:
349: if (msgstr) {
350: RETVAL_STRING(msgstr, 1);
351: }
352: }
353: /* }}} */
354: #endif
355:
356: #if HAVE_BIND_TEXTDOMAIN_CODESET
357:
358: /* {{{ proto string bind_textdomain_codeset (string domain, string codeset)
359: Specify the character encoding in which the messages from the DOMAIN message catalog will be returned. */
360: PHP_NAMED_FUNCTION(zif_bind_textdomain_codeset)
361: {
362: char *domain, *codeset, *retval = NULL;
363: int domain_len, codeset_len;
364:
365: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &domain, &domain_len, &codeset, &codeset_len) == FAILURE) {
366: return;
367: }
368:
369: PHP_GETTEXT_DOMAIN_LENGTH_CHECK
370:
371: retval = bind_textdomain_codeset(domain, codeset);
372:
373: if (!retval) {
374: RETURN_FALSE;
375: }
376: RETURN_STRING(retval, 1);
377: }
378: /* }}} */
379: #endif
380:
381:
382: #endif /* HAVE_LIBINTL */
383:
384: /*
385: * Local variables:
386: * tab-width: 4
387: * c-basic-offset: 4
388: * End:
389: * vim600: sw=4 ts=4 fdm=marker
390: * vim<600: sw=4 ts=4
391: */
392:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>