Index: source/i18n/scriptset.cpp |
diff --git a/source/i18n/scriptset.cpp b/source/i18n/scriptset.cpp |
index 9be244e0bbfebf4ab34b45fec7bffea6f68a0385..5a425352d9996b843408738ecbdaf3ca9735fc78 100644 |
--- a/source/i18n/scriptset.cpp |
+++ b/source/i18n/scriptset.cpp |
@@ -1,3 +1,5 @@ |
+// Copyright (C) 2016 and later: Unicode, Inc. and others. |
+// License & terms of use: http://www.unicode.org/copyright.html |
/* |
********************************************************************** |
* Copyright (C) 2014, International Business Machines |
@@ -191,6 +193,15 @@ int32_t ScriptSet::nextSetBit(int32_t fromIndex) const { |
return -1; |
} |
+UBool ScriptSet::isEmpty() const { |
+ for (uint32_t i=0; i<UPRV_LENGTHOF(bits); i++) { |
+ if (bits[i] != 0) { |
+ return FALSE; |
+ } |
+ } |
+ return TRUE; |
+} |
+ |
UnicodeString &ScriptSet::displayScripts(UnicodeString &dest) const { |
UBool firstTime = TRUE; |
for (int32_t i = nextSetBit(0); i >= 0; i = nextSetBit(i + 1)) { |
@@ -238,6 +249,41 @@ ScriptSet &ScriptSet::parseScripts(const UnicodeString &scriptString, UErrorCode |
return *this; |
} |
+void ScriptSet::setScriptExtensions(UChar32 codePoint, UErrorCode& status) { |
+ if (U_FAILURE(status)) { return; } |
+ static const int32_t FIRST_GUESS_SCRIPT_CAPACITY = 5; |
+ MaybeStackArray<UScriptCode,FIRST_GUESS_SCRIPT_CAPACITY> scripts; |
+ UErrorCode internalStatus = U_ZERO_ERROR; |
+ int32_t script_count = -1; |
+ |
+ while (TRUE) { |
+ script_count = uscript_getScriptExtensions( |
+ codePoint, scripts.getAlias(), FIRST_GUESS_SCRIPT_CAPACITY, &internalStatus); |
+ if (internalStatus == U_BUFFER_OVERFLOW_ERROR) { |
+ // Need to allocate more space |
+ if (scripts.resize(script_count) == NULL) { |
+ status = U_MEMORY_ALLOCATION_ERROR; |
+ return; |
+ } |
+ internalStatus = U_ZERO_ERROR; |
+ } else { |
+ break; |
+ } |
+ } |
+ |
+ // Check if we failed for some reason other than buffer overflow |
+ if (U_FAILURE(internalStatus)) { |
+ status = internalStatus; |
+ return; |
+ } |
+ |
+ // Load the scripts into the ScriptSet and return |
+ for (int32_t i = 0; i < script_count; i++) { |
+ this->set(scripts[i], status); |
+ if (U_FAILURE(status)) { return; } |
+ } |
+} |
+ |
U_NAMESPACE_END |
U_CAPI UBool U_EXPORT2 |