123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- // © 2016 and later: Unicode, Inc. and others.
- // License & terms of use: http://www.unicode.org/copyright.html
- /*
- *****************************************************************************************
- * 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"
- #include "formattedval_impl.h"
- U_NAMESPACE_USE
- U_CAPI UListFormatter* U_EXPORT2
- ulistfmt_open(const char* locale,
- UErrorCode* status)
- {
- if (U_FAILURE(*status)) {
- return nullptr;
- }
- LocalPointer<ListFormatter> listfmt(ListFormatter::createInstance(Locale(locale), *status));
- if (U_FAILURE(*status)) {
- return nullptr;
- }
- return (UListFormatter*)listfmt.orphan();
- }
- U_CAPI UListFormatter* U_EXPORT2
- ulistfmt_openForType(const char* locale, UListFormatterType type,
- UListFormatterWidth width, UErrorCode* status)
- {
- if (U_FAILURE(*status)) {
- return nullptr;
- }
- LocalPointer<ListFormatter> listfmt(ListFormatter::createInstance(Locale(locale), type, width, *status));
- if (U_FAILURE(*status)) {
- return nullptr;
- }
- return (UListFormatter*)listfmt.orphan();
- }
- U_CAPI void U_EXPORT2
- ulistfmt_close(UListFormatter *listfmt)
- {
- delete (ListFormatter*)listfmt;
- }
- // Magic number: FLST in ASCII
- UPRV_FORMATTED_VALUE_CAPI_AUTO_IMPL(
- FormattedList,
- UFormattedList,
- UFormattedListImpl,
- UFormattedListApiHelper,
- ulistfmt,
- 0x464C5354)
- static UnicodeString* getUnicodeStrings(
- const char16_t* const strings[],
- const int32_t* stringLengths,
- int32_t stringCount,
- UnicodeString* length4StackBuffer,
- LocalArray<UnicodeString>& maybeOwner,
- UErrorCode& status) {
- U_ASSERT(U_SUCCESS(status));
- if (stringCount < 0 || (strings == nullptr && stringCount > 0)) {
- status = U_ILLEGAL_ARGUMENT_ERROR;
- return nullptr;
- }
- UnicodeString* ustrings = length4StackBuffer;
- if (stringCount > 4) {
- maybeOwner.adoptInsteadAndCheckErrorCode(new UnicodeString[stringCount], status);
- if (U_FAILURE(status)) {
- return nullptr;
- }
- ustrings = maybeOwner.getAlias();
- }
- if (stringLengths == nullptr) {
- 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]);
- }
- }
- return ustrings;
- }
- U_CAPI int32_t U_EXPORT2
- ulistfmt_format(const UListFormatter* listfmt,
- const char16_t* const strings[],
- const int32_t * stringLengths,
- int32_t stringCount,
- char16_t* result,
- int32_t resultCapacity,
- UErrorCode* status)
- {
- if (U_FAILURE(*status)) {
- return -1;
- }
- if ((result == nullptr) ? resultCapacity != 0 : resultCapacity < 0) {
- *status = U_ILLEGAL_ARGUMENT_ERROR;
- return -1;
- }
- UnicodeString length4StackBuffer[4];
- LocalArray<UnicodeString> maybeOwner;
- UnicodeString* ustrings = getUnicodeStrings(
- strings, stringLengths, stringCount, length4StackBuffer, maybeOwner, *status);
- if (U_FAILURE(*status)) {
- return -1;
- }
- UnicodeString res;
- if (result != nullptr) {
- // nullptr destination for pure preflighting: empty dummy string
- // otherwise, alias the destination buffer (copied from udat_format)
- res.setTo(result, 0, resultCapacity);
- }
- reinterpret_cast<const ListFormatter*>(listfmt)->format( ustrings, stringCount, res, *status );
- return res.extract(result, resultCapacity, *status);
- }
- U_CAPI void U_EXPORT2
- ulistfmt_formatStringsToResult(
- const UListFormatter* listfmt,
- const char16_t* const strings[],
- const int32_t * stringLengths,
- int32_t stringCount,
- UFormattedList* uresult,
- UErrorCode* status) {
- auto* result = UFormattedListApiHelper::validate(uresult, *status);
- if (U_FAILURE(*status)) {
- return;
- }
- UnicodeString length4StackBuffer[4];
- LocalArray<UnicodeString> maybeOwner;
- UnicodeString* ustrings = getUnicodeStrings(
- strings, stringLengths, stringCount, length4StackBuffer, maybeOwner, *status);
- if (U_FAILURE(*status)) {
- return;
- }
- result->fImpl = reinterpret_cast<const ListFormatter*>(listfmt)
- ->formatStringsToValue(ustrings, stringCount, *status);
- }
- #endif /* #if !UCONFIG_NO_FORMATTING */
|