From: Wez Furlong Date: Sat, 13 Aug 2005 13:43:31 +0000 (+0000) Subject: Fixup config.w32. X-Git-Tag: PRE_NEW_OCI8_EXTENSION~278 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=57ae2f99b70867b10eae0492ae0d4670cb15018b;p=php Fixup config.w32. Implement unicode_decode() and unicode_encode(), as described in README.UNICODE. Still need to decide how to handle errors here, since there is no error return, and a conversion error is not necessarily fatal. --- diff --git a/ext/unicode/config.w32 b/ext/unicode/config.w32 index bc09b26102..d40047f023 100644 --- a/ext/unicode/config.w32 +++ b/ext/unicode/config.w32 @@ -1,9 +1,8 @@ // $Id$ // vim:ft=javascript -ARG_ENABLE('unicode' , 'ICU API extension', 'no'); -if (PHP_UNICODE) { - +ARG_ENABLE('unicode' , 'ICU API extension', 'yes'); +if (PHP_UNICODE != 'no') { EXTENSION("unicode", "unicode.c unicode_filter.c locale.c"); AC_DEFINE('HAVE_UNICODE', 1, 'ICU API extension'); } diff --git a/ext/unicode/unicode.c b/ext/unicode/unicode.c index 974f7135e1..be938685e8 100644 --- a/ext/unicode/unicode.c +++ b/ext/unicode/unicode.c @@ -11,19 +11,101 @@ | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Andrei Zmievski | + | Wez Furlong | +----------------------------------------------------------------------+ */ /* $Id$ */ #include "php_unicode.h" - #if HAVE_UNICODE +#include "zend_unicode.h" + +/* {{{ proto unicode unicode_decode(string $input, string $encoding) + Takes a string in the souce encoding and converts it to a UTF-16 unicode string, returning the result */ +static PHP_FUNCTION(unicode_decode) +{ + union { + void *vptr; + char *bin; + } input; + zend_uchar type; + int len; + char *encoding; + int enclen; + UErrorCode status; + UConverter *conv = NULL; + UChar *target; + int32_t targetlen; + + if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ts", &input.vptr, &len, &type, &encoding, &enclen)) { + return; + } + + if (type == IS_UNICODE) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "input string is already unicode"); + RETURN_FALSE; + } + status = U_ZERO_ERROR; + conv = ucnv_open(encoding, &status); + if (!conv) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "could not locate converter for %s", encoding); + RETURN_FALSE; + } + + status = U_ZERO_ERROR; + zend_convert_to_unicode(conv, &target, &targetlen, input.bin, len, &status); + if (U_FAILURE(status)) { + /* TODO: error handling semantics ? */ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "conversion was not entirely successful: %d", status); + } + RETVAL_UNICODEL(target, targetlen, 0); + + ucnv_close(conv); +} +/* }}} */ + +/* {{{ proto string unicode_encode(unicode $input, string $encoding) + Takes a unicode string and converts it to a string in the specified encoding */ +static PHP_FUNCTION(unicode_encode) +{ + UChar *uni; + int len; + char *encoding; + int enclen; + UErrorCode status; + UConverter *conv = NULL; + char *target; + int32_t targetlen; + + if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "us", &uni, &len, &encoding, &enclen)) { + return; + } + + status = U_ZERO_ERROR; + conv = ucnv_open(encoding, &status); + if (!conv) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "could not locate converter for %s", encoding); + RETURN_FALSE; + } + + status = U_ZERO_ERROR; + zend_convert_from_unicode(conv, &target, &targetlen, uni, len, &status); + if (U_FAILURE(status)) { + /* TODO: error handling semantics ? */ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "conversion was not entirely successful: %d", status); + } + RETVAL_STRINGL(target, targetlen, 0); + + ucnv_close(conv); +} /* {{{ unicode_functions[] */ function_entry unicode_functions[] = { PHP_FE(icu_loc_get_default, NULL) PHP_FE(icu_loc_set_default, NULL) + PHP_FE(unicode_decode, NULL) + PHP_FE(unicode_encode, NULL) { NULL, NULL, NULL } }; /* }}} */