Home | History | Annotate | Download | only in i18n
      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
     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
     41 udatpg_openEmpty(UErrorCode *pErrorCode) {
     42     return (UDateTimePatternGenerator *)DateTimePatternGenerator::createEmptyInstance(*pErrorCode);
     43 }
     44 
     45 U_CAPI void U_EXPORT2
     46 udatpg_close(UDateTimePatternGenerator *dtpg) {
     47     delete (DateTimePatternGenerator *)dtpg;
     48 }
     49 
     50 U_CAPI UDateTimePatternGenerator * U_EXPORT2
     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
     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
     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
     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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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 #endif
    295