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 "php_intl.h" 22#include "msgformat_class.h" 23#include "msgformat_attr.h" 24#include "intl_convert.h" 25 26#include <unicode/ustring.h> 27 28 29/* {{{ proto string MessageFormatter::getPattern( ) 30 * Get formatter pattern. }}} */ 31/* {{{ proto string msgfmt_get_pattern( MessageFormatter $mf ) 32 * Get formatter pattern. 33 */ 34PHP_FUNCTION( msgfmt_get_pattern ) 35{ 36 MSG_FORMAT_METHOD_INIT_VARS; 37 38 /* Parse parameters. */ 39 if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, MessageFormatter_ce_ptr ) == FAILURE ) 40 { 41 intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, 42 "msgfmt_get_pattern: unable to parse input params", 0 TSRMLS_CC ); 43 RETURN_FALSE; 44 } 45 46 /* Fetch the object. */ 47 MSG_FORMAT_METHOD_FETCH_OBJECT; 48 49 if(mfo->mf_data.orig_format) { 50 RETURN_STRINGL(mfo->mf_data.orig_format, mfo->mf_data.orig_format_len, 1); 51 } 52 53 RETURN_FALSE; 54} 55/* }}} */ 56 57/* {{{ proto bool MessageFormatter::setPattern( string $pattern ) 58 * Set formatter pattern. }}} */ 59/* {{{ proto bool msgfmt_set_pattern( MessageFormatter $mf, string $pattern ) 60 * Set formatter pattern. 61 */ 62PHP_FUNCTION( msgfmt_set_pattern ) 63{ 64 char* value = NULL; 65 int value_len = 0; 66 int spattern_len = 0; 67 UChar* spattern = NULL; 68 MSG_FORMAT_METHOD_INIT_VARS; 69 70 /* Parse parameters. */ 71 if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", 72 &object, MessageFormatter_ce_ptr, &value, &value_len ) == FAILURE ) 73 { 74 intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, 75 "msgfmt_set_pattern: unable to parse input params", 0 TSRMLS_CC); 76 RETURN_FALSE; 77 } 78 79 MSG_FORMAT_METHOD_FETCH_OBJECT; 80 81 /* Convert given pattern to UTF-16. */ 82 intl_convert_utf8_to_utf16(&spattern, &spattern_len, value, value_len, &INTL_DATA_ERROR_CODE(mfo)); 83 INTL_METHOD_CHECK_STATUS(mfo, "Error converting pattern to UTF-16" ); 84 85#ifdef MSG_FORMAT_QUOTE_APOS 86 if(msgformat_fix_quotes(&spattern, &spattern_len, &INTL_DATA_ERROR_CODE(mfo)) != SUCCESS) { 87 intl_error_set( NULL, U_INVALID_FORMAT_ERROR, 88 "msgfmt_set_pattern: error converting pattern to quote-friendly format", 0 TSRMLS_CC ); 89 RETURN_FALSE; 90 } 91#endif 92 93 /* TODO: add parse error information */ 94 umsg_applyPattern(MSG_FORMAT_OBJECT(mfo), spattern, spattern_len, NULL, &INTL_DATA_ERROR_CODE(mfo)); 95 if (spattern) { 96 efree(spattern); 97 } 98 INTL_METHOD_CHECK_STATUS(mfo, "Error setting symbol value"); 99 100 if(mfo->mf_data.orig_format) { 101 efree(mfo->mf_data.orig_format); 102 } 103 mfo->mf_data.orig_format = estrndup(value, value_len); 104 mfo->mf_data.orig_format_len = value_len; 105 /* invalidate cached format types */ 106 if (mfo->mf_data.arg_types) { 107 zend_hash_destroy(mfo->mf_data.arg_types); 108 efree(mfo->mf_data.arg_types); 109 mfo->mf_data.arg_types = NULL; 110 } 111 112 RETURN_TRUE; 113} 114/* }}} */ 115 116/* {{{ proto string MessageFormatter::getLocale() 117 * Get formatter locale. }}} */ 118/* {{{ proto string msgfmt_get_locale(MessageFormatter $mf) 119 * Get formatter locale. 120 */ 121PHP_FUNCTION( msgfmt_get_locale ) 122{ 123 char *loc; 124 MSG_FORMAT_METHOD_INIT_VARS; 125 126 /* Parse parameters. */ 127 if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", 128 &object, MessageFormatter_ce_ptr ) == FAILURE ) 129 { 130 intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, 131 "msgfmt_get_locale: unable to parse input params", 0 TSRMLS_CC ); 132 133 RETURN_FALSE; 134 } 135 136 /* Fetch the object. */ 137 MSG_FORMAT_METHOD_FETCH_OBJECT; 138 139 loc = (char *)umsg_getLocale(MSG_FORMAT_OBJECT(mfo)); 140 RETURN_STRING(loc, 1); 141} 142/* }}} */ 143 144/* 145 * Local variables: 146 * tab-width: 4 147 * c-basic-offset: 4 148 * End: 149 * vim600: noet sw=4 ts=4 fdm=marker 150 * vim<600: noet sw=4 ts=4 151 */ 152