static void CM_NEAR freeSymbols(const void *symbol, SessionGlobalDataPtr sessionData) { void *lLink, *rLink; if (symbol) { /* if we got a symbol... */ lLink = ((SymbolLinksPtr)symbol)->lLink; /* get the two links... */ rLink = ((SymbolLinksPtr)symbol)->rLink; freeSymbols(lLink, sessionData); /* ...follow the left link down */ SessionFree(symbol); /* ...free a symbol */ freeSymbols(rLink, sessionData); /* ...do same for the right links */ } }
// ============================================================================ bool loadSymbols(void) { if (bSymbolsLoaded == false) { if (loadScilabDlls()) { dynlib_Windows_Main = (Windows_MainPROC) GetProcAddress(hScilab_WindowsDll, WINDOWS_MAIN); dynlib_setVisibleMainWindow = (setVisibleMainWindowPROC) GetProcAddress(hGuiDll, SETVISIBLEMAINWINDOW); dynlib_StorePrioritaryCommandWithFlag = (StorePrioritaryCommandWithFlagPROC) GetProcAddress(hLibScilabDll, STOREPRIORITYCOMMANDWITHFLAG); dynlib_isEmptyCommandQueue = (isEmptyCommandQueuePROC) GetProcAddress(hLibScilabDll, ISEMPTYCOMMANDQUEUE); dynlib_scirun = (scirunPROC) GetProcAddress(hLibScilabDll, SCIRUN); pvApiCtx = (StrCtx *)(GetProcAddress(hApi_ScilabDll, "pvApiCtx")); dynlib_createNamedScalarDouble = (createNamedScalarDoublePROC) GetProcAddress(hApi_ScilabDll, CREATENAMEDSCALARDOUBLE); dynlib_isNamedVarExist = (isNamedVarExistPROC) GetProcAddress(hApi_ScilabDll, ISNAMEDVAREXIST); dynlib_isNamedEmptyMatrix = (isNamedEmptyMatrixPROC) GetProcAddress(hApi_ScilabDll, ISNAMEDEMPTYMATRIX); dynlib_getNamedScalarDouble = (getNamedScalarDoublePROC) GetProcAddress(hApi_ScilabDll, GETNAMEDSCALARDOUBLE); dynlib_createNamedSingleWideString = (createNamedSingleWideStringPROC) GetProcAddress(hApi_ScilabDll, CREATENAMEDSINGLEWIDESTRING); dynlib_getAllocatedNamedSingleWideString = (getAllocatedNamedSingleWideStringPROC)GetProcAddress(hApi_ScilabDll, GETALLOCATEDNAMEDSINGLEWIDESTRING); dynlib_freeAllocatedSingleWideString = (freeAllocatedSingleWideStringPROC)GetProcAddress(hApi_ScilabDll, FREEALLOCATEDSINGLEWIDESTRING); dynlib_getNamedScalarBoolean = (getNamedScalarBooleanPROC)GetProcAddress(hApi_ScilabDll, GETNAMEDSCALARBOOLEAN); dynlib_createNamedScalarBoolean = (createNamedScalarBooleanPROC)GetProcAddress(hApi_ScilabDll, CREATENAMEDSCALARBOOLEAN); dynlib_readNamedComplexMatrixOfDouble = (readNamedComplexMatrixOfDoublePROC)GetProcAddress(hApi_ScilabDll, READNAMEDCOMPLEXMATRIXOFDOUBLE); dynlib_createNamedMatrixOfDouble = (createNamedMatrixOfDoublePROC)GetProcAddress(hApi_ScilabDll, CREATENAMEDMATRIXOFDOUBLE); dynlib_readNamedMatrixOfDouble = (readNamedMatrixOfDoublePROC)GetProcAddress(hApi_ScilabDll, READNAMEDMATRIXOFDOUBLE); dynlib_getLastErrorValue = (getLastErrorValuePROC) GetProcAddress(hOutput_StreamDll, GETLASTERRORVALUE); if (dynlib_Windows_Main && dynlib_setVisibleMainWindow && dynlib_StorePrioritaryCommandWithFlag && dynlib_isEmptyCommandQueue && dynlib_scirun && pvApiCtx && dynlib_createNamedScalarDouble && dynlib_isNamedVarExist && dynlib_isNamedEmptyMatrix && dynlib_getNamedScalarDouble && dynlib_getLastErrorValue && dynlib_createNamedSingleWideString && dynlib_getAllocatedNamedSingleWideString && dynlib_freeAllocatedSingleWideString && dynlib_getNamedScalarBoolean && dynlib_createNamedScalarBoolean && dynlib_readNamedComplexMatrixOfDouble && dynlib_createNamedMatrixOfDouble && dynlib_readNamedMatrixOfDouble) { bSymbolsLoaded = true; } else { bSymbolsLoaded = freeSymbols(false); } } else { bSymbolsLoaded = false; } } return bSymbolsLoaded; }
void cmFreeAllSymbols(void **root, SessionGlobalDataPtr sessionData) { freeSymbols(*root, sessionData); *root = NULL; }