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>