2 *****************************************************************************************
3 * Copyright (C) 2014-2015 Apple Inc. All Rights Reserved.
4 *****************************************************************************************
7 #include "unicode/utypes.h"
9 #if !UCONFIG_NO_FORMATTING
11 #include "unicode/uatimeunitformat.h"
12 #include "unicode/fieldpos.h"
13 #include "unicode/localpointer.h"
14 #include "unicode/numfmt.h"
15 #include "unicode/measunit.h"
16 #include "unicode/measure.h"
17 #include "unicode/measfmt.h"
18 #include "unicode/unistr.h"
19 #include "unicode/unum.h"
20 #include "unicode/ures.h"
28 U_CAPI UATimeUnitFormat
* U_EXPORT2
29 uatmufmt_open(const char* locale
,
30 UATimeUnitStyle style
,
33 return uatmufmt_openWithNumberFormat(locale
, style
, NULL
, status
);
37 U_CAPI UATimeUnitFormat
* U_EXPORT2
38 uatmufmt_openWithNumberFormat(const char* locale
,
39 UATimeUnitStyle style
,
40 UNumberFormat
* nfToAdopt
,
43 if (U_FAILURE(*status
)) {
46 UMeasureFormatWidth mfWidth
= UMEASFMT_WIDTH_WIDE
;
48 case UATIMEUNITSTYLE_FULL
:
50 case UATIMEUNITSTYLE_ABBREVIATED
:
51 mfWidth
= UMEASFMT_WIDTH_SHORT
; break;
52 case UATIMEUNITSTYLE_NARROW
:
53 mfWidth
= UMEASFMT_WIDTH_NARROW
; break;
54 case UATIMEUNITSTYLE_SHORTER
:
55 mfWidth
= UMEASFMT_WIDTH_SHORTER
; break;
57 *status
= U_ILLEGAL_ARGUMENT_ERROR
; return NULL
;
59 LocalPointer
<MeasureFormat
> mfmt( new MeasureFormat(Locale(locale
), mfWidth
, (NumberFormat
*)nfToAdopt
, *status
) );
60 if (U_FAILURE(*status
)) {
63 return (UATimeUnitFormat
*)mfmt
.orphan();
68 uatmufmt_close(UATimeUnitFormat
*mfmt
)
70 delete (MeasureFormat
*)mfmt
;
75 uatmufmt_setNumberFormat(UATimeUnitFormat
* mfmt
,
76 UNumberFormat
* numfmt
,
79 if (U_FAILURE(*status
)) {
82 ((MeasureFormat
*)mfmt
)->adoptNumberFormat( (NumberFormat
*)(((NumberFormat
*)numfmt
)->clone()), *status
);
86 U_CAPI
int32_t U_EXPORT2
87 uatmufmt_format(const UATimeUnitFormat
* mfmt
,
89 UATimeUnitField field
,
91 int32_t resultCapacity
,
94 if (U_FAILURE(*status
)) {
97 if ( ((result
==NULL
)? resultCapacity
!=0: resultCapacity
<0) ) {
98 *status
= U_ILLEGAL_ARGUMENT_ERROR
;
101 MeasureUnit
* munit
= NULL
;
103 case UATIMEUNITFIELD_YEAR
: munit
= MeasureUnit::createYear(*status
); break;
104 case UATIMEUNITFIELD_MONTH
: munit
= MeasureUnit::createMonth(*status
); break;
105 case UATIMEUNITFIELD_DAY
: munit
= MeasureUnit::createDay(*status
); break;
106 case UATIMEUNITFIELD_WEEK
: munit
= MeasureUnit::createWeek(*status
); break;
107 case UATIMEUNITFIELD_HOUR
: munit
= MeasureUnit::createHour(*status
); break;
108 case UATIMEUNITFIELD_MINUTE
: munit
= MeasureUnit::createMinute(*status
); break;
109 case UATIMEUNITFIELD_SECOND
: munit
= MeasureUnit::createSecond(*status
); break;
110 default: *status
= U_ILLEGAL_ARGUMENT_ERROR
; break;
112 if (U_FAILURE(*status
)) {
115 LocalPointer
<Measure
> meas(new Measure(value
, munit
, *status
));
116 if (U_FAILURE(*status
)) {
120 fmt
.adoptObject(meas
.orphan());
122 res
.setTo(result
, 0, resultCapacity
);
123 FieldPosition
pos(0);
124 ((MeasureFormat
*)mfmt
)->format(fmt
, res
, pos
, *status
);
125 return res
.extract(result
, resultCapacity
, *status
);
129 U_CAPI
double U_EXPORT2
130 uatmufmt_parse( const UATimeUnitFormat
* mfmt
,
134 UATimeUnitField
* field
,
137 double doubleVal
= 0.0;
138 if (U_FAILURE(*status
)) {
141 *status
= U_UNSUPPORTED_ERROR
;
146 U_CAPI
int32_t U_EXPORT2
147 uatmufmt_getTimePattern(const char* locale
,
148 UATimeUnitTimePattern type
,
150 int32_t resultCapacity
,
153 if (U_FAILURE(*status
)) {
156 if ( (result
==NULL
)? resultCapacity
!=0: resultCapacity
<0 ) {
157 *status
= U_ILLEGAL_ARGUMENT_ERROR
;
160 const char* key
= NULL
;
162 case UATIMEUNITTIMEPAT_HM
: { key
= "hm"; break; }
163 case UATIMEUNITTIMEPAT_HMS
: { key
= "hms"; break; }
164 case UATIMEUNITTIMEPAT_MS
: { key
= "ms"; break; }
165 default: { *status
= U_ILLEGAL_ARGUMENT_ERROR
; return 0; }
168 const UChar
* resPtr
= NULL
;
169 UResourceBundle
* rb
= ures_open(U_ICUDATA_UNIT
, locale
, status
);
170 rb
= ures_getByKeyWithFallback(rb
, "durationUnits", rb
, status
);
171 resPtr
= ures_getStringByKeyWithFallback(rb
, key
, &resLen
, status
);
172 if (U_SUCCESS(*status
)) {
173 u_strncpy(result
, resPtr
, resultCapacity
);
176 return u_terminateUChars(result
, resultCapacity
, resLen
, status
);
180 U_CAPI
int32_t U_EXPORT2
181 uatmufmt_getListPattern(const char* locale
,
182 UATimeUnitStyle style
,
183 UATimeUnitListPattern type
,
185 int32_t resultCapacity
,
188 if (U_FAILURE(*status
)) {
191 if ( (result
==NULL
)? resultCapacity
!=0: resultCapacity
<0 ) {
192 *status
= U_ILLEGAL_ARGUMENT_ERROR
;
195 const char* styleKey
= NULL
;
197 case UATIMEUNITSTYLE_FULL
: { styleKey
= "unit"; break; }
198 case UATIMEUNITSTYLE_ABBREVIATED
: { styleKey
= "unit-short"; break; }
199 case UATIMEUNITSTYLE_NARROW
: { styleKey
= "unit-narrow"; break; }
200 case UATIMEUNITSTYLE_SHORTER
: { styleKey
= "unit-narrow"; break; }
201 default: { *status
= U_ILLEGAL_ARGUMENT_ERROR
; return 0; }
203 const char* typeKey
= NULL
;
205 case UATIMEUNITLISTPAT_TWO_ONLY
: { typeKey
= "2"; break; }
206 case UATIMEUNITLISTPAT_END_PIECE
: { typeKey
= "end"; break; }
207 case UATIMEUNITLISTPAT_MIDDLE_PIECE
: { typeKey
= "middle"; break; }
208 case UATIMEUNITLISTPAT_START_PIECE
: { typeKey
= "start"; break; }
209 default: { *status
= U_ILLEGAL_ARGUMENT_ERROR
; return 0; }
212 const UChar
* resPtr
= NULL
;
213 UResourceBundle
* rb
= ures_open(NULL
, locale
, status
);
214 rb
= ures_getByKeyWithFallback(rb
, "listPattern", rb
, status
);
215 rb
= ures_getByKeyWithFallback(rb
, styleKey
, rb
, status
);
216 resPtr
= ures_getStringByKeyWithFallback(rb
, typeKey
, &resLen
, status
);
217 if (U_SUCCESS(*status
)) {
218 u_strncpy(result
, resPtr
, resultCapacity
);
221 return u_terminateUChars(result
, resultCapacity
, resLen
, status
);
225 #endif /* #if !UCONFIG_NO_FORMATTING */