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
udtitvfmt_open(const char * locale,const UChar * skeleton,int32_t skeletonLength,const UChar * tzID,int32_t tzIDLength,UErrorCode * status)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
udtitvfmt_close(UDateIntervalFormat * formatter)59 udtitvfmt_close(UDateIntervalFormat *formatter)
60 {
61     delete (DateIntervalFormat*)formatter;
62 }
63 
64 
65 U_CAPI int32_t U_EXPORT2
udtitvfmt_format(const UDateIntervalFormat * formatter,UDate fromDate,UDate toDate,UChar * result,int32_t resultCapacity,UFieldPosition * position,UErrorCode * status)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