1 // 2016 and later: Unicode, Inc. and others. 2 // License & terms of use: http://www.unicode.org/copyright.html 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 22 U_NAMESPACE_USE 23 24 25 U_CAPI UDateIntervalFormat* U_EXPORT2 26 udtitvfmt_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 60 U_CAPI void U_EXPORT2 61 udtitvfmt_close(UDateIntervalFormat *formatter) 62 { 63 delete (DateIntervalFormat*)formatter; 64 } 65 66 67 U_CAPI int32_t U_EXPORT2 68 udtitvfmt_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 107 108 #endif /* #if !UCONFIG_NO_FORMATTING */ 109