]> git.saurik.com Git - apple/icu.git/blame - icuSources/tools/ctestfw/datamap.cpp
ICU-6.2.15.tar.gz
[apple/icu.git] / icuSources / tools / ctestfw / datamap.cpp
CommitLineData
b75a7d8f
A
1/********************************************************************
2 * COPYRIGHT:
374ca955 3 * Copyright (c) 2002-2004, International Business Machines Corporation and
b75a7d8f
A
4 * others. All Rights Reserved.
5 ********************************************************************/
6
7/* Created by weiv 05/09/2002 */
8
374ca955 9#include "unicode/datamap.h"
b75a7d8f 10#include "unicode/resbund.h"
374ca955 11#include "hash.h"
b75a7d8f
A
12#include <stdlib.h>
13
14int32_t
15DataMap::utoi(const UnicodeString &s) const
16{
17 char ch[256];
18 const UChar *u = s.getBuffer();
19 int32_t len = s.length();
20 u_UCharsToChars(u, ch, len);
21 ch[len] = 0; /* include terminating \0 */
22 return atoi(ch);
23}
24
25U_CDECL_BEGIN
26void U_CALLCONV
27deleteResBund(void *obj) {
28 delete (ResourceBundle *)obj;
29}
30U_CDECL_END
31
32
33RBDataMap::~RBDataMap()
34{
35 delete fData;
36}
37
38RBDataMap::RBDataMap()
39{
40 UErrorCode status = U_ZERO_ERROR;
41 fData = new Hashtable(TRUE, status);
42 fData->setValueDeleter(deleteResBund);
43}
44
45// init from table resource
46// will put stuff in hashtable according to
47// keys.
48RBDataMap::RBDataMap(UResourceBundle *data, UErrorCode &status)
49{
50 fData = new Hashtable(TRUE, status);
51 fData->setValueDeleter(deleteResBund);
52 init(data, status);
53}
54
55// init from headers and resource
56// with checking the whether the size of resource matches
57// header size
58RBDataMap::RBDataMap(UResourceBundle *headers, UResourceBundle *data, UErrorCode &status)
59{
60 fData = new Hashtable(TRUE, status);
61 fData->setValueDeleter(deleteResBund);
62 init(headers, data, status);
63}
64
65
66void RBDataMap::init(UResourceBundle *data, UErrorCode &status) {
67 int32_t i = 0;
68 fData->removeAll();
69 UResourceBundle *t = NULL;
70 for(i = 0; i < ures_getSize(data); i++) {
71 t = ures_getByIndex(data, i, t, &status);
72 fData->put(UnicodeString(ures_getKey(t), ""), new ResourceBundle(t, status), status);
73 }
74 ures_close(t);
75}
76
77void RBDataMap::init(UResourceBundle *headers, UResourceBundle *data, UErrorCode &status)
78{
79 int32_t i = 0;
80 fData->removeAll();
81 UResourceBundle *t = NULL;
82 const UChar *key = NULL;
83 int32_t keyLen = 0;
84 if(ures_getSize(headers) == ures_getSize(data)) {
85 for(i = 0; i < ures_getSize(data); i++) {
86 t = ures_getByIndex(data, i, t, &status);
87 key = ures_getStringByIndex(headers, i, &keyLen, &status);
88 fData->put(UnicodeString(key, keyLen), new ResourceBundle(t, status), status);
89 }
90 } else {
91 // error
92 status = U_INVALID_FORMAT_ERROR;
93 }
94 ures_close(t);
95}
96
374ca955 97const ResourceBundle *RBDataMap::getItem(const char* key, UErrorCode &status) const
b75a7d8f 98{
374ca955
A
99 if(U_FAILURE(status)) {
100 return NULL;
101 }
102
b75a7d8f 103 UnicodeString hashKey(key, "");
374ca955 104 const ResourceBundle *r = (ResourceBundle *)fData->get(hashKey);
b75a7d8f 105 if(r != NULL) {
374ca955
A
106 return r;
107 } else {
108 status = U_MISSING_RESOURCE_ERROR;
109 return NULL;
110 }
111}
112
113const UnicodeString RBDataMap::getString(const char* key, UErrorCode &status) const
114{
115 const ResourceBundle *r = getItem(key, status);
116 if(U_SUCCESS(status)) {
b75a7d8f
A
117 return r->getString(status);
118 } else {
119 status = U_MISSING_RESOURCE_ERROR;
374ca955
A
120 return UnicodeString();
121 }
122}
123
124int32_t
125RBDataMap::getInt28(const char* key, UErrorCode &status) const
126{
127 const ResourceBundle *r = getItem(key, status);
128 if(U_SUCCESS(status)) {
129 return r->getInt(status);
130 } else {
131 return 0;
132 }
133}
134
135uint32_t
136RBDataMap::getUInt28(const char* key, UErrorCode &status) const
137{
138 const ResourceBundle *r = getItem(key, status);
139 if(U_SUCCESS(status)) {
140 return r->getUInt(status);
141 } else {
142 return 0;
b75a7d8f
A
143 }
144}
145
374ca955
A
146const int32_t *
147RBDataMap::getIntVector(int32_t &length, const char *key, UErrorCode &status) const {
148 const ResourceBundle *r = getItem(key, status);
149 if(U_SUCCESS(status)) {
150 return r->getIntVector(length, status);
151 } else {
152 return NULL;
153 }
154}
155
156const uint8_t *
157RBDataMap::getBinary(int32_t &length, const char *key, UErrorCode &status) const {
158 const ResourceBundle *r = getItem(key, status);
159 if(U_SUCCESS(status)) {
160 return r->getBinary(length, status);
161 } else {
162 return NULL;
163 }
164}
b75a7d8f
A
165
166int32_t RBDataMap::getInt(const char* key, UErrorCode &status) const
167{
b75a7d8f
A
168 UnicodeString r = this->getString(key, status);
169 if(U_SUCCESS(status)) {
374ca955
A
170 return utoi(r);
171 } else {
172 return 0;
b75a7d8f 173 }
b75a7d8f
A
174}
175
176const UnicodeString* RBDataMap::getStringArray(int32_t& count, const char* key, UErrorCode &status) const
177{
374ca955
A
178 const ResourceBundle *r = getItem(key, status);
179 if(U_SUCCESS(status)) {
b75a7d8f
A
180 int32_t i = 0;
181
182 count = r->getSize();
374ca955
A
183 if(count <= 0) {
184 return NULL;
185 }
186
b75a7d8f
A
187 UnicodeString *result = new UnicodeString[count];
188 for(i = 0; i<count; i++) {
189 result[i] = r->getStringEx(i, status);
190 }
191 return result;
192 } else {
193 status = U_MISSING_RESOURCE_ERROR;
194 return NULL;
195 }
196}
197
198const int32_t* RBDataMap::getIntArray(int32_t& count, const char* key, UErrorCode &status) const
199{
374ca955
A
200 const ResourceBundle *r = getItem(key, status);
201 if(U_SUCCESS(status)) {
b75a7d8f
A
202 int32_t i = 0;
203
204 count = r->getSize();
374ca955
A
205 if(count <= 0) {
206 return NULL;
207 }
208
b75a7d8f
A
209 int32_t *result = new int32_t[count];
210 UnicodeString stringRes;
211 for(i = 0; i<count; i++) {
212 stringRes = r->getStringEx(i, status);
213 result[i] = utoi(stringRes);
214 }
215 return result;
216 } else {
217 status = U_MISSING_RESOURCE_ERROR;
218 return NULL;
219 }
220}