Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
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;
}
Exemplo n.º 4
0
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;
}