1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /*
4 *******************************************************************************
5 *
6 *   Copyright (C) 2009-2015, International Business Machines
7 *   Corporation and others.  All Rights Reserved.
8 *
9 *******************************************************************************
10 *   file name:  udatpg.cpp
11 *   encoding:   UTF-8
12 *   tab size:   8 (not used)
13 *   indentation:4
14 *
15 *   created on: 2007jul30
16 *   created by: Markus W. Scherer
17 */
18 
19 #include "unicode/utypes.h"
20 
21 #if !UCONFIG_NO_FORMATTING
22 
23 #include "unicode/udatpg.h"
24 #include "unicode/uenum.h"
25 #include "unicode/strenum.h"
26 #include "unicode/dtptngen.h"
27 #include "ustrenum.h"
28 
29 U_NAMESPACE_USE
30 
31 U_CAPI UDateTimePatternGenerator * U_EXPORT2
udatpg_open(const char * locale,UErrorCode * pErrorCode)32 udatpg_open(const char *locale, UErrorCode *pErrorCode) {
33     if(locale==NULL) {
34         return (UDateTimePatternGenerator *)DateTimePatternGenerator::createInstance(*pErrorCode);
35     } else {
36         return (UDateTimePatternGenerator *)DateTimePatternGenerator::createInstance(Locale(locale), *pErrorCode);
37     }
38 }
39 
40 U_CAPI UDateTimePatternGenerator * U_EXPORT2
udatpg_openEmpty(UErrorCode * pErrorCode)41 udatpg_openEmpty(UErrorCode *pErrorCode) {
42     return (UDateTimePatternGenerator *)DateTimePatternGenerator::createEmptyInstance(*pErrorCode);
43 }
44 
45 U_CAPI void U_EXPORT2
udatpg_close(UDateTimePatternGenerator * dtpg)46 udatpg_close(UDateTimePatternGenerator *dtpg) {
47     delete (DateTimePatternGenerator *)dtpg;
48 }
49 
50 U_CAPI UDateTimePatternGenerator * U_EXPORT2
udatpg_clone(const UDateTimePatternGenerator * dtpg,UErrorCode * pErrorCode)51 udatpg_clone(const UDateTimePatternGenerator *dtpg, UErrorCode *pErrorCode) {
52     if(U_FAILURE(*pErrorCode)) {
53         return NULL;
54     }
55     return (UDateTimePatternGenerator *)(((const DateTimePatternGenerator *)dtpg)->clone());
56 }
57 
58 U_CAPI int32_t U_EXPORT2
udatpg_getBestPattern(UDateTimePatternGenerator * dtpg,const UChar * skeleton,int32_t length,UChar * bestPattern,int32_t capacity,UErrorCode * pErrorCode)59 udatpg_getBestPattern(UDateTimePatternGenerator *dtpg,
60                       const UChar *skeleton, int32_t length,
61                       UChar *bestPattern, int32_t capacity,
62                       UErrorCode *pErrorCode) {
63     return udatpg_getBestPatternWithOptions(dtpg, skeleton, length,
64                                             UDATPG_MATCH_NO_OPTIONS,
65                                             bestPattern, capacity, pErrorCode);
66 }
67 
68 U_CAPI int32_t U_EXPORT2
udatpg_getBestPatternWithOptions(UDateTimePatternGenerator * dtpg,const UChar * skeleton,int32_t length,UDateTimePatternMatchOptions options,UChar * bestPattern,int32_t capacity,UErrorCode * pErrorCode)69 udatpg_getBestPatternWithOptions(UDateTimePatternGenerator *dtpg,
70                                  const UChar *skeleton, int32_t length,
71                                  UDateTimePatternMatchOptions options,
72                                  UChar *bestPattern, int32_t capacity,
73                                  UErrorCode *pErrorCode) {
74     if(U_FAILURE(*pErrorCode)) {
75         return 0;
76     }
77     if(skeleton==NULL && length!=0) {
78         *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
79         return 0;
80     }
81     UnicodeString skeletonString((UBool)(length<0), skeleton, length);
82     UnicodeString result=((DateTimePatternGenerator *)dtpg)->getBestPattern(skeletonString, options, *pErrorCode);
83     return result.extract(bestPattern, capacity, *pErrorCode);
84 }
85 
86 U_CAPI int32_t U_EXPORT2
udatpg_getSkeleton(UDateTimePatternGenerator *,const UChar * pattern,int32_t length,UChar * skeleton,int32_t capacity,UErrorCode * pErrorCode)87 udatpg_getSkeleton(UDateTimePatternGenerator * /* dtpg */,
88                    const UChar *pattern, int32_t length,
89                    UChar *skeleton, int32_t capacity,
90                    UErrorCode *pErrorCode) {
91     if(U_FAILURE(*pErrorCode)) {
92         return 0;
93     }
94     if(pattern==NULL && length!=0) {
95         *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
96         return 0;
97     }
98     UnicodeString patternString((UBool)(length<0), pattern, length);
99     UnicodeString result=DateTimePatternGenerator::staticGetSkeleton(
100             patternString, *pErrorCode);
101     return result.extract(skeleton, capacity, *pErrorCode);
102 }
103 
104 U_CAPI int32_t U_EXPORT2
udatpg_getBaseSkeleton(UDateTimePatternGenerator *,const UChar * pattern,int32_t length,UChar * skeleton,int32_t capacity,UErrorCode * pErrorCode)105 udatpg_getBaseSkeleton(UDateTimePatternGenerator * /* dtpg */,
106                        const UChar *pattern, int32_t length,
107                        UChar *skeleton, int32_t capacity,
108                        UErrorCode *pErrorCode) {
109     if(U_FAILURE(*pErrorCode)) {
110         return 0;
111     }
112     if(pattern==NULL && length!=0) {
113         *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
114         return 0;
115     }
116     UnicodeString patternString((UBool)(length<0), pattern, length);
117     UnicodeString result=DateTimePatternGenerator::staticGetBaseSkeleton(
118             patternString, *pErrorCode);
119     return result.extract(skeleton, capacity, *pErrorCode);
120 }
121 
122 U_CAPI UDateTimePatternConflict U_EXPORT2
udatpg_addPattern(UDateTimePatternGenerator * dtpg,const UChar * pattern,int32_t patternLength,UBool override,UChar * conflictingPattern,int32_t capacity,int32_t * pLength,UErrorCode * pErrorCode)123 udatpg_addPattern(UDateTimePatternGenerator *dtpg,
124                   const UChar *pattern, int32_t patternLength,
125                   UBool override,
126                   UChar *conflictingPattern, int32_t capacity, int32_t *pLength,
127                   UErrorCode *pErrorCode) {
128     if(U_FAILURE(*pErrorCode)) {
129         return UDATPG_NO_CONFLICT;
130     }
131     if(pattern==NULL && patternLength!=0) {
132         *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
133         return UDATPG_NO_CONFLICT;
134     }
135     UnicodeString patternString((UBool)(patternLength<0), pattern, patternLength);
136     UnicodeString conflictingPatternString;
137     UDateTimePatternConflict result=((DateTimePatternGenerator *)dtpg)->
138             addPattern(patternString, override, conflictingPatternString, *pErrorCode);
139     int32_t length=conflictingPatternString.extract(conflictingPattern, capacity, *pErrorCode);
140     if(pLength!=NULL) {
141         *pLength=length;
142     }
143     return result;
144 }
145 
146 U_CAPI void U_EXPORT2
udatpg_setAppendItemFormat(UDateTimePatternGenerator * dtpg,UDateTimePatternField field,const UChar * value,int32_t length)147 udatpg_setAppendItemFormat(UDateTimePatternGenerator *dtpg,
148                            UDateTimePatternField field,
149                            const UChar *value, int32_t length) {
150     UnicodeString valueString((UBool)(length<0), value, length);
151     ((DateTimePatternGenerator *)dtpg)->setAppendItemFormat(field, valueString);
152 }
153 
154 U_CAPI const UChar * U_EXPORT2
udatpg_getAppendItemFormat(const UDateTimePatternGenerator * dtpg,UDateTimePatternField field,int32_t * pLength)155 udatpg_getAppendItemFormat(const UDateTimePatternGenerator *dtpg,
156                            UDateTimePatternField field,
157                            int32_t *pLength) {
158     const UnicodeString &result=((const DateTimePatternGenerator *)dtpg)->getAppendItemFormat(field);
159     if(pLength!=NULL) {
160         *pLength=result.length();
161     }
162     return result.getBuffer();
163 }
164 
165 U_CAPI void U_EXPORT2
udatpg_setAppendItemName(UDateTimePatternGenerator * dtpg,UDateTimePatternField field,const UChar * value,int32_t length)166 udatpg_setAppendItemName(UDateTimePatternGenerator *dtpg,
167                          UDateTimePatternField field,
168                          const UChar *value, int32_t length) {
169     UnicodeString valueString((UBool)(length<0), value, length);
170     ((DateTimePatternGenerator *)dtpg)->setAppendItemName(field, valueString);
171 }
172 
173 U_CAPI const UChar * U_EXPORT2
udatpg_getAppendItemName(const UDateTimePatternGenerator * dtpg,UDateTimePatternField field,int32_t * pLength)174 udatpg_getAppendItemName(const UDateTimePatternGenerator *dtpg,
175                          UDateTimePatternField field,
176                          int32_t *pLength) {
177     const UnicodeString &result=((const DateTimePatternGenerator *)dtpg)->getAppendItemName(field);
178     if(pLength!=NULL) {
179         *pLength=result.length();
180     }
181     return result.getBuffer();
182 }
183 
184 U_CAPI int32_t U_EXPORT2
udatpg_getFieldDisplayName(const UDateTimePatternGenerator * dtpg,UDateTimePatternField field,UDateTimePGDisplayWidth width,UChar * fieldName,int32_t capacity,UErrorCode * pErrorCode)185 udatpg_getFieldDisplayName(const UDateTimePatternGenerator *dtpg,
186                            UDateTimePatternField field,
187                            UDateTimePGDisplayWidth width,
188                            UChar *fieldName, int32_t capacity,
189                            UErrorCode *pErrorCode) {
190     if (U_FAILURE(*pErrorCode))
191         return -1;
192     if (fieldName == NULL ? capacity != 0 : capacity < 0) {
193         *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR;
194         return -1;
195     }
196     UnicodeString result = ((const DateTimePatternGenerator *)dtpg)->getFieldDisplayName(field,width);
197     if (fieldName == NULL) {
198         return result.length();
199     }
200     return result.extract(fieldName, capacity, *pErrorCode);
201 }
202 
203 U_CAPI void U_EXPORT2
udatpg_setDateTimeFormat(const UDateTimePatternGenerator * dtpg,const UChar * dtFormat,int32_t length)204 udatpg_setDateTimeFormat(const UDateTimePatternGenerator *dtpg,
205                          const UChar *dtFormat, int32_t length) {
206     UnicodeString dtFormatString((UBool)(length<0), dtFormat, length);
207     ((DateTimePatternGenerator *)dtpg)->setDateTimeFormat(dtFormatString);
208 }
209 
210 U_CAPI const UChar * U_EXPORT2
udatpg_getDateTimeFormat(const UDateTimePatternGenerator * dtpg,int32_t * pLength)211 udatpg_getDateTimeFormat(const UDateTimePatternGenerator *dtpg,
212                          int32_t *pLength) {
213     const UnicodeString &result=((const DateTimePatternGenerator *)dtpg)->getDateTimeFormat();
214     if(pLength!=NULL) {
215         *pLength=result.length();
216     }
217     return result.getBuffer();
218 }
219 
220 U_CAPI void U_EXPORT2
udatpg_setDecimal(UDateTimePatternGenerator * dtpg,const UChar * decimal,int32_t length)221 udatpg_setDecimal(UDateTimePatternGenerator *dtpg,
222                   const UChar *decimal, int32_t length) {
223     UnicodeString decimalString((UBool)(length<0), decimal, length);
224     ((DateTimePatternGenerator *)dtpg)->setDecimal(decimalString);
225 }
226 
227 U_CAPI const UChar * U_EXPORT2
udatpg_getDecimal(const UDateTimePatternGenerator * dtpg,int32_t * pLength)228 udatpg_getDecimal(const UDateTimePatternGenerator *dtpg,
229                   int32_t *pLength) {
230     const UnicodeString &result=((const DateTimePatternGenerator *)dtpg)->getDecimal();
231     if(pLength!=NULL) {
232         *pLength=result.length();
233     }
234     return result.getBuffer();
235 }
236 
237 U_CAPI int32_t U_EXPORT2
udatpg_replaceFieldTypes(UDateTimePatternGenerator * dtpg,const UChar * pattern,int32_t patternLength,const UChar * skeleton,int32_t skeletonLength,UChar * dest,int32_t destCapacity,UErrorCode * pErrorCode)238 udatpg_replaceFieldTypes(UDateTimePatternGenerator *dtpg,
239                          const UChar *pattern, int32_t patternLength,
240                          const UChar *skeleton, int32_t skeletonLength,
241                          UChar *dest, int32_t destCapacity,
242                          UErrorCode *pErrorCode) {
243     return udatpg_replaceFieldTypesWithOptions(dtpg, pattern, patternLength, skeleton, skeletonLength,
244                                                UDATPG_MATCH_NO_OPTIONS,
245                                                dest, destCapacity, pErrorCode);
246 }
247 
248 U_CAPI int32_t U_EXPORT2
udatpg_replaceFieldTypesWithOptions(UDateTimePatternGenerator * dtpg,const UChar * pattern,int32_t patternLength,const UChar * skeleton,int32_t skeletonLength,UDateTimePatternMatchOptions options,UChar * dest,int32_t destCapacity,UErrorCode * pErrorCode)249 udatpg_replaceFieldTypesWithOptions(UDateTimePatternGenerator *dtpg,
250                                     const UChar *pattern, int32_t patternLength,
251                                     const UChar *skeleton, int32_t skeletonLength,
252                                     UDateTimePatternMatchOptions options,
253                                     UChar *dest, int32_t destCapacity,
254                                     UErrorCode *pErrorCode) {
255     if(U_FAILURE(*pErrorCode)) {
256         return 0;
257     }
258     if((pattern==NULL && patternLength!=0) || (skeleton==NULL && skeletonLength!=0)) {
259         *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
260         return 0;
261     }
262     UnicodeString patternString((UBool)(patternLength<0), pattern, patternLength);
263     UnicodeString skeletonString((UBool)(skeletonLength<0), skeleton, skeletonLength);
264     UnicodeString result=((DateTimePatternGenerator *)dtpg)->replaceFieldTypes(patternString, skeletonString, options, *pErrorCode);
265     return result.extract(dest, destCapacity, *pErrorCode);
266 }
267 
268 U_CAPI UEnumeration * U_EXPORT2
udatpg_openSkeletons(const UDateTimePatternGenerator * dtpg,UErrorCode * pErrorCode)269 udatpg_openSkeletons(const UDateTimePatternGenerator *dtpg, UErrorCode *pErrorCode) {
270     return uenum_openFromStringEnumeration(
271                 ((DateTimePatternGenerator *)dtpg)->getSkeletons(*pErrorCode),
272                 pErrorCode);
273 }
274 
275 U_CAPI UEnumeration * U_EXPORT2
udatpg_openBaseSkeletons(const UDateTimePatternGenerator * dtpg,UErrorCode * pErrorCode)276 udatpg_openBaseSkeletons(const UDateTimePatternGenerator *dtpg, UErrorCode *pErrorCode) {
277     return uenum_openFromStringEnumeration(
278                 ((DateTimePatternGenerator *)dtpg)->getBaseSkeletons(*pErrorCode),
279                 pErrorCode);
280 }
281 
282 U_CAPI const UChar * U_EXPORT2
udatpg_getPatternForSkeleton(const UDateTimePatternGenerator * dtpg,const UChar * skeleton,int32_t skeletonLength,int32_t * pLength)283 udatpg_getPatternForSkeleton(const UDateTimePatternGenerator *dtpg,
284                              const UChar *skeleton, int32_t skeletonLength,
285                              int32_t *pLength) {
286     UnicodeString skeletonString((UBool)(skeletonLength<0), skeleton, skeletonLength);
287     const UnicodeString &result=((const DateTimePatternGenerator *)dtpg)->getPatternForSkeleton(skeletonString);
288     if(pLength!=NULL) {
289         *pLength=result.length();
290     }
291     return result.getBuffer();
292 }
293 
294 U_CAPI UDateFormatHourCycle U_EXPORT2
udatpg_getDefaultHourCycle(const UDateTimePatternGenerator * dtpg,UErrorCode * pErrorCode)295 udatpg_getDefaultHourCycle(const UDateTimePatternGenerator *dtpg, UErrorCode* pErrorCode) {
296     return ((const DateTimePatternGenerator *)dtpg)->getDefaultHourCycle(*pErrorCode);
297 }
298 
299 #endif
300