U_CAPI Resource U_EXPORT2 res_getTableItemByIndex(const ResourceData * pResData, Resource table, int32_t indexR, const char ** key) { uint32_t offset = RES_GET_OFFSET(table); int32_t length; switch (RES_GET_TYPE(table)) { case URES_TABLE: { const uint16_t * p = offset == 0 ? &gEmpty16 : (const uint16_t *)(pResData->pRoot + offset); length = *p++; if (indexR < length) { const Resource * p32 = (const Resource *)(p + length + (~length & 1)); if (key != NULL) { *key = RES_GET_KEY16(pResData, p[indexR]); } return p32[indexR]; } break; } case URES_TABLE16: { const uint16_t * p = pResData->p16BitUnits + offset; length = *p++; if (indexR < length) { if (key != NULL) { *key = RES_GET_KEY16(pResData, p[indexR]); } return URES_MAKE_RESOURCE(URES_STRING_V2, p[length + indexR]); } break; } case URES_TABLE32: { const int32_t * p = offset == 0 ? &gEmpty32 : pResData->pRoot + offset; length = *p++; if (indexR < length) { if (key != NULL) { *key = RES_GET_KEY32(pResData, p[indexR]); } return (Resource)p[length + indexR]; } break; } default: break; } return RES_BOGUS; }
static int32_t _res_findTableItem(const ResourceData *pResData, const uint16_t *keyOffsets, int32_t length, const char *key, const char **realKey) { const char *tableKey; int32_t mid, start, limit; int result; /* do a binary search for the key */ start=0; limit=length; while(start<limit) { mid = (start + limit) / 2; tableKey = RES_GET_KEY16(pResData, keyOffsets[mid]); if (pResData->useNativeStrcmp) { result = uprv_strcmp(key, tableKey); } else { result = uprv_compareInvCharsAsAscii(key, tableKey); } if (result < 0) { limit = mid; } else if (result > 0) { start = mid + 1; } else { /* We found it! */ *realKey=tableKey; return mid; } } return URESDATA_ITEM_NOT_FOUND; /* not found or table is empty. */ }