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