]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/common/ulistformatter.cpp
ICU-551.24.tar.gz
[apple/icu.git] / icuSources / common / ulistformatter.cpp
diff --git a/icuSources/common/ulistformatter.cpp b/icuSources/common/ulistformatter.cpp
new file mode 100644 (file)
index 0000000..6931cdd
--- /dev/null
@@ -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 */