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 * Copyright (C) 2010-2011, International Business Machines
      6 * Corporation and others. All Rights Reserved.
      7 *****************************************************************************************
      8 */
      9 
     10 #include "unicode/utypes.h"
     11 
     12 #if !UCONFIG_NO_FORMATTING
     13 
     14 #include "unicode/udateintervalformat.h"
     15 #include "unicode/dtitvfmt.h"
     16 #include "unicode/dtintrv.h"
     17 #include "unicode/localpointer.h"
     18 #include "unicode/timezone.h"
     19 #include "unicode/locid.h"
     20 #include "unicode/unistr.h"
     21 
     22 U_NAMESPACE_USE
     23 
     24 
     25 U_CAPI UDateIntervalFormat* U_EXPORT2
     26 udtitvfmt_open(const char*  locale,
     27                const UChar* skeleton,
     28                int32_t      skeletonLength,
     29                const UChar* tzID,
     30                int32_t      tzIDLength,
     31                UErrorCode*  status)
     32 {
     33     if (U_FAILURE(*status)) {
     34         return NULL;
     35     }
     36     if ((skeleton == NULL ? skeletonLength != 0 : skeletonLength < -1) ||
     37         (tzID == NULL ? tzIDLength != 0 : tzIDLength < -1)
     38     ) {
     39         *status = U_ILLEGAL_ARGUMENT_ERROR;
     40         return NULL;
     41     }
     42     UnicodeString skel((UBool)(skeletonLength == -1), skeleton, skeletonLength);
     43     LocalPointer<DateIntervalFormat> formatter(
     44             DateIntervalFormat::createInstance(skel, Locale(locale), *status));
     45     if (U_FAILURE(*status)) {
     46         return NULL;
     47     }
     48     if(tzID != 0) {
     49         TimeZone *zone = TimeZone::createTimeZone(UnicodeString((UBool)(tzIDLength == -1), tzID, tzIDLength));
     50         if(zone == NULL) {
     51             *status = U_MEMORY_ALLOCATION_ERROR;
     52             return NULL;
     53         }
     54         formatter->adoptTimeZone(zone);
     55     }
     56     return (UDateIntervalFormat*)formatter.orphan();
     57 }
     58 
     59 
     60 U_CAPI void U_EXPORT2
     61 udtitvfmt_close(UDateIntervalFormat *formatter)
     62 {
     63     delete (DateIntervalFormat*)formatter;
     64 }
     65 
     66 
     67 U_CAPI int32_t U_EXPORT2
     68 udtitvfmt_format(const UDateIntervalFormat* formatter,
     69                  UDate           fromDate,
     70                  UDate           toDate,
     71                  UChar*          result,
     72                  int32_t         resultCapacity,
     73                  UFieldPosition* position,
     74                  UErrorCode*     status)
     75 {
     76     if (U_FAILURE(*status)) {
     77         return -1;
     78     }
     79     if (result == NULL ? resultCapacity != 0 : resultCapacity < 0) {
     80         *status = U_ILLEGAL_ARGUMENT_ERROR;
     81         return 0;
     82     }
     83     UnicodeString res;
     84     if (result != NULL) {
     85         // NULL destination for pure preflighting: empty dummy string
     86         // otherwise, alias the destination buffer (copied from udat_format)
     87         res.setTo(result, 0, resultCapacity);
     88     }
     89     FieldPosition fp;
     90     if (position != 0) {
     91         fp.setField(position->field);
     92     }
     93 
     94     DateInterval interval = DateInterval(fromDate,toDate);
     95     ((const DateIntervalFormat*)formatter)->format( &interval, res, fp, *status );
     96     if (U_FAILURE(*status)) {
     97         return -1;
     98     }
     99     if (position != 0) {
    100         position->beginIndex = fp.getBeginIndex();
    101         position->endIndex = fp.getEndIndex();
    102     }
    103 
    104     return res.extract(result, resultCapacity, *status);
    105 }
    106 
    107 
    108 #endif /* #if !UCONFIG_NO_FORMATTING */
    109