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

1.1     ! misho       1: /*
        !             2:    +----------------------------------------------------------------------+
        !             3:    | PHP Version 5                                                        |
        !             4:    +----------------------------------------------------------------------+
        !             5:    | This source file is subject to version 3.01 of the PHP license,      |
        !             6:    | that is bundled with this package in the file LICENSE, and is        |
        !             7:    | available through the world-wide-web at the following url:           |
        !             8:    | http://www.php.net/license/3_01.txt                                  |
        !             9:    | If you did not receive a copy of the PHP license and are unable to   |
        !            10:    | obtain it through the world-wide-web, please send a note to          |
        !            11:    | license@php.net so we can mail you a copy immediately.               |
        !            12:    +----------------------------------------------------------------------+
        !            13:    | Authors: Stanislav Malyshev <stas@zend.com>                          |
        !            14:    +----------------------------------------------------------------------+
        !            15:  */
        !            16: 
        !            17: #ifdef HAVE_CONFIG_H
        !            18: #include "config.h"
        !            19: #endif
        !            20: 
        !            21: #include <unicode/ustring.h>
        !            22: 
        !            23: #include "php_intl.h"
        !            24: #include "msgformat_class.h"
        !            25: #include "msgformat_parse.h"
        !            26: #include "msgformat_data.h"
        !            27: #include "msgformat_helpers.h"
        !            28: #include "intl_convert.h"
        !            29: 
        !            30: /* {{{ */
        !            31: static void msgfmt_do_parse(MessageFormatter_object *mfo, char *source, int src_len, zval *return_value TSRMLS_DC) 
        !            32: {
        !            33:        zval **fargs;
        !            34:        int count = 0;
        !            35:        int i;
        !            36:        UChar *usource = NULL;
        !            37:        int usrc_len = 0;
        !            38: 
        !            39:        intl_convert_utf8_to_utf16(&usource, &usrc_len, source, src_len, &INTL_DATA_ERROR_CODE(mfo));
        !            40:        INTL_METHOD_CHECK_STATUS(mfo, "Converting parse string failed");
        !            41: 
        !            42:        umsg_parse_helper(MSG_FORMAT_OBJECT(mfo), &count, &fargs, usource, usrc_len, &INTL_DATA_ERROR_CODE(mfo));
        !            43:        if (usource) {
        !            44:                efree(usource);
        !            45:        }
        !            46:        INTL_METHOD_CHECK_STATUS(mfo, "Parsing failed");
        !            47: 
        !            48:        array_init(return_value);
        !            49:        for(i=0;i<count;i++) {
        !            50:                add_next_index_zval(return_value, fargs[i]);
        !            51:        }
        !            52:        efree(fargs);
        !            53: }
        !            54: /* }}} */
        !            55: 
        !            56: /* {{{ proto array MessageFormatter::parse( string $source )
        !            57:  * Parse a message }}} */
        !            58: /* {{{ proto array msgfmt_parse( MessageFormatter $nf, string $source )
        !            59:  * Parse a message.
        !            60:  */
        !            61: PHP_FUNCTION( msgfmt_parse )
        !            62: {
        !            63:        char *source;
        !            64:        int source_len;
        !            65:        MSG_FORMAT_METHOD_INIT_VARS;
        !            66: 
        !            67: 
        !            68:        /* Parse parameters. */
        !            69:        if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",
        !            70:                &object, MessageFormatter_ce_ptr,  &source, &source_len ) == FAILURE )
        !            71:        {
        !            72:                intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
        !            73:                        "msgfmt_parse: unable to parse input params", 0 TSRMLS_CC );
        !            74: 
        !            75:                RETURN_FALSE;
        !            76:        }
        !            77: 
        !            78:        /* Fetch the object. */
        !            79:        MSG_FORMAT_METHOD_FETCH_OBJECT;
        !            80: 
        !            81:        msgfmt_do_parse(mfo, source, source_len, return_value TSRMLS_CC);
        !            82: }
        !            83: /* }}} */
        !            84: 
        !            85: /* {{{ proto array MessageFormatter::formatMessage( string $locale, string $pattern, string $source )
        !            86:  * Parse a message. }}} */
        !            87: /* {{{ proto array numfmt_parse_message( string $locale, string $pattern, string $source )
        !            88:  * Parse a message.
        !            89:  */
        !            90: PHP_FUNCTION( msgfmt_parse_message )
        !            91: {
        !            92:        UChar      *spattern = NULL;
        !            93:        int         spattern_len = 0;
        !            94:        char       *pattern = NULL;
        !            95:        int         pattern_len = 0;
        !            96:        char       *slocale = NULL;
        !            97:        int         slocale_len = 0;
        !            98:        char       *source = NULL;
        !            99:        int         src_len = 0;
        !           100:        MessageFormatter_object mf = {0};
        !           101:        MessageFormatter_object *mfo = &mf;
        !           102: 
        !           103:        /* Parse parameters. */
        !           104:        if( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "sss",
        !           105:                  &slocale, &slocale_len, &pattern, &pattern_len, &source, &src_len ) == FAILURE )
        !           106:        {
        !           107:                intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
        !           108:                        "msgfmt_parse_message: unable to parse input params", 0 TSRMLS_CC );
        !           109: 
        !           110:                RETURN_FALSE;
        !           111:        }
        !           112: 
        !           113:        msgformat_data_init(&mfo->mf_data TSRMLS_CC);
        !           114: 
        !           115:        if(pattern && pattern_len) {
        !           116:                intl_convert_utf8_to_utf16(&spattern, &spattern_len, pattern, pattern_len, &INTL_DATA_ERROR_CODE(mfo));
        !           117:                if( U_FAILURE(INTL_DATA_ERROR_CODE((mfo))) )
        !           118:                {
        !           119:                        intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
        !           120:                                "msgfmt_parse_message: error converting pattern to UTF-16", 0 TSRMLS_CC );
        !           121:                        RETURN_FALSE;
        !           122:                }
        !           123:        } else {
        !           124:                spattern_len = 0;
        !           125:                spattern = NULL;
        !           126:        }
        !           127: 
        !           128:        if(slocale_len == 0) {
        !           129:                slocale = INTL_G(default_locale);
        !           130:        }
        !           131: 
        !           132:        if(msgformat_fix_quotes(&spattern, &spattern_len, &INTL_DATA_ERROR_CODE(mfo)) != SUCCESS) {
        !           133:                intl_error_set( NULL, U_INVALID_FORMAT_ERROR,
        !           134:                        "msgfmt_parse_message: error converting pattern to quote-friendly format", 0 TSRMLS_CC );
        !           135:                RETURN_FALSE;
        !           136:        }
        !           137: 
        !           138:        /* Create an ICU message formatter. */
        !           139:        MSG_FORMAT_OBJECT(mfo) = umsg_open(spattern, spattern_len, slocale, NULL, &INTL_DATA_ERROR_CODE(mfo));
        !           140:        if(spattern && spattern_len) {
        !           141:                efree(spattern);
        !           142:        }
        !           143:        INTL_METHOD_CHECK_STATUS(mfo, "Creating message formatter failed");
        !           144: 
        !           145:        msgfmt_do_parse(mfo, source, src_len, return_value TSRMLS_CC);
        !           146: 
        !           147:        /* drop the temporary formatter */
        !           148:        msgformat_data_free(&mfo->mf_data TSRMLS_CC);
        !           149: }
        !           150: /* }}} */
        !           151: 
        !           152: /*
        !           153:  * Local variables:
        !           154:  * tab-width: 4
        !           155:  * c-basic-offset: 4
        !           156:  * End:
        !           157:  * vim600: noet sw=4 ts=4 fdm=marker
        !           158:  * vim<600: noet sw=4 ts=4
        !           159:  */

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