Example #1
0
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;
}
Example #2
0
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. */
}