| // © 2016 and later: Unicode, Inc. and others. |
| // License & terms of use: http://www.unicode.org/copyright.html |
| /* |
| ********************************************************************** |
| * Copyright (c) 2004-2014, International Business Machines |
| * Corporation and others. All Rights Reserved. |
| ********************************************************************** |
| * Author: Alan Liu |
| * Created: January 16 2004 |
| * Since: ICU 2.8 |
| ********************************************************************** |
| */ |
| #include "locbased.h" |
| #include "cstring.h" |
| #include "charstr.h" |
| |
| U_NAMESPACE_BEGIN |
| |
| Locale LocaleBased::getLocale(const CharString* valid, const CharString* actual, |
| ULocDataLocaleType type, UErrorCode& status) { |
| const char* id = getLocaleID(valid, actual, type, status); |
| return Locale(id != nullptr ? id : ""); |
| } |
| |
| const char* LocaleBased::getLocaleID(const CharString* valid, const CharString* actual, |
| ULocDataLocaleType type, UErrorCode& status) { |
| if (U_FAILURE(status)) { |
| return nullptr; |
| } |
| |
| switch(type) { |
| case ULOC_VALID_LOCALE: |
| return valid == nullptr ? "" : valid->data(); |
| case ULOC_ACTUAL_LOCALE: |
| return actual == nullptr ? "" : actual->data(); |
| default: |
| status = U_ILLEGAL_ARGUMENT_ERROR; |
| return nullptr; |
| } |
| } |
| |
| void LocaleBased::setLocaleIDs(const CharString* validID, const CharString* actualID, UErrorCode& status) { |
| setValidLocaleID(validID, status); |
| setActualLocaleID(actualID,status); |
| } |
| void LocaleBased::setLocaleIDs(const char* validID, const char* actualID, UErrorCode& status) { |
| setValidLocaleID(validID, status); |
| setActualLocaleID(actualID,status); |
| } |
| |
| void LocaleBased::setLocaleID(const char* id, CharString*& dest, UErrorCode& status) { |
| if (U_FAILURE(status)) { return; } |
| if (id == nullptr || *id == 0) { |
| delete dest; |
| dest = nullptr; |
| } else { |
| if (dest == nullptr) { |
| dest = new CharString(id, status); |
| if (dest == nullptr) { |
| status = U_MEMORY_ALLOCATION_ERROR; |
| return; |
| } |
| } else { |
| dest->copyFrom(id, status); |
| } |
| } |
| } |
| |
| void LocaleBased::setLocaleID(const CharString* id, CharString*& dest, UErrorCode& status) { |
| if (U_FAILURE(status)) { return; } |
| if (id == nullptr || id->isEmpty()) { |
| delete dest; |
| dest = nullptr; |
| } else { |
| if (dest == nullptr) { |
| dest = new CharString(*id, status); |
| if (dest == nullptr) { |
| status = U_MEMORY_ALLOCATION_ERROR; |
| return; |
| } |
| } else { |
| dest->copyFrom(*id, status); |
| } |
| } |
| } |
| |
| bool LocaleBased::equalIDs(const CharString* left, const CharString* right) { |
| // true if both are nullptr |
| if (left == nullptr && right == nullptr) return true; |
| // false if only one is nullptr |
| if (left == nullptr || right == nullptr) return false; |
| return *left == *right; |
| } |
| |
| U_NAMESPACE_END |