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