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