Annotation of embedaddon/php/ext/gettext/gettext.c, revision 1.1.1.2

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: 
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>