SciErr allocMatrixOfBoolean(void* _pvCtx, int _iVar, int _iRows, int _iCols, int** _piBool) { SciErr sciErr; sciErr.iErr = 0; sciErr.iMsgCount = 0; int *piAddr = NULL; int iNewPos = Top - Rhs + _iVar; int iAddr = *Lstk(iNewPos); //return empty matrix if(_iRows == 0 && _iCols == 0) { double dblReal = 0; sciErr = createMatrixOfDouble(_pvCtx, _iVar, 0, 0, &dblReal); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_CREATE_EMPTY_MATRIX, _("%s: Unable to create variable in Scilab memory"), "createEmptyMatrix"); } return sciErr; } int iMemSize = (int)(((double)(_iRows * _iCols) / 2) + 2); int iFreeSpace = iadr(*Lstk(Bot)) - (iadr(iAddr)); if (iMemSize > iFreeSpace) { addStackSizeError(&sciErr, ((StrCtx*)_pvCtx)->pstName, iMemSize); return sciErr; } getNewVarAddressFromPosition(_pvCtx, iNewPos, &piAddr); fillMatrixOfBoolean(_pvCtx, piAddr, _iRows, _iCols, _piBool); updateInterSCI(_iVar, '$', iAddr, sadr(iadr(iAddr) + 3)); updateLstk(iNewPos, sadr(iadr(iAddr) + 3), (_iRows * _iCols) / (sizeof(double) / sizeof(int))); return sciErr; }
SciErr createCommonMatrixOfPoly(void* _pvCtx, int _iVar, int _iComplex, char* _pstVarName, int _iRows, int _iCols, const int* _piNbCoef, const double* const* _pdblReal, const double* const* _pdblImg) { SciErr sciErr; sciErr.iErr = 0; sciErr.iMsgCount = 0; int *piAddr = NULL; int iSize = _iRows * _iCols; int iNewPos = Top - Rhs + _iVar; int iAddr = *Lstk(iNewPos); int iTotalLen = 0; //return empty matrix if(_iRows == 0 && _iCols == 0) { double dblReal = 0; sciErr = createMatrixOfDouble(_pvCtx, _iVar, 0, 0, &dblReal); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_CREATE_EMPTY_MATRIX, _("%s: Unable to create variable in Scilab memory"), "createEmptyMatrix"); } return sciErr; } getNewVarAddressFromPosition(_pvCtx, iNewPos, &piAddr); sciErr = fillCommonMatrixOfPoly(_pvCtx, piAddr, _pstVarName, _iComplex, _iRows, _iCols, _piNbCoef, _pdblReal, _pdblImg, &iTotalLen); if(sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_CREATE_POLY, _("%s: Unable to create variable in Scilab memory"), _iComplex ? "createComplexMatrixOfPoly" : "createMatrixOfPoly"); return sciErr; } updateInterSCI(_iVar, '$', iAddr, iAddr + 4 + 4 + iSize + 1); updateLstk(iNewPos, iAddr + 4 + 4 + iSize + 1, iTotalLen); return sciErr; }
SciErr allocPointer(void* _pvCtx, int _iVar, void** _pvPtr) { SciErr sciErr; sciErr.iErr = 0; sciErr.iMsgCount = 0; int iNewPos = Top - Rhs + _iVar; int iAddr = *Lstk(iNewPos); int* piAddr = NULL; void* pvPtr = NULL; int iMemSize = 2; int iFreeSpace = iadr(*Lstk(Bot)) - (iadr(iAddr)); if (iMemSize > iFreeSpace) { addStackSizeError(&sciErr, ((StrCtx*)_pvCtx)->pstName, iMemSize); return sciErr; } getNewVarAddressFromPosition(_pvCtx, iNewPos, &piAddr); sciErr = fillPointer(_pvCtx, piAddr, &pvPtr); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_ALLOC_POINTER, _("%s: Unable to create variable in Scilab memory"), "allocPointer"); return sciErr; } *_pvPtr = pvPtr; updateInterSCI(_iVar, '$', iAddr, sadr(iadr(iAddr) + 4)); updateLstk(iNewPos, sadr(iadr(iAddr) + 4), 2); return sciErr; }
SciErr allocCommonSparseMatrix(void* _pvCtx, int _iVar, int _iComplex, int _iRows, int _iCols, int _iNbItem, int** _piNbItemRow, int** _piColPos, double** _pdblReal, double** _pdblImg) { SciErr sciErr; sciErr.iErr = 0; sciErr.iMsgCount = 0; int iNewPos = Top - Rhs + _iVar; int iAddr = *Lstk(iNewPos); int iTotalSize = 0; int iOffset = 0; int* piAddr = NULL; //return empty matrix if(_iRows == 0 && _iCols == 0) { double dblReal = 0; sciErr = createMatrixOfDouble(_pvCtx, _iVar, 0, 0, &dblReal); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_CREATE_EMPTY_MATRIX, _("%s: Unable to create variable in Scilab memory"), "createEmptyMatrix"); } return sciErr; } //header + offset int iMemSize = (5 + _iRows + _iNbItem + !((_iRows + _iNbItem) % 2)) / 2; //+ items size iMemSize += _iNbItem * (_iComplex + 1); int iFreeSpace = iadr(*Lstk(Bot)) - (iadr(iAddr)); if (iMemSize > iFreeSpace) { addStackSizeError(&sciErr, ((StrCtx*)_pvCtx)->pstName, iMemSize); return sciErr; } getNewVarAddressFromPosition(_pvCtx, iNewPos, &piAddr); sciErr = fillCommonSparseMatrix(_pvCtx, piAddr, _iComplex, _iRows, _iCols, _iNbItem, _piNbItemRow, _piColPos, _pdblReal, _pdblImg, &iTotalSize); if(sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_ALLOC_SPARSE, _("%s: Unable to create variable in Scilab memory"), _iComplex ? "allocComplexSparseMatrix" : "allocSparseMatrix"); return sciErr; } iOffset = 5;//4 for header + 1 for NbItem iOffset += _iRows + _iNbItem + !((_iRows + _iNbItem) % 2); updateInterSCI(_iVar, '$', iAddr, sadr(iadr(iAddr) + iOffset)); updateLstk(iNewPos, sadr(iadr(iAddr) + iOffset), iTotalSize); return sciErr; }
SciErr allocBooleanSparseMatrix(void* _pvCtx, int _iVar, int _iRows, int _iCols, int _iNbItem, int** _piNbItemRow, int** _piColPos) { SciErr sciErr; sciErr.iErr = 0; sciErr.iMsgCount = 0; int iNewPos = Top - Rhs + _iVar; int iAddr = *Lstk(iNewPos); int iPos = 5 + _iRows + _iNbItem; int* piAddr = NULL; //return empty matrix if(_iRows == 0 && _iCols == 0) { double dblReal = 0; sciErr = createMatrixOfDouble(_pvCtx, _iVar, 0, 0, &dblReal); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_CREATE_EMPTY_MATRIX, _("%s: Unable to create variable in Scilab memory"), "createEmptyMatrix"); } return sciErr; } int iMemSize = (int)( ( (double)iPos / 2 ) + 0.5); int iFreeSpace = iadr(*Lstk(Bot)) - (iadr(iAddr)); if (iMemSize > iFreeSpace) { addStackSizeError(&sciErr, ((StrCtx*)_pvCtx)->pstName, iMemSize); return sciErr; } getNewVarAddressFromPosition(_pvCtx, iNewPos, &piAddr); sciErr = fillBooleanSparseMatrix(_pvCtx, piAddr, _iRows, _iCols, _iNbItem, _piNbItemRow, _piColPos); if(sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_ALLOC_BOOLEAN_SPARSE, _("%s: Unable to create variable in Scilab memory"), "allocBooleanSparseMatrix"); return sciErr; } iPos += iAddr; updateInterSCI(_iVar, '$', iAddr, iPos); updateLstk(iNewPos, iPos, 0); return sciErr; }
SciErr allocCommonMatrixOfDouble(void* _pvCtx, int _iVar, int _iComplex, int _iRows, int _iCols, double** _pdblReal, double** _pdblImg) { SciErr sciErr; sciErr.iErr = 0; sciErr.iMsgCount = 0; int iNewPos = Top - Rhs + _iVar; int iAddr = *Lstk(iNewPos); int* piAddr = NULL; int iMemSize = _iRows * _iCols * (_iComplex + 1) + 2; int iFreeSpace = iadr(*Lstk(Bot)) - (iadr(iAddr)); if (iMemSize > iFreeSpace) { addStackSizeError(&sciErr, ((StrCtx*)_pvCtx)->pstName, iMemSize); return sciErr; } getNewVarAddressFromPosition(_pvCtx, iNewPos, &piAddr); fillCommonMatrixOfDouble(_pvCtx, piAddr, _iComplex, _iRows, _iCols, _pdblReal, _pdblImg); updateInterSCI(_iVar, '$', iAddr, sadr(iadr(iAddr) + 4)); updateLstk(iNewPos, sadr(iadr(iAddr) + 4), _iRows * _iCols * (_iComplex + 1)); return sciErr; }