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