static int freelib(MODLIST *root, AMX *amx, const TCHAR *name) { MODLIST _FAR *item, _FAR *prev; const TCHAR *ptr; int count = 0; ptr = (name != NULL) ? skippath(name) : NULL; for (prev = root, item = prev->next; item != NULL; prev = item, item = prev->next) { if ((amx == NULL || amx == item->amx) && (ptr == NULL || _tcscmp(item->name, ptr) == 0)) { prev->next = item->next; /* unlink first */ assert(item->inst != 0); #if defined HAVE_DYNCALL_H dlFreeLibrary(item->inst); #else FreeLibrary((HINSTANCE)item->inst); #endif assert(item->name != NULL); free(item->name); free(item); count++; } /* if */ } /* for */ #if defined HAVE_DYNCALL_H if (root->next==NULL && dcVM!=NULL) { /* free the VM after closing the last DLL/library */ dcFree(dcVM); dcVM=NULL; } /* if */ #endif return count; }
int main(int argc, char* argv[]) { DCCallVM* vm; DCValue ret; int r = 1; dcTest_initPlatform(); /* allocate call vm */ vm = dcNewCallVM(4096); /* calls using 'formatted' API */ dcReset(vm); printf("callf iii)i: "); dcCallF(vm, &ret, (void*)&vf_iii, "iii)i", 1, 2, 3); r = ret.i && r; dcReset(vm); printf("\ncallf ffiffiffi)i: "); dcCallF(vm, &ret, (void*)&vf_ffiffiffi, "ffiffiffi)i", 1.f, 2.f, 3, 4.f, 5.f, 6, 7.f, 8.f, 9); r = ret.i && r; /* arg binding then call using 'formatted' API */ dcReset(vm); printf("\nargf iii)i then call: "); dcArgF(vm, "iii)i", 1, 2, 3); r = r && dcCallInt(vm, (void*)&vf_iii); dcReset(vm); printf("\nargf iii then call: "); dcArgF(vm, "iii", 1, 2, 3); r = r && dcCallInt(vm, (void*)&vf_iii); dcReset(vm); printf("\nargf ffiffiffi)i then call: "); dcArgF(vm, "ffiffiffi)i", 1.f, 2.f, 3, 4.f, 5.f, 6, 7.f, 8.f, 9); r = r && dcCallInt(vm, (void*)&vf_ffiffiffi); dcReset(vm); printf("\nargf ffiffiffi then call: "); dcArgF(vm, "ffiffiffi", 1.f, 2.f, 3, 4.f, 5.f, 6, 7.f, 8.f, 9); r = r && dcCallInt(vm, (void*)&vf_ffiffiffi); /* free vm */ dcFree(vm); printf("\nresult: callf: %d\n", r); dcTest_deInitPlatform(); return 0; }
float forwardCaller(void* cb, float value) { DCCallVM* vm = dcNewCallVM(1024); dcReset(vm); dcArgPointer(vm, NULL); dcArgPointer(vm, NULL); dcArgPointer(vm, cb); dcArgFloat(vm, value); float res = dcCallFloat(vm, forwardFloatCall); dcFree(vm); return res; }
int main(int argc, char* argv[]) { DCCallVM* vm; DCValue r; dcTest_initPlatform(); /* allocate call vm */ vm = dcNewCallVM(4096); /* call using 'formatted' API */ dcCallF(vm, &r, (void*) &vf_iii, "iii)i", 1, 2, 3); /* free vm */ dcFree(vm); printf("result: callf: %d\n", r.i); dcTest_deInitPlatform(); return 0; }
void FreeCallTempStruct(CallTempStruct* s) { dcFree(s->vm); }
SEXP r_dcFree(SEXP callvm) { DCCallVM* pvm = R_ExternalPtrAddr(callvm); dcFree(pvm); return R_NilValue; }