#include <stddef.h>
#include <aes.h>

#define FALSE 0
#define TRUE  1

int rsrc_gobject(RSHDR *rsc, int re_gtype, int re_gindex, void **gaddr )
{
	*gaddr = NULL;
	switch (re_gtype)
	{
		case R_TREE     :
			if ((re_gindex >= 0) && (re_gindex < rsc->rsh_ntree))
			{
				*gaddr = ((OBJECT**)(rsc->rsh_trindex + (long)rsc))[re_gindex];
				return(TRUE);
			}
			break;
		case R_OBJECT   :
			if ((re_gindex >= 0) && (re_gindex < rsc->rsh_nobs))
			{
				*gaddr = (OBJECT*)(rsc->rsh_object + (long)rsc + sizeof(OBJECT)*re_gindex);
				return(TRUE);
			}
			break;
		case R_TEDINFO  :
			if ((re_gindex >= 0) && (re_gindex < rsc->rsh_nted))
			{
				*gaddr = (TEDINFO*)(rsc->rsh_tedinfo + (long)rsc + sizeof(TEDINFO)*re_gindex);
				return(TRUE);
			}
			break;
		case R_ICONBLK  :
			if ((re_gindex >= 0) && (re_gindex < rsc->rsh_nib))
			{
				*gaddr = (ICONBLK*)(rsc->rsh_iconblk + (long)rsc + 34UL*re_gindex); /* 34 = (sizeof(ICONBLK)-2) */
				return(TRUE);
			}
			break;
		case R_BITBLK   :
			if ((re_gindex >= 0) && (re_gindex < rsc->rsh_nbb))
			{
				*gaddr = (BITBLK*)(rsc->rsh_bitblk + (long)rsc + sizeof(BITBLK)*re_gindex);
				return(TRUE);
			}
			break;
		case R_STRING   :
			if ((re_gindex >= 0) && (re_gindex < rsc->rsh_nstring))
			{
				*gaddr = (char**)(rsc->rsh_string + (long)rsc + sizeof(void*)*re_gindex);
				return(TRUE);
			}
			break;
		case R_IMAGEDATA:
			if ((re_gindex >= 0) && (re_gindex < rsc->rsh_nimages))
			{
				*gaddr = (char**)(rsc->rsh_imdata + (long)rsc + sizeof(void*)*re_gindex);
				return(TRUE);
			}
			break;
		case R_OBSPEC   :
			if ((re_gindex >= 0) && (re_gindex < rsc->rsh_nobs))
			{
				*gaddr = (void*)((OBJECT*)(rsc->rsh_object + (long)rsc + sizeof(OBJECT)*re_gindex))->ob_spec.index;
				return(TRUE);
			}
			break;
		case R_TEPTEXT  :
			if ((re_gindex >= 0) && (re_gindex < rsc->rsh_nted))
			{
				*gaddr = ((TEDINFO*)(rsc->rsh_tedinfo + (long)rsc + sizeof(TEDINFO)*re_gindex))->te_ptext;
				return(TRUE);
			}
			break;
		case R_TEPTMPLT :
			if ((re_gindex >= 0) && (re_gindex < rsc->rsh_nted))
			{
				*gaddr = ((TEDINFO*)(rsc->rsh_tedinfo + (long)rsc + sizeof(TEDINFO)*re_gindex))->te_ptmplt;
				return(TRUE);
			}
			break;
		case R_TEPVALID :
			if ((re_gindex >= 0) && (re_gindex < rsc->rsh_nted))
			{
				*gaddr = ((TEDINFO*)(rsc->rsh_tedinfo + (long)rsc + sizeof(TEDINFO)*re_gindex))->te_pvalid;
				return(TRUE);
			}
			break;
		case R_IBPMASK  :
			if ((re_gindex >= 0) && (re_gindex < rsc->rsh_nib))
			{
				*gaddr = ((ICONBLK*)(rsc->rsh_iconblk + (long)rsc + 34UL*re_gindex))->ib_pmask; /* 34 = (sizeof(ICONBLK)-2) */
				return(TRUE);
			}
			break;
		case R_IBPDATA  :
			if ((re_gindex >= 0) && (re_gindex < rsc->rsh_nib))
			{
				*gaddr = ((ICONBLK*)(rsc->rsh_iconblk + (long)rsc + 34UL*re_gindex))->ib_pdata; /* 34 = (sizeof(ICONBLK)-2) */
				return(TRUE);
			}
			break;
		case R_IPBTEXT  :
			if ((re_gindex >= 0) && (re_gindex < rsc->rsh_nib))
			{
				*gaddr = ((ICONBLK*)(rsc->rsh_iconblk + (long)rsc + 34UL*re_gindex))->ib_ptext; /* 34 = (sizeof(ICONBLK)-2) */
				return(TRUE);
			}
			break;
		case R_BIPDATA  :
			if ((re_gindex >= 0) && (re_gindex < rsc->rsh_nbb))
			{
				*gaddr = ((BITBLK*)(rsc->rsh_bitblk + (long)rsc + sizeof(BITBLK)*re_gindex))->bi_pdata;
				return(TRUE);
			}
			break;
		case R_FRSTR    :
			if ((re_gindex >= 0) && (re_gindex < rsc->rsh_nstring))
			{
				*gaddr = (char**)(rsc->rsh_frstr + (long)rsc + sizeof(void*)*re_gindex);
				return(TRUE);
			}
			break;
		case R_FRIMG    :
			if ((re_gindex >= 0) && (re_gindex < rsc->rsh_nimages))
			{
				*gaddr = (char**)(rsc->rsh_frimg + (long)rsc + sizeof(void*)*re_gindex);
				return(TRUE);
			}
	}
	return(FALSE);
}
