diff options
Diffstat (limited to 'intl/icu/source/i18n/udateintervalformat.cpp')
-rw-r--r-- | intl/icu/source/i18n/udateintervalformat.cpp | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/intl/icu/source/i18n/udateintervalformat.cpp b/intl/icu/source/i18n/udateintervalformat.cpp new file mode 100644 index 000000000..e6eec4484 --- /dev/null +++ b/intl/icu/source/i18n/udateintervalformat.cpp @@ -0,0 +1,108 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +***************************************************************************************** +* Copyright (C) 2010-2011, International Business Machines +* Corporation and others. All Rights Reserved. +***************************************************************************************** +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/udateintervalformat.h" +#include "unicode/dtitvfmt.h" +#include "unicode/dtintrv.h" +#include "unicode/localpointer.h" +#include "unicode/timezone.h" +#include "unicode/locid.h" +#include "unicode/unistr.h" + +U_NAMESPACE_USE + + +U_CAPI UDateIntervalFormat* U_EXPORT2 +udtitvfmt_open(const char* locale, + const UChar* skeleton, + int32_t skeletonLength, + const UChar* tzID, + int32_t tzIDLength, + UErrorCode* status) +{ + if (U_FAILURE(*status)) { + return NULL; + } + if ((skeleton == NULL ? skeletonLength != 0 : skeletonLength < -1) || + (tzID == NULL ? tzIDLength != 0 : tzIDLength < -1) + ) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + UnicodeString skel((UBool)(skeletonLength == -1), skeleton, skeletonLength); + LocalPointer<DateIntervalFormat> formatter( + DateIntervalFormat::createInstance(skel, Locale(locale), *status)); + if (U_FAILURE(*status)) { + return NULL; + } + if(tzID != 0) { + TimeZone *zone = TimeZone::createTimeZone(UnicodeString((UBool)(tzIDLength == -1), tzID, tzIDLength)); + if(zone == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + formatter->adoptTimeZone(zone); + } + return (UDateIntervalFormat*)formatter.orphan(); +} + + +U_CAPI void U_EXPORT2 +udtitvfmt_close(UDateIntervalFormat *formatter) +{ + delete (DateIntervalFormat*)formatter; +} + + +U_CAPI int32_t U_EXPORT2 +udtitvfmt_format(const UDateIntervalFormat* formatter, + UDate fromDate, + UDate toDate, + UChar* result, + int32_t resultCapacity, + UFieldPosition* position, + UErrorCode* status) +{ + if (U_FAILURE(*status)) { + return -1; + } + if (result == NULL ? resultCapacity != 0 : resultCapacity < 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + UnicodeString res; + if (result != NULL) { + // NULL destination for pure preflighting: empty dummy string + // otherwise, alias the destination buffer (copied from udat_format) + res.setTo(result, 0, resultCapacity); + } + FieldPosition fp; + if (position != 0) { + fp.setField(position->field); + } + + DateInterval interval = DateInterval(fromDate,toDate); + ((const DateIntervalFormat*)formatter)->format( &interval, res, fp, *status ); + if (U_FAILURE(*status)) { + return -1; + } + if (position != 0) { + position->beginIndex = fp.getBeginIndex(); + position->endIndex = fp.getEndIndex(); + } + + return res.extract(result, resultCapacity, *status); +} + + +#endif /* #if !UCONFIG_NO_FORMATTING */ |