Annotation of embedaddon/php/ext/gettext/gettext.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: Alex Plotnick <alex@wgate.com> |
! 16: +----------------------------------------------------------------------+
! 17: */
! 18:
! 19: /* $Id: gettext.c 321634 2012-01-01 13:15:04Z felipe $ */
! 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>