]> git.saurik.com Git - apple/icu.git/blame - icuSources/i18n/udateintervalformat.cpp
ICU-59117.0.1.tar.gz
[apple/icu.git] / icuSources / i18n / udateintervalformat.cpp
CommitLineData
f3c0d7a5
A
1// © 2016 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html
4388f060
A
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
22U_NAMESPACE_USE
23
24
25U_CAPI UDateIntervalFormat* U_EXPORT2
26udtitvfmt_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
60U_CAPI void U_EXPORT2
61udtitvfmt_close(UDateIntervalFormat *formatter)
62{
63 delete (DateIntervalFormat*)formatter;
64}
65
66
67U_CAPI int32_t U_EXPORT2
68udtitvfmt_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
107U_CAPI void U_EXPORT2
108udtitvfmt_setAttribute(UDateIntervalFormat* formatter,
109 UDateIntervalFormatAttribute attr,
110 UDateIntervalFormatAttributeValue value,
111 UErrorCode* status)
112{
113 if (U_FAILURE(*status)) {
114 return;
115 }
116 ((DateIntervalFormat*)formatter)->setAttribute( attr, value, *status );
117}
118
119#endif /* #if !UCONFIG_NO_FORMATTING */