ICU-1948 Fixed incorrectly assigning keys to directly accessed resources

X-SVN-Rev: 9440
This commit is contained in:
Vladimir Weinstein 2002-07-30 20:49:30 +00:00
parent 69d22e1603
commit 484b577415
4 changed files with 36 additions and 11 deletions

View File

@ -546,6 +546,7 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r,
/* first, open the bundle with real data */
UResourceBundle *mainRes = ures_openDirect(path, locale, status);
UResourceBundle *result = NULL;
const char* temp = NULL;
if(keyPath == NULL) {
/* no key path. This means that we are going to
@ -557,7 +558,7 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r,
*/
const char* aKey = parent->fResPath;
if(aKey) {
r = res_findResource(&(mainRes->fResData), mainRes->fRes, &aKey);
r = res_findResource(&(mainRes->fResData), mainRes->fRes, &aKey, &temp);
} else {
r = mainRes->fRes;
}
@ -566,7 +567,7 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r,
* current key, if there is a key associated
*/
aKey = key;
r = res_findResource(&(mainRes->fResData), r, &aKey);
r = res_findResource(&(mainRes->fResData), r, &aKey, &temp);
} else if(index != -1) {
/* if there is no key, but there is an index, try to get by the index */
/* here we have either a table or an array, so get the element */
@ -592,7 +593,7 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r,
*/
result = mainRes;
while(*keyPath) {
r = res_findResource(&(result->fResData), result->fRes, (const char**)&keyPath);
r = res_findResource(&(result->fResData), result->fRes, (const char**)&keyPath, &temp);
if(r == RES_BOGUS) {
*status = U_MISSING_RESOURCE_ERROR;
result = resB;
@ -1089,6 +1090,7 @@ ures_findSubResource(const UResourceBundle *resB, const char* path, UResourceBun
Resource res = RES_BOGUS;
UResourceBundle *result = fillIn;
const char *pathToResource = path;
const char *key;
if(status == NULL || U_FAILURE(*status)) {
return result;
@ -1096,10 +1098,10 @@ ures_findSubResource(const UResourceBundle *resB, const char* path, UResourceBun
/* here we do looping and circular alias checking */
res = res_findResource(&(resB->fResData), resB->fRes, &pathToResource);
res = res_findResource(&(resB->fResData), resB->fRes, &pathToResource, &key);
if(res != RES_BOGUS) {
result = init_resb_result(&(resB->fResData), res, path, -1, resB->fData, resB, 0, fillIn, status);
result = init_resb_result(&(resB->fResData), res, key, -1, resB->fData, resB, 0, fillIn, status);
} else {
*status = U_MISSING_RESOURCE_ERROR;
}

View File

@ -115,7 +115,7 @@ _res_findTableItem(const Resource *pRoot, const Resource res, const char *key) {
}
static Resource
_res_findTableItemN(const Resource *pRoot, const Resource res, const char *key, int32_t keyLen) {
_res_findTableItemN(const Resource *pRoot, const Resource res, const char *key, int32_t keyLen, const char **realKey) {
uint16_t *p=(uint16_t *)RES_GET_POINTER(pRoot, res);
uint16_t i, start, limit;
@ -138,9 +138,11 @@ _res_findTableItemN(const Resource *pRoot, const Resource res, const char *key,
/* did we really find it? */
if(uprv_strncmp(key, RES_GET_KEY(pRoot, p[start]), keyLen)==0) {
*realKey = RES_GET_KEY(pRoot, p[start]);
limit=*(p-1); /* itemCount */
return ((Resource *)(p+limit+(~limit&1)))[start];
} else {
*realKey = NULL;
return RES_BOGUS; /* not found */
}
}
@ -317,7 +319,7 @@ res_getArrayItem(const ResourceData *pResData, Resource array, const int32_t ind
}
U_CFUNC Resource
res_findResource(const ResourceData *pResData, Resource r, const char** path) {
res_findResource(const ResourceData *pResData, Resource r, const char** path, const char** key) {
/* we pass in a path. CollationElements/Sequence or zoneStrings/3/2 etc.
* iterates over a path and stops when a scalar resource is found. This
* CAN be an alias. Path gets set to the part that has not yet been processed.
@ -349,17 +351,18 @@ res_findResource(const ResourceData *pResData, Resource r, const char** path) {
/* if the resource is a table */
/* try the key based access */
if(type == RES_TABLE) {
t2 = _res_findTableItemN(pResData->pRoot, t1, pathP, keyLen);
t2 = _res_findTableItemN(pResData->pRoot, t1, pathP, keyLen, key);
if(t2 == RES_BOGUS) {
/* if we fail to get the resource by key, maybe we got an index */
indexR = uprv_strtol(pathP, &closeIndex, 10);
if(closeIndex != pathP) {
/* if we indeed have an index, try to get the item by index */
t2 = _res_getTableItem(pResData->pRoot, t1, (uint16_t)indexR);
t2 = res_getTableItemByIndex(pResData, t1, indexR, key);
}
}
} else if(type == RES_ARRAY) {
t2 = _res_getArrayItem(pResData->pRoot, t1, indexR);
*key = NULL;
} else { /* can't do much here, except setting t2 to bogus */
t2 = RES_BOGUS;
}

View File

@ -113,6 +113,6 @@ U_CFUNC int32_t res_getTableSize(const ResourceData *pResData, Resource table);
U_CFUNC Resource res_getArrayItem(const ResourceData *pResData, Resource array, const int32_t indexS);
U_CFUNC Resource res_getTableItemByIndex(const ResourceData *pResData, Resource table, int32_t indexS, const char ** key);
U_CFUNC Resource res_getTableItemByKey(const ResourceData *pResData, Resource table, int32_t *indexS, const char* * key);
U_CFUNC Resource res_findResource(const ResourceData *pResData, Resource r, const char** path);
U_CFUNC Resource res_findResource(const ResourceData *pResData, Resource r, const char** path, const char** key);
#endif

View File

@ -1810,23 +1810,38 @@ static void TestResourceLevelAliasing(void) {
static void TestDirectAccess(void) {
UErrorCode status = U_ZERO_ERROR;
UResourceBundle *t = NULL, *t2 = NULL;
const char* key = NULL;
t = ures_findResource("en/zoneStrings/3/2", t, &status);
if(U_FAILURE(status)) {
log_err("Couldn't access indexed resource, error %s\n", u_errorName(status));
status = U_ZERO_ERROR;
} else {
key = ures_getKey(t);
if(key != NULL) {
log_err("Got a strange key, expected NULL, got %s\n", key);
}
}
t = ures_findResource("en/zoneStrings/3", t, &status);
if(U_FAILURE(status)) {
log_err("Couldn't access indexed resource, error %s\n", u_errorName(status));
status = U_ZERO_ERROR;
} else {
key = ures_getKey(t);
if(key != NULL) {
log_err("Got a strange key, expected NULL, got %s\n", key);
}
}
t = ures_findResource("sh/CollationElements/Sequence", t, &status);
if(U_FAILURE(status)) {
log_err("Couldn't access keyed resource, error %s\n", u_errorName(status));
status = U_ZERO_ERROR;
} else {
key = ures_getKey(t);
if(strcmp(key, "Sequence")!=0) {
log_err("Got a strange key, expected 'Sequence', got %s\n", key);
}
}
t2 = ures_open(NULL, "sh", &status);
@ -1839,6 +1854,11 @@ static void TestDirectAccess(void) {
if(U_FAILURE(status)) {
log_err("Couldn't access keyed resource, error %s\n", u_errorName(status));
status = U_ZERO_ERROR;
} else {
key = ures_getKey(t);
if(strcmp(key, "Sequence")!=0) {
log_err("Got a strange key, expected 'Sequence', got %s\n", key);
}
}
ures_close(t);