Annotation of embedaddon/php/ext/intl/idn/idn.c, revision 1.1

1.1     ! misho       1: /*
        !             2:    +----------------------------------------------------------------------+
        !             3:    | PHP Version 5                                                        |
        !             4:    +----------------------------------------------------------------------+
        !             5:    | Copyright (c) 2009 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: Pierre A. Joye <pierre@php.net>                              |
        !            16:    +----------------------------------------------------------------------+
        !            17:  */
        !            18: /* $Id: idn.c 314218 2011-08-04 00:59:43Z felipe $ */
        !            19: 
        !            20: /* {{{ includes */
        !            21: #ifdef HAVE_CONFIG_H
        !            22: #include "config.h"
        !            23: #endif
        !            24: 
        !            25: #include <php.h>
        !            26: 
        !            27: #include <unicode/uidna.h>
        !            28: #include <unicode/ustring.h>
        !            29: #include "ext/standard/php_string.h"
        !            30: 
        !            31: #include "intl_error.h"
        !            32:  #include "intl_convert.h"
        !            33: /* }}} */
        !            34: 
        !            35: /* {{{ grapheme_register_constants
        !            36:  * Register API constants
        !            37:  */
        !            38: void idn_register_constants( INIT_FUNC_ARGS )
        !            39: {
        !            40:        /* Option to prohibit processing of unassigned codepoints in the input and
        !            41:           do not check if the input conforms to STD-3 ASCII rules. */
        !            42:        REGISTER_LONG_CONSTANT("IDNA_DEFAULT", UIDNA_DEFAULT, CONST_CS | CONST_PERSISTENT);
        !            43: 
        !            44:        /* Option to allow processing of unassigned codepoints in the input */
        !            45:        REGISTER_LONG_CONSTANT("IDNA_ALLOW_UNASSIGNED", UIDNA_ALLOW_UNASSIGNED, CONST_CS | CONST_PERSISTENT);
        !            46: 
        !            47:        /* Option to check if input conforms to STD-3 ASCII rules */
        !            48:        REGISTER_LONG_CONSTANT("IDNA_USE_STD3_RULES", UIDNA_USE_STD3_RULES, CONST_CS | CONST_PERSISTENT);
        !            49: }
        !            50: /* }}} */
        !            51: 
        !            52: enum {
        !            53:        INTL_IDN_TO_ASCII = 0,
        !            54:        INTL_IDN_TO_UTF8
        !            55: };
        !            56: 
        !            57: static void php_intl_idn_to(INTERNAL_FUNCTION_PARAMETERS, int mode)
        !            58: {
        !            59:        unsigned char* domain;
        !            60:        int domain_len;
        !            61:        long option = 0;
        !            62:        UChar* ustring = NULL;
        !            63:        int ustring_len = 0;
        !            64:        UErrorCode status;
        !            65:        char     *converted_utf8;
        !            66:        int32_t   converted_utf8_len;
        !            67:        UChar     converted[MAXPATHLEN];
        !            68:        int32_t   converted_ret_len;
        !            69: 
        !            70:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", (char **)&domain, &domain_len, &option) == FAILURE) {
        !            71:                return;
        !            72:        }
        !            73: 
        !            74:        if (domain_len < 1) {
        !            75:                intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "idn_to_ascii: empty domain name", 0 TSRMLS_CC );
        !            76:                RETURN_FALSE;
        !            77:        }
        !            78: 
        !            79:        /* convert the string to UTF-16. */
        !            80:        status = U_ZERO_ERROR;
        !            81:        intl_convert_utf8_to_utf16(&ustring, &ustring_len, (char*) domain, domain_len, &status );
        !            82: 
        !            83:        if (U_FAILURE(status)) {
        !            84:                intl_error_set_code(NULL, status TSRMLS_CC);
        !            85: 
        !            86:                /* Set error messages. */
        !            87:                intl_error_set_custom_msg( NULL, "Error converting input string to UTF-16", 0 TSRMLS_CC );
        !            88:                if (ustring) {
        !            89:                        efree(ustring);
        !            90:                }
        !            91:                RETURN_FALSE;
        !            92:        } else {
        !            93:                UParseError parse_error;
        !            94: 
        !            95:                status = U_ZERO_ERROR;
        !            96:                if (mode == INTL_IDN_TO_ASCII) {
        !            97:                        converted_ret_len = uidna_IDNToASCII(ustring, ustring_len, converted, MAXPATHLEN, (int32_t)option, &parse_error, &status);
        !            98:                } else {
        !            99:                        converted_ret_len = uidna_IDNToUnicode(ustring, ustring_len, converted, MAXPATHLEN, (int32_t)option, &parse_error, &status);
        !           100:                }
        !           101:                efree(ustring);
        !           102: 
        !           103:                if (U_FAILURE(status)) {
        !           104:                        intl_error_set( NULL, status, "idn_to_ascii: cannot convert to ASCII", 0 TSRMLS_CC );
        !           105:                        RETURN_FALSE;
        !           106:                }
        !           107: 
        !           108:                status = U_ZERO_ERROR;
        !           109:                intl_convert_utf16_to_utf8(&converted_utf8, &converted_utf8_len, converted, converted_ret_len, &status);
        !           110: 
        !           111:                if (U_FAILURE(status)) {
        !           112:                        /* Set global error code. */
        !           113:                        intl_error_set_code(NULL, status TSRMLS_CC);
        !           114: 
        !           115:                        /* Set error messages. */
        !           116:                        intl_error_set_custom_msg( NULL, "Error converting output string to UTF-8", 0 TSRMLS_CC );
        !           117:                        efree(converted_utf8);
        !           118:                        RETURN_FALSE;
        !           119:                }
        !           120:        }
        !           121: 
        !           122:        /* return the allocated string, not a duplicate */
        !           123:        RETURN_STRINGL(((char *)converted_utf8), converted_utf8_len, 0);
        !           124: }
        !           125: 
        !           126: /* {{{ proto int idn_to_ascii(string domain[, int options])
        !           127:    Converts an Unicode domain to ASCII representation, as defined in the IDNA RFC */
        !           128: PHP_FUNCTION(idn_to_ascii)
        !           129: {
        !           130:        php_intl_idn_to(INTERNAL_FUNCTION_PARAM_PASSTHRU, INTL_IDN_TO_ASCII);
        !           131: }
        !           132: /* }}} */
        !           133: 
        !           134: 
        !           135: /* {{{ proto int idn_to_utf8(string domain[, int options])
        !           136:    Converts an ASCII representation of the domain to Unicode (UTF-8), as defined in the IDNA RFC */
        !           137: PHP_FUNCTION(idn_to_utf8)
        !           138: {
        !           139:        php_intl_idn_to(INTERNAL_FUNCTION_PARAM_PASSTHRU, INTL_IDN_TO_UTF8);
        !           140: }
        !           141: /* }}} */
        !           142: 
        !           143: 
        !           144: /*
        !           145:  * Local variables:
        !           146:  * tab-width: 4
        !           147:  * c-basic-offset: 4
        !           148:  * End:
        !           149:  * vim600: fdm=marker
        !           150:  * vim: noet sw=4 ts=4
        !           151:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>