Index: source/common/ulistformatter.cpp |
diff --git a/source/common/ulistformatter.cpp b/source/common/ulistformatter.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6931cddfe07c060196adca478e6e87b43682ec02 |
--- /dev/null |
+++ b/source/common/ulistformatter.cpp |
@@ -0,0 +1,89 @@ |
+/* |
+***************************************************************************************** |
+* Copyright (C) 2015, International Business Machines |
+* Corporation and others. All Rights Reserved. |
+***************************************************************************************** |
+*/ |
+ |
+#include "unicode/utypes.h" |
+ |
+#if !UCONFIG_NO_FORMATTING |
+ |
+#include "unicode/ulistformatter.h" |
+#include "unicode/listformatter.h" |
+#include "unicode/localpointer.h" |
+#include "cmemory.h" |
+ |
+U_NAMESPACE_USE |
+ |
+U_CAPI UListFormatter* U_EXPORT2 |
+ulistfmt_open(const char* locale, |
+ UErrorCode* status) |
+{ |
+ if (U_FAILURE(*status)) { |
+ return NULL; |
+ } |
+ LocalPointer<ListFormatter> listfmt(ListFormatter::createInstance(Locale(locale), *status)); |
+ if (U_FAILURE(*status)) { |
+ return NULL; |
+ } |
+ return (UListFormatter*)listfmt.orphan(); |
+} |
+ |
+ |
+U_CAPI void U_EXPORT2 |
+ulistfmt_close(UListFormatter *listfmt) |
+{ |
+ delete (ListFormatter*)listfmt; |
+} |
+ |
+ |
+U_CAPI int32_t U_EXPORT2 |
+ulistfmt_format(const UListFormatter* listfmt, |
+ const UChar* const strings[], |
+ const int32_t * stringLengths, |
+ int32_t stringCount, |
+ UChar* result, |
+ int32_t resultCapacity, |
+ UErrorCode* status) |
+{ |
+ if (U_FAILURE(*status)) { |
+ return -1; |
+ } |
+ if (stringCount < 0 || (strings == NULL && stringCount > 0) || ((result == NULL)? resultCapacity != 0 : resultCapacity < 0)) { |
+ *status = U_ILLEGAL_ARGUMENT_ERROR; |
+ return -1; |
+ } |
+ UnicodeString ustringsStackBuf[4]; |
+ UnicodeString* ustrings = ustringsStackBuf; |
+ if (stringCount > UPRV_LENGTHOF(ustringsStackBuf)) { |
+ ustrings = new UnicodeString[stringCount]; |
+ if (ustrings == NULL) { |
+ *status = U_MEMORY_ALLOCATION_ERROR; |
+ return -1; |
+ } |
+ } |
+ if (stringLengths == NULL) { |
+ for (int32_t stringIndex = 0; stringIndex < stringCount; stringIndex++) { |
+ ustrings[stringIndex].setTo(TRUE, strings[stringIndex], -1); |
+ } |
+ } else { |
+ for (int32_t stringIndex = 0; stringIndex < stringCount; stringIndex++) { |
+ ustrings[stringIndex].setTo(stringLengths[stringIndex] < 0, strings[stringIndex], stringLengths[stringIndex]); |
+ } |
+ } |
+ 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); |
+ } |
+ ((const ListFormatter*)listfmt)->format( ustrings, stringCount, res, *status ); |
+ if (ustrings != ustringsStackBuf) { |
+ delete[] ustrings; |
+ } |
+ return res.extract(result, resultCapacity, *status); |
+} |
+ |
+ |
+#endif /* #if !UCONFIG_NO_FORMATTING */ |