U_CAPI Resource U_EXPORT2 res_getArrayItem(const ResourceData *pResData, Resource array, int32_t indexR) { uint32_t offset=RES_GET_OFFSET(array); U_ASSERT(indexR>=0); /* to ensure the index is not negative */ switch(RES_GET_TYPE(array)) { case URES_ARRAY: { if (offset!=0) { /* empty if offset==0 */ const int32_t *p= pResData->pRoot+offset; if(indexR<*p) { return (Resource)p[1+indexR]; } } break; } case URES_ARRAY16: { const uint16_t *p=pResData->p16BitUnits+offset; if(indexR<*p) { return URES_MAKE_RESOURCE(URES_STRING_V2, p[1+indexR]); } break; } default: break; } return RES_BOGUS; }
U_CAPI Resource U_EXPORT2 res_getArrayItem(const ResourceData * pResData, Resource array, int32_t indexR) { uint32_t offset = RES_GET_OFFSET(array); switch (RES_GET_TYPE(array)) { case URES_ARRAY: { const int32_t * p = offset == 0 ? &gEmpty32 : pResData->pRoot + offset; if (indexR < *p) { return (Resource)p[1 + indexR]; } break; } case URES_ARRAY16: { const uint16_t * p = pResData->p16BitUnits + offset; if (indexR < *p) { return URES_MAKE_RESOURCE(URES_STRING_V2, p[1 + indexR]); } break; } default: break; } return RES_BOGUS; }
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; }
U_CAPI Resource U_EXPORT2 res_getTableItemByKey(const ResourceData * pResData, Resource table, int32_t * indexR, const char ** key) { uint32_t offset = RES_GET_OFFSET(table); int32_t length; int32_t idx; if (key == NULL || *key == NULL) { return RES_BOGUS; } switch (RES_GET_TYPE(table)) { case URES_TABLE: { const uint16_t * p = offset == 0 ? &gEmpty16 : (const uint16_t *)(pResData->pRoot + offset); length = *p++; *indexR = idx = _res_findTableItem(pResData, p, length, *key, key); if (idx >= 0) { const Resource * p32 = (const Resource *)(p + length + (~length & 1)); return p32[idx]; } break; } case URES_TABLE16: { const uint16_t * p = pResData->p16BitUnits + offset; length = *p++; *indexR = idx = _res_findTableItem(pResData, p, length, *key, key); if (idx >= 0) { return URES_MAKE_RESOURCE(URES_STRING_V2, p[length + idx]); } break; } case URES_TABLE32: { const int32_t * p = offset == 0 ? &gEmpty32 : pResData->pRoot + offset; length = *p++; *indexR = idx = _res_findTable32Item(pResData, p, length, *key, key); if (idx >= 0) { return (Resource)p[length + idx]; } break; } default: break; } return RES_BOGUS; }