summaryrefslogtreecommitdiffstats
path: root/intl/icu/source/tools/ctestfw/datamap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'intl/icu/source/tools/ctestfw/datamap.cpp')
-rw-r--r--intl/icu/source/tools/ctestfw/datamap.cpp224
1 files changed, 224 insertions, 0 deletions
diff --git a/intl/icu/source/tools/ctestfw/datamap.cpp b/intl/icu/source/tools/ctestfw/datamap.cpp
new file mode 100644
index 0000000000..0dd86f4f5b
--- /dev/null
+++ b/intl/icu/source/tools/ctestfw/datamap.cpp
@@ -0,0 +1,224 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+/********************************************************************
+ * COPYRIGHT:
+ * Copyright (c) 2002-2006, International Business Machines Corporation and
+ * others. All Rights Reserved.
+ ********************************************************************/
+
+/* Created by weiv 05/09/2002 */
+
+#include "unicode/datamap.h"
+#include "unicode/resbund.h"
+#include "unicode/unistr.h"
+#include "hash.h"
+#include <stdlib.h>
+
+DataMap::~DataMap() {}
+DataMap::DataMap() {}
+
+int32_t
+DataMap::utoi(const UnicodeString &s) const
+{
+ char ch[256];
+ const char16_t *u = toUCharPtr(s.getBuffer());
+ int32_t len = s.length();
+ u_UCharsToChars(u, ch, len);
+ ch[len] = 0; /* include terminating \0 */
+ return atoi(ch);
+}
+
+U_CDECL_BEGIN
+void U_CALLCONV
+deleteResBund(void *obj) {
+ delete (ResourceBundle *)obj;
+}
+U_CDECL_END
+
+
+RBDataMap::~RBDataMap()
+{
+ delete fData;
+}
+
+RBDataMap::RBDataMap()
+{
+ UErrorCode status = U_ZERO_ERROR;
+ fData = new Hashtable(true, status);
+ fData->setValueDeleter(deleteResBund);
+}
+
+// init from table resource
+// will put stuff in hashtable according to
+// keys.
+RBDataMap::RBDataMap(UResourceBundle *data, UErrorCode &status)
+{
+ fData = new Hashtable(true, status);
+ fData->setValueDeleter(deleteResBund);
+ init(data, status);
+}
+
+// init from headers and resource
+// with checking the whether the size of resource matches
+// header size
+RBDataMap::RBDataMap(UResourceBundle *headers, UResourceBundle *data, UErrorCode &status)
+{
+ fData = new Hashtable(true, status);
+ fData->setValueDeleter(deleteResBund);
+ init(headers, data, status);
+}
+
+
+void RBDataMap::init(UResourceBundle *data, UErrorCode &status) {
+ int32_t i = 0;
+ fData->removeAll();
+ UResourceBundle *t = nullptr;
+ for(i = 0; i < ures_getSize(data); i++) {
+ t = ures_getByIndex(data, i, t, &status);
+ fData->put(UnicodeString(ures_getKey(t), -1, US_INV), new ResourceBundle(t, status), status);
+ }
+ ures_close(t);
+}
+
+void RBDataMap::init(UResourceBundle *headers, UResourceBundle *data, UErrorCode &status)
+{
+ int32_t i = 0;
+ fData->removeAll();
+ UResourceBundle *t = nullptr;
+ const char16_t *key = nullptr;
+ int32_t keyLen = 0;
+ if(ures_getSize(headers) == ures_getSize(data)) {
+ for(i = 0; i < ures_getSize(data); i++) {
+ t = ures_getByIndex(data, i, t, &status);
+ key = ures_getStringByIndex(headers, i, &keyLen, &status);
+ fData->put(UnicodeString(key, keyLen), new ResourceBundle(t, status), status);
+ }
+ } else {
+ // error
+ status = U_INVALID_FORMAT_ERROR;
+ }
+ ures_close(t);
+}
+
+const ResourceBundle *RBDataMap::getItem(const char* key, UErrorCode &status) const
+{
+ if(U_FAILURE(status)) {
+ return nullptr;
+ }
+
+ UnicodeString hashKey(key, -1, US_INV);
+ const ResourceBundle *r = (ResourceBundle *)fData->get(hashKey);
+ if(r != nullptr) {
+ return r;
+ } else {
+ status = U_MISSING_RESOURCE_ERROR;
+ return nullptr;
+ }
+}
+
+const UnicodeString RBDataMap::getString(const char* key, UErrorCode &status) const
+{
+ const ResourceBundle *r = getItem(key, status);
+ if(U_SUCCESS(status)) {
+ return r->getString(status);
+ } else {
+ return UnicodeString();
+ }
+}
+
+int32_t
+RBDataMap::getInt28(const char* key, UErrorCode &status) const
+{
+ const ResourceBundle *r = getItem(key, status);
+ if(U_SUCCESS(status)) {
+ return r->getInt(status);
+ } else {
+ return 0;
+ }
+}
+
+uint32_t
+RBDataMap::getUInt28(const char* key, UErrorCode &status) const
+{
+ const ResourceBundle *r = getItem(key, status);
+ if(U_SUCCESS(status)) {
+ return r->getUInt(status);
+ } else {
+ return 0;
+ }
+}
+
+const int32_t *
+RBDataMap::getIntVector(int32_t &length, const char *key, UErrorCode &status) const {
+ const ResourceBundle *r = getItem(key, status);
+ if(U_SUCCESS(status)) {
+ return r->getIntVector(length, status);
+ } else {
+ return nullptr;
+ }
+}
+
+const uint8_t *
+RBDataMap::getBinary(int32_t &length, const char *key, UErrorCode &status) const {
+ const ResourceBundle *r = getItem(key, status);
+ if(U_SUCCESS(status)) {
+ return r->getBinary(length, status);
+ } else {
+ return nullptr;
+ }
+}
+
+int32_t RBDataMap::getInt(const char* key, UErrorCode &status) const
+{
+ UnicodeString r = this->getString(key, status);
+ if(U_SUCCESS(status)) {
+ return utoi(r);
+ } else {
+ return 0;
+ }
+}
+
+const UnicodeString* RBDataMap::getStringArray(int32_t& count, const char* key, UErrorCode &status) const
+{
+ const ResourceBundle *r = getItem(key, status);
+ if(U_SUCCESS(status)) {
+ int32_t i = 0;
+
+ count = r->getSize();
+ if(count <= 0) {
+ return nullptr;
+ }
+
+ UnicodeString *result = new UnicodeString[count];
+ for(i = 0; i<count; i++) {
+ result[i] = r->getStringEx(i, status);
+ }
+ return result;
+ } else {
+ return nullptr;
+ }
+}
+
+const int32_t* RBDataMap::getIntArray(int32_t& count, const char* key, UErrorCode &status) const
+{
+ const ResourceBundle *r = getItem(key, status);
+ if(U_SUCCESS(status)) {
+ int32_t i = 0;
+
+ count = r->getSize();
+ if(count <= 0) {
+ return nullptr;
+ }
+
+ int32_t *result = new int32_t[count];
+ UnicodeString stringRes;
+ for(i = 0; i<count; i++) {
+ stringRes = r->getStringEx(i, status);
+ result[i] = utoi(stringRes);
+ }
+ return result;
+ } else {
+ return nullptr;
+ }
+}
+