1 /*
2 +----------------------------------------------------------------------+
3 | PHP Version 7 |
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: Kirti Velankar <kirtig@yahoo-inc.com> |
14 +----------------------------------------------------------------------+
15 */
16 #ifdef HAVE_CONFIG_H
17 #include "config.h"
18 #endif
19
20 #include "../php_intl.h"
21 #include "dateformat_class.h"
22 #include "../intl_convert.h"
23 #include "dateformat_class.h"
24 #include "dateformat_attr.h"
25
26 #include <unicode/ustring.h>
27 #include <unicode/udat.h>
28
29 /* {{{ proto unicode IntlDateFormatter::getDateType( )
30 * Get formatter datetype. }}} */
31 /* {{{ proto string datefmt_get_datetype( IntlDateFormatter $mf )
32 * Get formatter datetype.
33 */
PHP_FUNCTION(datefmt_get_datetype)34 PHP_FUNCTION( datefmt_get_datetype )
35 {
36 DATE_FORMAT_METHOD_INIT_VARS;
37
38 /* Parse parameters. */
39 if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "O", &object, IntlDateFormatter_ce_ptr ) == FAILURE )
40 {
41 intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
42 "datefmt_get_datetype: unable to parse input params", 0 );
43 RETURN_FALSE;
44 }
45
46 /* Fetch the object. */
47 DATE_FORMAT_METHOD_FETCH_OBJECT;
48
49 INTL_METHOD_CHECK_STATUS(dfo, "Error getting formatter datetype." );
50
51 RETURN_LONG(dfo->date_type );
52 }
53 /* }}} */
54
55 /* {{{ proto unicode IntlDateFormatter::getTimeType( )
56 * Get formatter timetype. }}} */
57 /* {{{ proto string datefmt_get_timetype( IntlDateFormatter $mf )
58 * Get formatter timetype.
59 */
PHP_FUNCTION(datefmt_get_timetype)60 PHP_FUNCTION( datefmt_get_timetype )
61 {
62 DATE_FORMAT_METHOD_INIT_VARS;
63
64 /* Parse parameters. */
65 if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "O", &object, IntlDateFormatter_ce_ptr ) == FAILURE )
66 {
67 intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
68 "datefmt_get_timetype: unable to parse input params", 0 );
69 RETURN_FALSE;
70 }
71
72 /* Fetch the object. */
73 DATE_FORMAT_METHOD_FETCH_OBJECT;
74
75 INTL_METHOD_CHECK_STATUS(dfo, "Error getting formatter timetype." );
76
77 RETURN_LONG(dfo->time_type );
78 }
79 /* }}} */
80
81 /* {{{ proto string IntlDateFormatter::getPattern( )
82 * Get formatter pattern. }}} */
83 /* {{{ proto string datefmt_get_pattern( IntlDateFormatter $mf )
84 * Get formatter pattern.
85 */
PHP_FUNCTION(datefmt_get_pattern)86 PHP_FUNCTION( datefmt_get_pattern )
87 {
88 UChar value_buf[64];
89 int length = USIZE( value_buf );
90 UChar* value = value_buf;
91 zend_bool is_pattern_localized =FALSE;
92
93 DATE_FORMAT_METHOD_INIT_VARS;
94
95 /* Parse parameters. */
96 if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "O", &object, IntlDateFormatter_ce_ptr ) == FAILURE )
97 {
98 intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
99 "datefmt_get_pattern: unable to parse input params", 0 );
100 RETURN_FALSE;
101 }
102
103 /* Fetch the object. */
104 DATE_FORMAT_METHOD_FETCH_OBJECT;
105
106 length = udat_toPattern(DATE_FORMAT_OBJECT(dfo), is_pattern_localized, value, length, &INTL_DATA_ERROR_CODE(dfo));
107 if(INTL_DATA_ERROR_CODE(dfo) == U_BUFFER_OVERFLOW_ERROR && length >= USIZE( value_buf )) {
108 ++length; /* to avoid U_STRING_NOT_TERMINATED_WARNING */
109 INTL_DATA_ERROR_CODE(dfo) = U_ZERO_ERROR;
110 value = eumalloc(length);
111 length = udat_toPattern(DATE_FORMAT_OBJECT(dfo), is_pattern_localized, value, length, &INTL_DATA_ERROR_CODE(dfo) );
112 if(U_FAILURE(INTL_DATA_ERROR_CODE(dfo))) {
113 efree(value);
114 value = value_buf;
115 }
116 }
117 INTL_METHOD_CHECK_STATUS(dfo, "Error getting formatter pattern" );
118
119 INTL_METHOD_RETVAL_UTF8( dfo, value, length, ( value != value_buf ) );
120 }
121 /* }}} */
122
123 /* {{{ proto bool IntlDateFormatter::setPattern( string $pattern )
124 * Set formatter pattern. }}} */
125 /* {{{ proto bool datefmt_set_pattern( IntlDateFormatter $mf, string $pattern )
126 * Set formatter pattern.
127 */
PHP_FUNCTION(datefmt_set_pattern)128 PHP_FUNCTION( datefmt_set_pattern )
129 {
130 char* value = NULL;
131 size_t value_len = 0;
132 int32_t slength = 0;
133 UChar* svalue = NULL;
134 zend_bool is_pattern_localized =FALSE;
135
136
137 DATE_FORMAT_METHOD_INIT_VARS;
138
139 /* Parse parameters. */
140 if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "Os",
141 &object, IntlDateFormatter_ce_ptr, &value, &value_len ) == FAILURE )
142 {
143 intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
144 "datefmt_set_pattern: unable to parse input params", 0);
145 RETURN_FALSE;
146 }
147
148 DATE_FORMAT_METHOD_FETCH_OBJECT;
149
150 /* Convert given pattern to UTF-16. */
151 intl_convert_utf8_to_utf16(&svalue, &slength, value, value_len, &INTL_DATA_ERROR_CODE(dfo));
152 INTL_METHOD_CHECK_STATUS(dfo, "Error converting pattern to UTF-16" );
153
154 udat_applyPattern(DATE_FORMAT_OBJECT(dfo), (UBool)is_pattern_localized, svalue, slength);
155
156 if (svalue) {
157 efree(svalue);
158 }
159 INTL_METHOD_CHECK_STATUS(dfo, "Error setting symbol value");
160
161 RETURN_TRUE;
162 }
163 /* }}} */
164
165 /* {{{ proto string IntlDateFormatter::getLocale()
166 * Get formatter locale. }}} */
167 /* {{{ proto string datefmt_get_locale(IntlDateFormatter $mf)
168 * Get formatter locale.
169 */
PHP_FUNCTION(datefmt_get_locale)170 PHP_FUNCTION( datefmt_get_locale )
171 {
172 char *loc;
173 zend_long loc_type =ULOC_ACTUAL_LOCALE;
174
175 DATE_FORMAT_METHOD_INIT_VARS;
176
177 /* Parse parameters. */
178 if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "O|l",
179 &object, IntlDateFormatter_ce_ptr,&loc_type) == FAILURE )
180 {
181 intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
182 "datefmt_get_locale: unable to parse input params", 0 );
183
184 RETURN_FALSE;
185 }
186
187 /* Fetch the object. */
188 DATE_FORMAT_METHOD_FETCH_OBJECT;
189
190 loc = (char *)udat_getLocaleByType(DATE_FORMAT_OBJECT(dfo), loc_type,&INTL_DATA_ERROR_CODE(dfo));
191 INTL_METHOD_CHECK_STATUS(dfo, "Error getting locale");
192 RETURN_STRING(loc);
193 }
194 /* }}} */
195
196 /* {{{ proto string IntlDateFormatter::isLenient()
197 * Get formatter isLenient. }}} */
198 /* {{{ proto string datefmt_isLenient(IntlDateFormatter $mf)
199 * Get formatter locale.
200 */
PHP_FUNCTION(datefmt_is_lenient)201 PHP_FUNCTION( datefmt_is_lenient )
202 {
203
204 DATE_FORMAT_METHOD_INIT_VARS;
205
206 /* Parse parameters. */
207 if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "O",
208 &object, IntlDateFormatter_ce_ptr ) == FAILURE )
209 {
210 intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
211 "datefmt_is_lenient: unable to parse input params", 0 );
212
213 RETURN_FALSE;
214 }
215
216 /* Fetch the object. */
217 DATE_FORMAT_METHOD_FETCH_OBJECT;
218
219 RETVAL_BOOL(udat_isLenient(DATE_FORMAT_OBJECT(dfo)));
220 }
221 /* }}} */
222
223 /* {{{ proto string IntlDateFormatter::setLenient()
224 * Set formatter lenient. }}} */
225 /* {{{ proto string datefmt_setLenient(IntlDateFormatter $mf)
226 * Set formatter lenient.
227 */
PHP_FUNCTION(datefmt_set_lenient)228 PHP_FUNCTION( datefmt_set_lenient )
229 {
230 zend_bool isLenient = FALSE;
231
232 DATE_FORMAT_METHOD_INIT_VARS;
233
234 /* Parse parameters. */
235 if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "Ob",
236 &object, IntlDateFormatter_ce_ptr,&isLenient ) == FAILURE )
237 {
238 intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
239 "datefmt_set_lenient: unable to parse input params", 0 );
240 RETURN_FALSE;
241 }
242
243 /* Fetch the object. */
244 DATE_FORMAT_METHOD_FETCH_OBJECT;
245
246 udat_setLenient(DATE_FORMAT_OBJECT(dfo), (UBool)isLenient );
247 }
248 /* }}} */
249