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;
55 *status
= U_ILLEGAL_ARGUMENT_ERROR
; return NULL
;
57 LocalPointer
<MeasureFormat
> mfmt( new MeasureFormat(Locale(locale
), mfWidth
, (NumberFormat
*)nfToAdopt
, *status
) );
58 if (U_FAILURE(*status
)) {
61 return (UATimeUnitFormat
*)mfmt
.orphan();
66 uatmufmt_close(UATimeUnitFormat
*mfmt
)
68 delete (MeasureFormat
*)mfmt
;
73 uatmufmt_setNumberFormat(UATimeUnitFormat
* mfmt
,
74 UNumberFormat
* numfmt
,
77 if (U_FAILURE(*status
)) {
80 ((MeasureFormat
*)mfmt
)->adoptNumberFormat( (NumberFormat
*)(((NumberFormat
*)numfmt
)->clone()), *status
);
84 U_CAPI
int32_t U_EXPORT2
85 uatmufmt_format(const UATimeUnitFormat
* mfmt
,
87 UATimeUnitField field
,
89 int32_t resultCapacity
,
92 if (U_FAILURE(*status
)) {
95 if ( ((result
==NULL
)? resultCapacity
!=0: resultCapacity
<0) ) {
96 *status
= U_ILLEGAL_ARGUMENT_ERROR
;
99 MeasureUnit
* munit
= NULL
;
101 case UATIMEUNITFIELD_YEAR
: munit
= MeasureUnit::createYear(*status
); break;
102 case UATIMEUNITFIELD_MONTH
: munit
= MeasureUnit::createMonth(*status
); break;
103 case UATIMEUNITFIELD_DAY
: munit
= MeasureUnit::createDay(*status
); break;
104 case UATIMEUNITFIELD_WEEK
: munit
= MeasureUnit::createWeek(*status
); break;
105 case UATIMEUNITFIELD_HOUR
: munit
= MeasureUnit::createHour(*status
); break;
106 case UATIMEUNITFIELD_MINUTE
: munit
= MeasureUnit::createMinute(*status
); break;
107 case UATIMEUNITFIELD_SECOND
: munit
= MeasureUnit::createSecond(*status
); break;
108 default: *status
= U_ILLEGAL_ARGUMENT_ERROR
; break;
110 if (U_FAILURE(*status
)) {
113 LocalPointer
<Measure
> meas(new Measure(value
, munit
, *status
));
114 if (U_FAILURE(*status
)) {
118 fmt
.adoptObject(meas
.orphan());
120 res
.setTo(result
, 0, resultCapacity
);
121 FieldPosition
pos(0);
122 ((MeasureFormat
*)mfmt
)->format(fmt
, res
, pos
, *status
);
123 return res
.extract(result
, resultCapacity
, *status
);
127 U_CAPI
double U_EXPORT2
128 uatmufmt_parse( const UATimeUnitFormat
* mfmt
,
132 UATimeUnitField
* field
,
135 double doubleVal
= 0.0;
136 if (U_FAILURE(*status
)) {
139 *status
= U_UNSUPPORTED_ERROR
;
144 U_CAPI
int32_t U_EXPORT2
145 uatmufmt_getTimePattern(const char* locale
,
146 UATimeUnitTimePattern type
,
148 int32_t resultCapacity
,
151 if (U_FAILURE(*status
)) {
154 if ( (result
==NULL
)? resultCapacity
!=0: resultCapacity
<0 ) {
155 *status
= U_ILLEGAL_ARGUMENT_ERROR
;
158 const char* key
= NULL
;
160 case UATIMEUNITTIMEPAT_HM
: { key
= "hm"; break; }
161 case UATIMEUNITTIMEPAT_HMS
: { key
= "hms"; break; }
162 case UATIMEUNITTIMEPAT_MS
: { key
= "ms"; break; }
163 default: { *status
= U_ILLEGAL_ARGUMENT_ERROR
; return 0; }
166 const UChar
* resPtr
= NULL
;
167 UResourceBundle
* rb
= ures_open(U_ICUDATA_UNIT
, locale
, status
);
168 rb
= ures_getByKeyWithFallback(rb
, "durationUnits", rb
, status
);
169 resPtr
= ures_getStringByKeyWithFallback(rb
, key
, &resLen
, status
);
170 if (U_SUCCESS(*status
)) {
171 u_strncpy(result
, resPtr
, resultCapacity
);
174 return u_terminateUChars(result
, resultCapacity
, resLen
, status
);
178 U_CAPI
int32_t U_EXPORT2
179 uatmufmt_getListPattern(const char* locale
,
180 UATimeUnitStyle style
,
181 UATimeUnitListPattern type
,
183 int32_t resultCapacity
,
186 if (U_FAILURE(*status
)) {
189 if ( (result
==NULL
)? resultCapacity
!=0: resultCapacity
<0 ) {
190 *status
= U_ILLEGAL_ARGUMENT_ERROR
;
193 const char* styleKey
= NULL
;
195 case UATIMEUNITSTYLE_FULL
: { styleKey
= "unit"; break; }
196 case UATIMEUNITSTYLE_ABBREVIATED
: { styleKey
= "unit-short"; break; }
197 case UATIMEUNITSTYLE_NARROW
: { styleKey
= "unit-narrow"; break; }
198 default: { *status
= U_ILLEGAL_ARGUMENT_ERROR
; return 0; }
200 const char* typeKey
= NULL
;
202 case UATIMEUNITLISTPAT_TWO_ONLY
: { typeKey
= "2"; break; }
203 case UATIMEUNITLISTPAT_END_PIECE
: { typeKey
= "end"; break; }
204 case UATIMEUNITLISTPAT_MIDDLE_PIECE
: { typeKey
= "middle"; break; }
205 case UATIMEUNITLISTPAT_START_PIECE
: { typeKey
= "start"; break; }
206 default: { *status
= U_ILLEGAL_ARGUMENT_ERROR
; return 0; }
209 const UChar
* resPtr
= NULL
;
210 UResourceBundle
* rb
= ures_open(NULL
, locale
, status
);
211 rb
= ures_getByKeyWithFallback(rb
, "listPattern", rb
, status
);
212 rb
= ures_getByKeyWithFallback(rb
, styleKey
, rb
, status
);
213 resPtr
= ures_getStringByKeyWithFallback(rb
, typeKey
, &resLen
, status
);
214 if (U_SUCCESS(*status
)) {
215 u_strncpy(result
, resPtr
, resultCapacity
);
218 return u_terminateUChars(result
, resultCapacity
, resLen
, status
);
222 #endif /* #if !UCONFIG_NO_FORMATTING */