#define PERL_NO_GET_CONTEXT #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" typedef struct { const char * key; unsigned long hash; const signed long klen; } hvCacheKeyStruct; typedef struct { hvCacheKeyStruct jiugsdh1; hvCacheKeyStruct iusidfsd2; hvCacheKeyStruct ihfsdgsfg3; hvCacheKeyStruct sudfyf4; hvCacheKeyStruct sfyuihldfss5; hvCacheKeyStruct iuodafohsd6; hvCacheKeyStruct kjsdjdfsj7; hvCacheKeyStruct layer1; hvCacheKeyStruct layer2; hvCacheKeyStruct layer3; } hvCacheStruct; #define HVCKSINIT(keyname) {#keyname, 0, sizeof(#keyname)-1 } static hvCacheStruct hvCache = { HVCKSINIT(jiugsdh1), HVCKSINIT(iusidfsd2), HVCKSINIT(ihfsdgsfg3), HVCKSINIT(sudfyf4), HVCKSINIT(sfyuihldfss5), HVCKSINIT(iuodafohsd6), HVCKSINIT(kjsdjdfsj7), HVCKSINIT(layer1), HVCKSINIT(layer2), HVCKSINIT(layer3) }; #undef HVCKSINIT #define HVKC_KEY(x) (hvCache.x.key) #define HVKC_KLEN(x) (hvCache.x.klen) #define HVKC_HASH(x) (hvCache.x.hash) #define HVKC_ARR_KEY(x) ((((hvCacheKeyStruct*)&(hvCache))+(x))->key) #define HVKC_ARR_KLEN(x) ((((hvCacheKeyStruct*)&(hvCache))+(x))->klen) #define HVKC_ARR_HASH(x) ((((hvCacheKeyStruct*)&(hvCache))+(x))->hash) #define hvkc_hv_fetch(hv, key, klen, lval, hash) \ ((SV**) hv_common_key_len((hv), (key), (klen), (lval) \ ? (HV_FETCH_JUST_SV | HV_FETCH_LVALUE) \ : HV_FETCH_JUST_SV, NULL, (hash))) #define hvkc_hv_fetch_kc(hv, key, lval) \ ((SV**) hv_common_key_len((hv), (HVKC_KEY(key)), (HVKC_KLEN(key)), (lval) \ ? (HV_FETCH_JUST_SV | HV_FETCH_LVALUE) \ : HV_FETCH_JUST_SV, NULL, (HVKC_HASH(key)))) void initializeHVCache(pTHX) { unsigned long i; const unsigned long arraylength = sizeof(hvCacheStruct)/sizeof(hvCacheKeyStruct); for(i=0; ikey, (((hvCacheKeyStruct*)&(hvCache))+i)->hash, (((hvCacheKeyStruct*)&(hvCache))+i)->klen ); PERL_HASH( ((((hvCacheKeyStruct*)&(hvCache))+i)->hash), ((((hvCacheKeyStruct*)&(hvCache))+i)->key), ((((hvCacheKeyStruct*)&(hvCache))+i)->klen) ); printf("initializeHVCache after %s hash=%u klen=%u\n", (((hvCacheKeyStruct*)&(hvCache))+i)->key, (((hvCacheKeyStruct*)&(hvCache))+i)->hash, (((hvCacheKeyStruct*)&(hvCache))+i)->klen ); } } MODULE = XHVKC PACKAGE = XHVKC BOOT: initializeHVCache(aTHX); void get(self, num) SV * self unsigned long num PREINIT: void * voidPtr = 0; char * finalKeyName; unsigned long finalKeyNameLen; CODE: if (SvROK((HV*)self) && SvTYPE(SvRV((HV*)self))==SVt_PVHV) self = SvRV((HV*)self); else Perl_croak(aTHX_ "%s: %s is not a hash reference", "XHVKC::get", "self"); #define SWITCHMACRO(num,key) case (num): finalKeyName = #key; finalKeyNameLen = sizeof(#key)-1; break; switch(num){ SWITCHMACRO(1,jiugsdh1) SWITCHMACRO(2,iusidfsd2) SWITCHMACRO(3,ihfsdgsfg3) SWITCHMACRO(4,sudfyf4) SWITCHMACRO(5,sfyuihldfss5) SWITCHMACRO(6,iuodafohsd6) SWITCHMACRO(7,kjsdjdfsj7) #undef SWITCHMACRO default: printf("huh?"); exit(1); } (SV **)voidPtr = hvkc_hv_fetch((HV *)self, "layer1", sizeof("layer1")-1, 0,0); if(voidPtr){ (SV *)voidPtr = *(SV **)voidPtr; if (SvROK((SV *)voidPtr)){ (SV *)voidPtr = SvRV((SV *)voidPtr); if (SvTYPE((SV *)voidPtr)==SVt_PVHV) { (SV **)voidPtr = hvkc_hv_fetch((HV *)voidPtr, "layer2", sizeof("layer2")-1,0,0); if(voidPtr) { (SV *)voidPtr = *(SV **)voidPtr; if (SvROK((SV *)voidPtr)){ (SV *)voidPtr = SvRV((SV *)voidPtr); if (SvTYPE((SV *)voidPtr)==SVt_PVHV) { (SV **)voidPtr = hvkc_hv_fetch((HV *)voidPtr, "layer3", sizeof("layer3")-1,0,0); if(voidPtr) { (SV *)voidPtr = *(SV **)voidPtr; if (SvROK((SV *)voidPtr)){ (SV *)voidPtr = SvRV((SV *)voidPtr); if (SvTYPE((SV *)voidPtr)==SVt_PVHV) { (SV **)voidPtr = hvkc_hv_fetch((HV *)voidPtr, finalKeyName, finalKeyNameLen,0,0); if(voidPtr) { voidPtr = (void *)SvIV(*(SV **)voidPtr); } //else stays null } else {voidPtr = NULL;} } else {voidPtr = NULL;} } //else stays null } else {voidPtr = NULL;} } else {voidPtr = NULL;} } //else stays null } else {voidPtr = NULL;} } else {voidPtr = NULL;} } //else stays null if(voidPtr != (void *)999) { printf("wrong number at end of hash tree"); exit(1); } void getKC(self, num) SV * self unsigned long num PREINIT: void * voidPtr = 0; CODE: if (SvROK((HV*)self) && SvTYPE(SvRV((HV*)self))==SVt_PVHV) self = SvRV((HV*)self); else Perl_croak(aTHX_ "%s: %s is not a hash reference", "XHVKC::get", "self"); (SV **)voidPtr = hvkc_hv_fetch_kc((HV *)self, layer1,0); if(voidPtr){ (SV *)voidPtr = *(SV **)voidPtr; if (SvROK((SV *)voidPtr)){ (SV *)voidPtr = SvRV((SV *)voidPtr); if (SvTYPE((SV *)voidPtr)==SVt_PVHV) { (SV **)voidPtr = hvkc_hv_fetch_kc((HV *)voidPtr, layer2,0); if(voidPtr) { (SV *)voidPtr = *(SV **)voidPtr; if (SvROK((SV *)voidPtr)){ (SV *)voidPtr = SvRV((SV *)voidPtr); if (SvTYPE((SV *)voidPtr)==SVt_PVHV) { (SV **)voidPtr = hvkc_hv_fetch_kc((HV *)voidPtr, layer3,0); if(voidPtr) { (SV *)voidPtr = *(SV **)voidPtr; if (SvROK((SV *)voidPtr)){ (SV *)voidPtr = SvRV((SV *)voidPtr); if (SvTYPE((SV *)voidPtr)==SVt_PVHV) { num -= 1; (SV **)voidPtr = hvkc_hv_fetch((HV *)voidPtr, HVKC_ARR_KEY(num), HVKC_ARR_KLEN(num), 0, HVKC_ARR_HASH(num)); if(voidPtr) { voidPtr = (void *)SvIV(*(SV **)voidPtr); } //else stays null } else {voidPtr = NULL;} } else {voidPtr = NULL;} } //else stays null } else {voidPtr = NULL;} } else {voidPtr = NULL;} } //else stays null } else {voidPtr = NULL;} } else {voidPtr = NULL;} } //else stays null if(voidPtr != (void *)999) { printf("wrong number at end of hash tree"); exit(1); }