|
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 */ |