Annotation of embedaddon/php/ext/intl/dateformat/dateformat_attr.c, revision 1.1.1.2
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: Kirti Velankar <kirtig@yahoo-inc.com> |
14: +----------------------------------------------------------------------+
15: */
16: #ifdef HAVE_CONFIG_H
17: #include "config.h"
18: #endif
19:
1.1.1.2 ! misho 20: #include "../php_intl.h"
! 21: #include "dateformat_class.h"
! 22: #include "../intl_convert.h"
1.1 misho 23: #include "dateformat_class.h"
24: #include "dateformat_attr.h"
25:
26: #include <unicode/ustring.h>
27: #include <unicode/udat.h>
28: #include <unicode/ucal.h>
29:
30: static void internal_set_calendar(IntlDateFormatter_object *dfo, char* timezone_id, int timezone_id_len, int calendar, zval* return_value TSRMLS_DC){
31: int timezone_utf16_len = 0;
32: UChar* timezone_utf16 = NULL; /* timezone_id in UTF-16 */
33: char* locale = NULL;
34:
35: UCalendar* ucal_obj = NULL;
36:
37: /* check for the validity of value of calendar passed */
38: intl_error_reset( NULL TSRMLS_CC );
39: if( calendar > 1){
40: intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
41: "datefmt_set_calendar: calendar value specified is out of valid range", 0 TSRMLS_CC);
42: RETURN_FALSE;
43: }
44:
45: /* Convert timezone to UTF-16. */
46: intl_convert_utf8_to_utf16(&timezone_utf16, &timezone_utf16_len, timezone_id, timezone_id_len, &INTL_DATA_ERROR_CODE(dfo));
47: INTL_METHOD_CHECK_STATUS(dfo, "Error converting timezone to UTF-16" );
48:
49: /* Get the locale for the dateformatter */
50: locale = (char *)udat_getLocaleByType(DATE_FORMAT_OBJECT(dfo), ULOC_ACTUAL_LOCALE, &INTL_DATA_ERROR_CODE(dfo));
51:
52: /* Set the calendar if passed */
53: ucal_obj = ucal_open(timezone_utf16, timezone_utf16_len, locale, calendar, &INTL_DATA_ERROR_CODE(dfo) );
54: udat_setCalendar( DATE_FORMAT_OBJECT(dfo), ucal_obj );
55: INTL_METHOD_CHECK_STATUS(dfo, "Error setting the calendar.");
56:
57: if( timezone_utf16){
58: efree(timezone_utf16);
59: }
60: }
61:
62: /* {{{ proto unicode IntlDateFormatter::getDateType( )
63: * Get formatter datetype. }}} */
64: /* {{{ proto string datefmt_get_datetype( IntlDateFormatter $mf )
65: * Get formatter datetype.
66: */
67: PHP_FUNCTION( datefmt_get_datetype )
68: {
69: DATE_FORMAT_METHOD_INIT_VARS;
70:
71: /* Parse parameters. */
72: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, IntlDateFormatter_ce_ptr ) == FAILURE )
73: {
74: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
75: "datefmt_get_datetype: unable to parse input params", 0 TSRMLS_CC );
76: RETURN_FALSE;
77: }
78:
79: /* Fetch the object. */
80: DATE_FORMAT_METHOD_FETCH_OBJECT;
81:
82: INTL_METHOD_CHECK_STATUS(dfo, "Error getting formatter datetype." );
83:
84: RETURN_LONG(dfo->date_type );
85: }
86: /* }}} */
87:
88: /* {{{ proto unicode IntlDateFormatter::getTimeType( )
89: * Get formatter timetype. }}} */
90: /* {{{ proto string datefmt_get_timetype( IntlDateFormatter $mf )
91: * Get formatter timetype.
92: */
93: PHP_FUNCTION( datefmt_get_timetype )
94: {
95: DATE_FORMAT_METHOD_INIT_VARS;
96:
97: /* Parse parameters. */
98: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, IntlDateFormatter_ce_ptr ) == FAILURE )
99: {
100: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
101: "datefmt_get_timetype: unable to parse input params", 0 TSRMLS_CC );
102: RETURN_FALSE;
103: }
104:
105: /* Fetch the object. */
106: DATE_FORMAT_METHOD_FETCH_OBJECT;
107:
108: INTL_METHOD_CHECK_STATUS(dfo, "Error getting formatter timetype." );
109:
110: RETURN_LONG(dfo->time_type );
111: }
112: /* }}} */
113:
114:
115: /* {{{ proto unicode IntlDateFormatter::getCalendar( )
116: * Get formatter calendar. }}} */
117: /* {{{ proto string datefmt_get_calendar( IntlDateFormatter $mf )
118: * Get formatter calendar.
119: */
120: PHP_FUNCTION( datefmt_get_calendar )
121: {
122: DATE_FORMAT_METHOD_INIT_VARS;
123:
124: /* Parse parameters. */
125: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, IntlDateFormatter_ce_ptr ) == FAILURE )
126: {
127: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
128: "datefmt_get_calendar: unable to parse input params", 0 TSRMLS_CC );
129: RETURN_FALSE;
130: }
131:
132: /* Fetch the object. */
133: DATE_FORMAT_METHOD_FETCH_OBJECT;
134:
135: INTL_METHOD_CHECK_STATUS(dfo, "Error getting formatter calendar." );
136:
137: RETURN_LONG(dfo->calendar);
138: }
139: /* }}} */
140:
141: /* {{{ proto unicode IntlDateFormatter::getTimeZoneId( )
142: * Get formatter timezone_id. }}} */
143: /* {{{ proto string datefmt_get_timezone_id( IntlDateFormatter $mf )
144: * Get formatter timezone_id.
145: */
146: PHP_FUNCTION( datefmt_get_timezone_id )
147: {
148: DATE_FORMAT_METHOD_INIT_VARS;
149:
150: /* Parse parameters. */
151: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, IntlDateFormatter_ce_ptr ) == FAILURE )
152: {
153: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
154: "datefmt_get_timezone_id: unable to parse input params", 0 TSRMLS_CC );
155: RETURN_FALSE;
156: }
157:
158: /* Fetch the object. */
159: DATE_FORMAT_METHOD_FETCH_OBJECT;
160:
161: INTL_METHOD_CHECK_STATUS(dfo, "Error getting formatter timezone_id." );
162:
163: if( dfo->timezone_id ){
164: RETURN_STRING((char*)dfo->timezone_id, TRUE );
165: }else{
166: RETURN_NULL();
167: }
168: }
169:
170: /* {{{ proto boolean IntlDateFormatter::setTimeZoneId( $timezone_id)
171: * Set formatter timezone_id. }}} */
172: /* {{{ proto boolean datefmt_set_timezone_id( IntlDateFormatter $mf,$timezone_id)
173: * Set formatter timezone_id.
174: */
175: PHP_FUNCTION( datefmt_set_timezone_id )
176: {
177: char* timezone_id = NULL;
178: int timezone_id_len = 0;
179:
180: DATE_FORMAT_METHOD_INIT_VARS;
181:
182: /* Parse parameters. */
183: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &object, IntlDateFormatter_ce_ptr,&timezone_id, &timezone_id_len) == FAILURE )
184: {
185: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
186: "datefmt_set_timezone_id: unable to parse input params", 0 TSRMLS_CC );
187: RETURN_FALSE;
188: }
189:
190: /* Fetch the object. */
191: DATE_FORMAT_METHOD_FETCH_OBJECT;
192:
193: /* set the timezone for the calendar */
194: internal_set_calendar( dfo, timezone_id, timezone_id_len, dfo->calendar, return_value TSRMLS_CC );
195:
196: /* Set the IntlDateFormatter variable */
197: if( dfo->timezone_id ){
198: efree(dfo->timezone_id);
199: }
200: dfo->timezone_id = estrndup(timezone_id, timezone_id_len);
201:
202: RETURN_TRUE;
203: }
204:
205: /* {{{ proto string IntlDateFormatter::getPattern( )
206: * Get formatter pattern. }}} */
207: /* {{{ proto string datefmt_get_pattern( IntlDateFormatter $mf )
208: * Get formatter pattern.
209: */
210: PHP_FUNCTION( datefmt_get_pattern )
211: {
212: UChar value_buf[64];
213: int length = USIZE( value_buf );
214: UChar* value = value_buf;
215: zend_bool is_pattern_localized =FALSE;
216:
217: DATE_FORMAT_METHOD_INIT_VARS;
218:
219: /* Parse parameters. */
220: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, IntlDateFormatter_ce_ptr ) == FAILURE )
221: {
222: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
223: "datefmt_get_pattern: unable to parse input params", 0 TSRMLS_CC );
224: RETURN_FALSE;
225: }
226:
227: /* Fetch the object. */
228: DATE_FORMAT_METHOD_FETCH_OBJECT;
229:
230: length = udat_toPattern(DATE_FORMAT_OBJECT(dfo), is_pattern_localized, value, length, &INTL_DATA_ERROR_CODE(dfo));
231: if(INTL_DATA_ERROR_CODE(dfo) == U_BUFFER_OVERFLOW_ERROR && length >= USIZE( value_buf )) {
232: ++length; /* to avoid U_STRING_NOT_TERMINATED_WARNING */
233: INTL_DATA_ERROR_CODE(dfo) = U_ZERO_ERROR;
234: value = eumalloc(length);
235: length = udat_toPattern(DATE_FORMAT_OBJECT(dfo), is_pattern_localized, value, length, &INTL_DATA_ERROR_CODE(dfo) );
236: if(U_FAILURE(INTL_DATA_ERROR_CODE(dfo))) {
237: efree(value);
238: value = value_buf;
239: }
240: }
241: INTL_METHOD_CHECK_STATUS(dfo, "Error getting formatter pattern" );
242:
243: INTL_METHOD_RETVAL_UTF8( dfo, value, length, ( value != value_buf ) );
244: }
245: /* }}} */
246:
247: /* {{{ proto bool IntlDateFormatter::setPattern( string $pattern )
248: * Set formatter pattern. }}} */
249: /* {{{ proto bool datefmt_set_pattern( IntlDateFormatter $mf, string $pattern )
250: * Set formatter pattern.
251: */
252: PHP_FUNCTION( datefmt_set_pattern )
253: {
254: char* value = NULL;
255: int value_len = 0;
256: int slength = 0;
257: UChar* svalue = NULL;
258: zend_bool is_pattern_localized =FALSE;
259:
260:
261: DATE_FORMAT_METHOD_INIT_VARS;
262:
263: /* Parse parameters. */
264: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",
265: &object, IntlDateFormatter_ce_ptr, &value, &value_len ) == FAILURE )
266: {
267: intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
268: "datefmt_set_pattern: unable to parse input params", 0 TSRMLS_CC);
269: RETURN_FALSE;
270: }
271:
272: DATE_FORMAT_METHOD_FETCH_OBJECT;
273:
274: /* Convert given pattern to UTF-16. */
275: intl_convert_utf8_to_utf16(&svalue, &slength, value, value_len, &INTL_DATA_ERROR_CODE(dfo));
276: INTL_METHOD_CHECK_STATUS(dfo, "Error converting pattern to UTF-16" );
277:
278: udat_applyPattern(DATE_FORMAT_OBJECT(dfo), (UBool)is_pattern_localized, svalue, slength);
279:
280: if (svalue) {
281: efree(svalue);
282: }
283: INTL_METHOD_CHECK_STATUS(dfo, "Error setting symbol value");
284:
285: RETURN_TRUE;
286: }
287: /* }}} */
288:
289: /* {{{ proto string IntlDateFormatter::getLocale()
290: * Get formatter locale. }}} */
291: /* {{{ proto string datefmt_get_locale(IntlDateFormatter $mf)
292: * Get formatter locale.
293: */
294: PHP_FUNCTION( datefmt_get_locale )
295: {
296: char *loc;
297: long loc_type =ULOC_ACTUAL_LOCALE;
298:
299: DATE_FORMAT_METHOD_INIT_VARS;
300:
301: /* Parse parameters. */
302: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|l",
303: &object, IntlDateFormatter_ce_ptr,&loc_type) == FAILURE )
304: {
305: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
306: "datefmt_get_locale: unable to parse input params", 0 TSRMLS_CC );
307:
308: RETURN_FALSE;
309: }
310:
311: /* Fetch the object. */
312: DATE_FORMAT_METHOD_FETCH_OBJECT;
313:
314: loc = (char *)udat_getLocaleByType(DATE_FORMAT_OBJECT(dfo), loc_type,&INTL_DATA_ERROR_CODE(dfo));
315: INTL_METHOD_CHECK_STATUS(dfo, "Error getting locale");
316: RETURN_STRING(loc, 1);
317: }
318: /* }}} */
319:
320: /* {{{ proto string IntlDateFormatter::isLenient()
321: * Get formatter isLenient. }}} */
322: /* {{{ proto string datefmt_isLenient(IntlDateFormatter $mf)
323: * Get formatter locale.
324: */
325: PHP_FUNCTION( datefmt_is_lenient )
326: {
327:
328: DATE_FORMAT_METHOD_INIT_VARS;
329:
330: /* Parse parameters. */
331: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
332: &object, IntlDateFormatter_ce_ptr ) == FAILURE )
333: {
334: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
335: "datefmt_is_lenient: unable to parse input params", 0 TSRMLS_CC );
336:
337: RETURN_FALSE;
338: }
339:
340: /* Fetch the object. */
341: DATE_FORMAT_METHOD_FETCH_OBJECT;
342:
343: RETVAL_BOOL(udat_isLenient(DATE_FORMAT_OBJECT(dfo)));
344: }
345: /* }}} */
346:
347: /* {{{ proto string IntlDateFormatter::setLenient()
348: * Set formatter lenient. }}} */
349: /* {{{ proto string datefmt_setLenient(IntlDateFormatter $mf)
350: * Set formatter lenient.
351: */
352: PHP_FUNCTION( datefmt_set_lenient )
353: {
354: zend_bool isLenient = FALSE;
355:
356: DATE_FORMAT_METHOD_INIT_VARS;
357:
358: /* Parse parameters. */
359: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ob",
360: &object, IntlDateFormatter_ce_ptr,&isLenient ) == FAILURE )
361: {
362: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
363: "datefmt_set_lenient: unable to parse input params", 0 TSRMLS_CC );
364: RETURN_FALSE;
365: }
366:
367: /* Fetch the object. */
368: DATE_FORMAT_METHOD_FETCH_OBJECT;
369:
370: udat_setLenient(DATE_FORMAT_OBJECT(dfo), (UBool)isLenient );
371: }
372: /* }}} */
373:
374: /* {{{ proto bool IntlDateFormatter::setPattern( int $calendar )
375: * Set formatter calendar. }}} */
376: /* {{{ proto bool datefmt_set_calendar( IntlDateFormatter $mf, int $calendar )
377: * Set formatter calendar.
378: */
379: PHP_FUNCTION( datefmt_set_calendar )
380: {
381: long calendar = 0;
382:
383: DATE_FORMAT_METHOD_INIT_VARS;
384:
385: /* Parse parameters. */
386: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol",
387: &object, IntlDateFormatter_ce_ptr, &calendar ) == FAILURE ) {
388: intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
389: "datefmt_set_calendar: unable to parse input params", 0 TSRMLS_CC);
390: RETURN_FALSE;
391: }
392:
393: /* check for the validity of value of calendar passed */
394: intl_error_reset( NULL TSRMLS_CC );
395: if (calendar > 1) {
396: intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
397: "datefmt_set_calendar: calendar value specified is out of valid range", 0 TSRMLS_CC);
398: RETURN_FALSE;
399: }
400:
401: DATE_FORMAT_METHOD_FETCH_OBJECT;
402:
403: internal_set_calendar( dfo, dfo->timezone_id, strlen(dfo->timezone_id), calendar, return_value TSRMLS_CC );
404:
405: /* Set the calendar value in the IntlDateFormatter object */
406: dfo->calendar = calendar;
407:
408: RETURN_TRUE;
409: }
410: /* }}} */
411:
412:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>