]> git.saurik.com Git - apple/icu.git/blob - icuSources/tools/ctestfw/datamap.cpp
ICU-6.2.22.tar.gz
[apple/icu.git] / icuSources / tools / ctestfw / datamap.cpp
1 /********************************************************************
2 * COPYRIGHT:
3 * Copyright (c) 2002-2004, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 ********************************************************************/
6
7 /* Created by weiv 05/09/2002 */
8
9 #include "unicode/datamap.h"
10 #include "unicode/resbund.h"
11 #include "hash.h"
12 #include <stdlib.h>
13
14 int32_t
15 DataMap::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
25 U_CDECL_BEGIN
26 void U_CALLCONV
27 deleteResBund(void *obj) {
28 delete (ResourceBundle *)obj;
29 }
30 U_CDECL_END
31
32
33 RBDataMap::~RBDataMap()
34 {
35 delete fData;
36 }
37
38 RBDataMap::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.
48 RBDataMap::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
58 RBDataMap::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
66 void 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
77 void 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
97 const ResourceBundle *RBDataMap::getItem(const char* key, UErrorCode &status) const
98 {
99 if(U_FAILURE(status)) {
100 return NULL;
101 }
102
103 UnicodeString hashKey(key, "");
104 const ResourceBundle *r = (ResourceBundle *)fData->get(hashKey);
105 if(r != NULL) {
106 return r;
107 } else {
108 status = U_MISSING_RESOURCE_ERROR;
109 return NULL;
110 }
111 }
112
113 const UnicodeString RBDataMap::getString(const char* key, UErrorCode &status) const
114 {
115 const ResourceBundle *r = getItem(key, status);
116 if(U_SUCCESS(status)) {
117 return r->getString(status);
118 } else {
119 status = U_MISSING_RESOURCE_ERROR;
120 return UnicodeString();
121 }
122 }
123
124 int32_t
125 RBDataMap::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
135 uint32_t
136 RBDataMap::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;
143 }
144 }
145
146 const int32_t *
147 RBDataMap::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
156 const uint8_t *
157 RBDataMap::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 }
165
166 int32_t RBDataMap::getInt(const char* key, UErrorCode &status) const
167 {
168 UnicodeString r = this->getString(key, status);
169 if(U_SUCCESS(status)) {
170 return utoi(r);
171 } else {
172 return 0;
173 }
174 }
175
176 const UnicodeString* RBDataMap::getStringArray(int32_t& count, const char* key, UErrorCode &status) const
177 {
178 const ResourceBundle *r = getItem(key, status);
179 if(U_SUCCESS(status)) {
180 int32_t i = 0;
181
182 count = r->getSize();
183 if(count <= 0) {
184 return NULL;
185 }
186
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
198 const int32_t* RBDataMap::getIntArray(int32_t& count, const char* key, UErrorCode &status) const
199 {
200 const ResourceBundle *r = getItem(key, status);
201 if(U_SUCCESS(status)) {
202 int32_t i = 0;
203
204 count = r->getSize();
205 if(count <= 0) {
206 return NULL;
207 }
208
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 }