/*------------------------------------------------------------------------*/ int set_user_data_property(void* _pvCtx, int iObjUID, void* _pvData, int valueType, int nbRow, int nbCol) { /*NOT COMPATIBLE WITH SCILAB 6*/ int iRhs = getRhsFromAddress(pvApiCtx, (int*)_pvData); int iUserDataSize = GetDataSize(iRhs) * 2; /* GetDataSize returns the size of the variable in double words */ int *piUserData = (int*)GetData(iRhs); BOOL status = FALSE; if (setGraphicObjectProperty(iObjUID, __GO_USER_DATA__, piUserData, jni_int_vector, iUserDataSize) == FALSE) { Scierror(999, _("'%s' property does not exist for this handle.\n"), "user_data"); return SET_PROPERTY_ERROR; } return SET_PROPERTY_SUCCEED; }
/*--------------------------------------------------------------------------*/ int getScalarBoolean(void* _pvCtx, int* _piAddress, int* _piBool) { SciErr sciErr; sciErr.iErr = 0; sciErr.iMsgCount = 0; int iRows = 0; int iCols = 0; int* piBool = NULL; sciErr = getMatrixOfBoolean(_pvCtx, _piAddress, &iRows, &iCols, &piBool); if(sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_SCALAR_BOOLEAN, _("%s: Unable to get argument #%d"), "getScalarBoolean", getRhsFromAddress(_pvCtx, _piAddress)); printError(&sciErr, 0); return sciErr.iErr; } if(isScalar(_pvCtx, _piAddress) == 0) { addErrorMessage(&sciErr, API_ERROR_GET_SCALAR_BOOLEAN, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), "getScalarBoolean", getRhsFromAddress(_pvCtx, _piAddress)); printError(&sciErr, 0); return sciErr.iErr; } if(_piBool != NULL) { *_piBool = piBool[0]; } return 0; }
SciErr getMatrixOfString(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, int* _piLength, char** _pstStrings) { SciErr sciErr = sciErrInit(); int *piOffset = NULL; int *piData = NULL; int iType = 0; if (_piAddress == NULL) { addErrorMessage(&sciErr, API_ERROR_INVALID_POINTER, _("%s: Invalid argument address"), "getMatrixOfString"); return sciErr; } sciErr = getVarType(_pvCtx, _piAddress, &iType); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_STRING, _("%s: Unable to get argument #%d"), "getMatrixOfString", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } if (iType != sci_strings) { addErrorMessage(&sciErr, API_ERROR_INVALID_TYPE, _("%s: Invalid argument type, %s expected"), "getMatrixOfString", _("string matrix")); return sciErr; } sciErr = getVarDimension(_pvCtx, _piAddress, _piRows, _piCols); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_STRING, _("%s: Unable to get argument #%d"), "getMatrixOfString", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } if (_piLength == NULL) { return sciErr; } types::String *pS = ((types::InternalType*)_piAddress)->getAs<types::String>(); //non cummulative length int iSize = pS->getSize(); if (_pstStrings == NULL || *_pstStrings == NULL) { for (int i = 0 ; i < iSize; i++) { char* pstTemp = wide_string_to_UTF8(pS->get(i)); _piLength[i] = (int)strlen(pstTemp); FREE(pstTemp); } } else { for (int i = 0 ; i < iSize; i++) { if (_pstStrings[i] == NULL) { addErrorMessage(&sciErr, API_ERROR_INVALID_SUBSTRING_POINTER, _("%s: Invalid argument address"), "getMatrixOfString"); return sciErr; } char* c = wide_string_to_UTF8(pS->get(i)); strcpy(_pstStrings[i], c); FREE(c); } } return sciErr; }
/*--------------------------------------------------------------------------*/ int getAllocatedSingleWideString(void* _pvCtx, int* _piAddress, wchar_t** _pwstData) { SciErr sciErr = sciErrInit(); int iRows = 0; int iCols = 0; int iLen = 0; if (isScalar(_pvCtx, _piAddress) == 0 || isStringType(_pvCtx, _piAddress) == 0) { addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_SINGLE_WIDE_STRING, _("%s: Wrong type for input argument #%d: A single string expected.\n"), "getAllocatedSingleWideString", getRhsFromAddress(_pvCtx, _piAddress)); printError(&sciErr, 0); return sciErr.iErr; } sciErr = getMatrixOfWideString(_pvCtx, _piAddress, &iRows, &iCols, &iLen, NULL); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_SINGLE_WIDE_STRING, _("%s: Unable to get argument data"), "getAllocatedSingleWideString"); printError(&sciErr, 0); return sciErr.iErr; } *_pwstData = (wchar_t*)MALLOC(sizeof(wchar_t) * (iLen + 1)); //+1 for null termination sciErr = getMatrixOfWideString(_pvCtx, _piAddress, &iRows, &iCols, &iLen, _pwstData); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_SINGLE_WIDE_STRING, _("%s: Unable to get argument data"), "getAllocatedSingleWideString"); printError(&sciErr, 0); FREE(*_pwstData); return sciErr.iErr; } return 0; }
/*--------------------------------------------------------------------------*/ SciErr getMatrixOfWideString(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, int* _piwLength, wchar_t** _pwstStrings) { SciErr sciErr = sciErrInit(); int iType = 0; char **pstStrings = NULL; int *piLenStrings = NULL; int strSize = 0; if (_piAddress == NULL) { addErrorMessage(&sciErr, API_ERROR_INVALID_POINTER, _("%s: Invalid argument address"), "getMatrixOfWideString"); return sciErr; } sciErr = getVarType(_pvCtx, _piAddress, &iType); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_WIDE_STRING, _("%s: Unable to get argument #%d"), "getMatrixOfWideString", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } if (iType != sci_strings) { addErrorMessage(&sciErr, API_ERROR_INVALID_TYPE, _("%s: Invalid argument type, %s expected"), "getMatrixOfWideString", _("string matrix")); return sciErr; } sciErr = getVarDimension(_pvCtx, _piAddress, _piRows, _piCols); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_WIDE_STRING, _("%s: Unable to get argument #%d"), "getMatrixOfWideString", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } if (_piwLength == NULL) { return sciErr; } types::String *pS = ((types::InternalType*)_piAddress)->getAs<types::String>(); int iSize = pS->getSize(); if (_pwstStrings == NULL || *_pwstStrings == NULL) { for (int i = 0 ; i < iSize; i++) { _piwLength[i] = (int)wcslen(pS->get(i)); } } else { for (int i = 0 ; i < pS->getSize() ; i++) { if (_pwstStrings[i] == NULL) { addErrorMessage(&sciErr, API_ERROR_INVALID_SUBSTRING_POINTER, _("%s: Invalid argument address"), "getMatrixOfString"); return sciErr; } wcscpy(_pwstStrings[i], pS->get(i)); } } return sciErr; }
SciErr getCommonMatrixOfDouble(void* _pvCtx, int* _piAddress, int _iComplex, int* _piRows, int* _piCols, double** _pdblReal, double** _pdblImg) { SciErr sciErr; sciErr.iErr = 0; sciErr.iMsgCount = 0; int iType = 0; if( _piAddress == NULL) { addErrorMessage(&sciErr, API_ERROR_INVALID_POINTER, _("%s: Invalid argument address"), _iComplex ? "getComplexMatrixOfDouble" : "getMatrixOfDouble"); return sciErr; } sciErr = getVarType(_pvCtx, _piAddress, &iType); if(sciErr.iErr || iType != sci_matrix) { addErrorMessage(&sciErr, API_ERROR_INVALID_TYPE, _("%s: Invalid argument type, %s excepted"), _iComplex ? "getComplexMatrixOfDouble" : "getMatrixOfDouble", _("double matrix")); return sciErr; } if(isVarComplex(_pvCtx, _piAddress) != _iComplex) { addErrorMessage(&sciErr, API_ERROR_INVALID_COMPLEXITY, _("%s: Bad call to get a non complex matrix"), "getComplexMatrixOfDouble"); return sciErr; } sciErr = getVarDimension(_pvCtx, _piAddress, _piRows, _piCols); if(sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_DOUBLE, _("%s: Unable to get argument #%d"), _iComplex ? "getComplexMatrixOfDouble" : "getMatrixOfDouble", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } if(_pdblReal != NULL) { *_pdblReal = (double*)(_piAddress + 4); } if(_iComplex && _pdblImg != NULL) { *_pdblImg = (double*)(_piAddress + 4) + *_piRows * *_piCols; } return sciErr; }
/*--------------------------------------------------------------------------*/ static int getCommonAllocatedMatrixOfPoly(void* _pvCtx, int* _piAddress, int _iComplex, int* _piRows, int* _piCols, int** _piNbCoef, double*** _pdblReal, double*** _pdblImg) { SciErr sciErr; sciErr.iErr = 0; sciErr.iMsgCount = 0; sciErr = getCommonMatrixOfPoly(_pvCtx, _piAddress, _iComplex, _piRows, _piCols, NULL, NULL, NULL); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_MATRIX_POLY, _("%s: Unable to get argument #%d"), _iComplex ? "getAllocatedMatrixOfComplexPoly" : "getAllocatedMatrixOfPoly", getRhsFromAddress(_pvCtx, _piAddress)); printError(&sciErr, 0); return sciErr.iErr; } *_piNbCoef = (int*)MALLOC(sizeof(int) * *_piRows * *_piCols); sciErr = getCommonMatrixOfPoly(_pvCtx, _piAddress, _iComplex, _piRows, _piCols, *_piNbCoef, NULL, NULL); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_MATRIX_POLY, _("%s: Unable to get argument #%d"), _iComplex ? "getAllocatedMatrixOfComplexPoly" : "getAllocatedMatrixOfPoly", getRhsFromAddress(_pvCtx, _piAddress)); printError(&sciErr, 0); return sciErr.iErr; } *_pdblReal = (double**)MALLOC(sizeof(double*) * *_piRows * *_piCols); for (int i = 0 ; i < *_piRows * *_piCols ; i++) { (*_pdblReal)[i] = (double*)MALLOC(sizeof(double) * (*_piNbCoef)[i]); } if (_iComplex) { *_pdblImg = (double**)MALLOC(sizeof(double*) * *_piRows * *_piCols); for (int i = 0 ; i < *_piRows * *_piCols ; i++) { (*_pdblImg)[i] = (double*)MALLOC(sizeof(double) * (*_piNbCoef)[i]); } } sciErr = getCommonMatrixOfPoly(_pvCtx, _piAddress, _iComplex, _piRows, _piCols, *_piNbCoef, *_pdblReal, _pdblImg == NULL ? NULL : *_pdblImg); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_MATRIX_POLY, _("%s: Unable to get argument #%d"), _iComplex ? "getAllocatedSingleComplexPoly" : "getAllocatedSinglePoly", getRhsFromAddress(_pvCtx, _piAddress)); printError(&sciErr, 0); return sciErr.iErr; } return 0; }
/*--------------------------------------------------------------------------*/ int getAllocatedBooleanSparseMatrix(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, int* _piNbItem, int** _piNbItemRow, int** _piColPos) { SciErr sciErr; sciErr.iErr = 0; sciErr.iMsgCount = 0; int* piNbItemRow = NULL; int* piColPos = NULL; sciErr = getBooleanSparseMatrix(_pvCtx, _piAddress, _piRows, _piCols, _piNbItem, &piNbItemRow, &piColPos); if(sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_BOOLEAN_SPARSE, _("%s: Unable to get argument #%d"), "getAllocatedBooleanSparseMatrix", getRhsFromAddress(_pvCtx, _piAddress)); printError(&sciErr, 0); return sciErr.iErr; } *_piNbItemRow = (int*)MALLOC(sizeof(int) * *_piRows); memcpy(*_piNbItemRow, piNbItemRow, sizeof(int) * *_piRows); *_piColPos = (int*)MALLOC(sizeof(int) * *_piNbItem); memcpy(*_piColPos, piColPos, sizeof(int) * *_piNbItem); return 0; }
SciErr getPointer(void* _pvCtx, int* _piAddress, void** _pvPtr) { SciErr sciErr; sciErr.iErr = 0; sciErr.iMsgCount = 0; int iType = 0; double *pdblTmp = NULL; if ( _piAddress == NULL) { addErrorMessage(&sciErr, API_ERROR_INVALID_POINTER, _("%s: Invalid argument address"), "getPointer"); return sciErr; } sciErr = getVarType(_pvCtx, _piAddress, &iType); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_POINTER, _("%s: Unable to get argument #%d"), "getPointer", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } if (iType != sci_pointer) { addErrorMessage(&sciErr, API_ERROR_INVALID_TYPE, _("%s: Invalid argument type, %s excepted"), "getPointer", _("pointer")); return sciErr; } pdblTmp = (double*)(_piAddress + 4); *_pvPtr = (void*)((unsigned long int)(*pdblTmp)); return sciErr; }
SciErr getComplexHypermatOfDouble(void* _pvCtx, int* _piAddress, int **_dims, int *_ndims, double** _pdblReal, double** _pdblImg) { SciErr sciErr = sciErrInit(); void* entries = NULL; int ret = getHypermatEntries(_pvCtx, _piAddress, &entries); if (ret || entries == NULL || ((types::InternalType*)entries)->isDouble() == false) { addErrorMessage(&sciErr, API_ERROR_GET_DOUBLE, _("%s: Unable to get argument #%d"), "getHypermatOfDouble", getRhsFromAddress(_pvCtx, _piAddress)); } types::Double* d = (types::Double*)entries; *_dims = d->getDimsArray(); *_ndims = d->getDims(); *_pdblReal = d->get(); *_pdblImg = d->getImg(); return sciErr; }
SciErr getCommonMatrixOfPoly(void* _pvCtx, int* _piAddress, int _iComplex, int* _piRows, int* _piCols, int* _piNbCoef, double** _pdblReal, double** _pdblImg) { SciErr sciErr = sciErrInit(); int iType = 0; int iSize = 0; int *piOffset = NULL; double *pdblReal = NULL; double *pdblImg = NULL; if (_piAddress == NULL) { addErrorMessage(&sciErr, API_ERROR_INVALID_POINTER, _("%s: Invalid argument address"), _iComplex ? "getComplexMatrixOfPoly" : "getMatrixOfPoly"); return sciErr; } sciErr = getVarType(_pvCtx, _piAddress, &iType); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_POLY, _("%s: Unable to get argument #%d"), _iComplex ? "getComplexMatrixOfPoly" : "getMatrixOfPoly", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } if (iType != sci_poly) { addErrorMessage(&sciErr, API_ERROR_INVALID_TYPE, _("%s: Invalid argument type, %s expected"), _iComplex ? "getComplexMatrixOfPoly" : "getMatrixOfPoly", _("polynomial matrix")); return sciErr; } if (isVarComplex(_pvCtx, _piAddress) != _iComplex) { addErrorMessage(&sciErr, API_ERROR_INVALID_COMPLEXITY, _("%s: Bad call to get a non complex matrix"), _iComplex ? "getComplexMatrixOfPoly" : "getMatrixOfPoly"); return sciErr; } sciErr = getVarDimension(_pvCtx, _piAddress, _piRows, _piCols); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_POLY, _("%s: Unable to get argument #%d"), _iComplex ? "getComplexMatrixOfPoly" : "getMatrixOfPoly", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } iSize = *_piRows **_piCols; if (_piNbCoef == NULL) { return sciErr; } types::Polynom *pMP = ((types::InternalType*)_piAddress)->getAs<types::Polynom>(); pMP->getSizes(_piNbCoef); if (_pdblReal == NULL) { return sciErr; } types::SinglePoly** pSP = pMP->get(); if (_iComplex == 1) { for (int i = 0 ; i < iSize ; i++) { memcpy(_pdblReal[i], pSP[i]->get(), sizeof(double) * pSP[i]->getSize()); memcpy(_pdblImg[i], pSP[i]->getImg(), sizeof(double) * _piNbCoef[i]); } } else { for (int i = 0 ; i < iSize ; i++) { memcpy(_pdblReal[i], pSP[i]->get(), sizeof(double) * pSP[i]->getSize()); } } return sciErr; }
SciErr getComplexZMatrixOfDouble(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, doublecomplex** _pdblZ) { int iSize = 0; double *pdblReal = NULL; SciErr sciErr = getCommonMatrixOfDouble(_pvCtx, _piAddress, 'z', 0, _piRows, _piCols, &pdblReal, NULL); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_ZDOUBLE, _("%s: Unable to get argument #%d"), "getComplexZMatrixOfDouble", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } types::Double* pDbl = (types::Double*)_piAddress; pDbl->convertToZComplex(); *_pdblZ = (doublecomplex*)(pDbl->get()); return sciErr; }
/*--------------------------------------------------------------------------*/ static int getCommonScalarDouble(void* _pvCtx, int* _piAddress, int _iComplex, double* _pdblReal, double* _pdblImg) { int iRows = 0; int iCols = 0; double* pdblReal = NULL; double* pdblImg = NULL; SciErr sciErr = getCommonMatrixOfDouble(_pvCtx, _piAddress, '$', _iComplex, &iRows, &iCols, &pdblReal, &pdblImg); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_SCALAR_DOUBLE, _("%s: Unable to get argument #%d"), _iComplex ? "getScalarComplexDouble" : "getScalarDouble", getRhsFromAddress(_pvCtx, _piAddress)); printError(&sciErr, 0); return sciErr.iErr; } if (isScalar(_pvCtx, _piAddress) == 0) { addErrorMessage(&sciErr, API_ERROR_GET_SCALAR_DOUBLE, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), _iComplex ? "getScalarComplexDouble" : "getScalarDouble", getRhsFromAddress(_pvCtx, _piAddress)); printError(&sciErr, 0); return sciErr.iErr; } if (_pdblReal != NULL) { *_pdblReal = pdblReal[0]; } if (_iComplex == 1 && _pdblImg != NULL && pdblImg != NULL) { *_pdblImg = pdblImg[0]; } else if (_pdblImg != NULL) { *_pdblImg = 0; } return 0; }
SciErr getCommonMatrixOfDouble(void* _pvCtx, int* _piAddress, char _cType, int _iComplex, int* _piRows, int* _piCols, double** _pdblReal, double** _pdblImg) { SciErr sciErr = sciErrInit(); int iType = 0; if (_piAddress == NULL) { addErrorMessage(&sciErr, API_ERROR_INVALID_POINTER, _("%s: Invalid argument address"), _iComplex ? "getComplexMatrixOfDouble" : "getMatrixOfDouble"); return sciErr; } sciErr = getVarType(_pvCtx, _piAddress, &iType); if (sciErr.iErr || iType != sci_matrix) { addErrorMessage(&sciErr, API_ERROR_INVALID_TYPE, _("%s: Invalid argument type, %s expected"), _iComplex ? "getComplexMatrixOfDouble" : "getMatrixOfDouble", _("double matrix")); return sciErr; } sciErr = getVarDimension(_pvCtx, _piAddress, _piRows, _piCols); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_DOUBLE, _("%s: Unable to get argument #%d"), _iComplex ? "getComplexMatrixOfDouble" : "getMatrixOfDouble", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } if (_pdblReal != NULL) { *_pdblReal = ((types::InternalType*)_piAddress)->getAs<types::Double>()->getReal(); } if (_iComplex && _pdblImg != NULL) { *_pdblImg = ((types::InternalType*)_piAddress)->getAs<types::Double>()->getImg(); } return sciErr; }
SciErr getMatrixOfBoolean(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, int** _piBool) { SciErr sciErr; sciErr.iErr = 0; sciErr.iMsgCount = 0; int iType = 0; if( _piAddress == NULL) { addErrorMessage(&sciErr, API_ERROR_INVALID_POINTER, _("%s: Invalid argument address"), "getMatrixOfBoolean"); return sciErr; } sciErr = getVarType(_pvCtx, _piAddress, &iType); if(sciErr.iErr || iType != sci_boolean) { addErrorMessage(&sciErr, API_ERROR_INVALID_TYPE, _("%s: Invalid argument type, %s excepted"), "getMatrixOfBoolean", _("boolean matrix")); return sciErr; } sciErr = getVarDimension(_pvCtx, _piAddress, _piRows, _piCols); if(sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_BOOLEAN, _("%s: Unable to get argument #%d"), "getMatrixOfBoolean", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } if(_piBool) { *_piBool = _piAddress + 3; } return sciErr; }
/*--------------------------------------------------------------------------*/ SciErr getDimFromVar(void *_pvCtx, int *_piAddress, int *_piVal) { SciErr sciErr; sciErr.iErr = 0; sciErr.iMsgCount = 0; int iType = 0; int iRows = 0; int iCols = 0; double *pdblReal = NULL; sciErr = getVarType(_pvCtx, _piAddress, &iType); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_DIMFROMVAR, _("%s: Unable to get argument type"), "getDimFromVar"); return sciErr; } if (iType == sci_matrix) { if (isVarComplex(_pvCtx, _piAddress)) { addErrorMessage(&sciErr, API_ERROR_GET_DIMFROMVAR, _("%s: Wrong type for argument %d: Real matrix expected.\n"), "getDimFromVar", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } sciErr = getMatrixOfDouble(_pvCtx, _piAddress, &iRows, &iCols, &pdblReal); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_DIMFROMVAR, _("%s: Unable to get argument data"), "getDimFromVar"); return sciErr; } *_piVal = (int)Max(pdblReal[0], 0); } else if (iType == sci_ints) { int iPrec = 0; sciErr = getVarDimension(_pvCtx, _piAddress, &iRows, &iCols); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_DIMFROMVAR, _("%s: Unable to get argument dimension"), "getDimFromVar"); return sciErr; } if (iRows != 1 || iCols != 1) { addErrorMessage(&sciErr, API_ERROR_GET_DIMFROMVAR, _("%s: Wrong size for argument %d: (%d,%d) expected.\n"), "getProcessMode", getRhsFromAddress(_pvCtx, _piAddress), 1, 1); return sciErr; } sciErr = getMatrixOfIntegerPrecision(_pvCtx, _piAddress, &iPrec); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_DIMFROMVAR, _("%s: Unable to get argument precision"), "getDimFromVar"); return sciErr; } switch (iPrec) { case SCI_INT8: { char *pcData = NULL; sciErr = getMatrixOfInteger8(_pvCtx, _piAddress, &iRows, &iCols, &pcData); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_DIMFROMVAR, _("%s: Unable to get argument data"), "getDimFromVar"); return sciErr; } *_piVal = pcData[0]; } break; case SCI_UINT8: { unsigned char *pucData = NULL; sciErr = getMatrixOfUnsignedInteger8(_pvCtx, _piAddress, &iRows, &iCols, &pucData); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_DIMFROMVAR, _("%s: Unable to get argument data"), "getDimFromVar"); return sciErr; } *_piVal = pucData[0]; } break; case SCI_INT16: { short *psData = NULL; sciErr = getMatrixOfInteger16(_pvCtx, _piAddress, &iRows, &iCols, &psData); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_DIMFROMVAR, _("%s: Unable to get argument data"), "getDimFromVar"); return sciErr; } *_piVal = psData[0]; } break; case SCI_UINT16: { unsigned short *pusData = NULL; sciErr = getMatrixOfUnsignedInteger16(_pvCtx, _piAddress, &iRows, &iCols, &pusData); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_DIMFROMVAR, _("%s: Unable to get argument data"), "getDimFromVar"); return sciErr; } *_piVal = pusData[0]; } break; case SCI_INT32: { int *piData = NULL; sciErr = getMatrixOfInteger32(_pvCtx, _piAddress, &iRows, &iCols, &piData); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_DIMFROMVAR, _("%s: Unable to get argument data"), "getDimFromVar"); return sciErr; } *_piVal = piData[0]; } break; case SCI_UINT32: { unsigned int *puiData = NULL; sciErr = getMatrixOfUnsignedInteger32(_pvCtx, _piAddress, &iRows, &iCols, &puiData); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_DIMFROMVAR, _("%s: Unable to get argument data"), "getDimFromVar"); return sciErr; } *_piVal = puiData[0]; } break; } } else { addErrorMessage(&sciErr, API_ERROR_GET_DIMFROMVAR, _("%s: Wrong type for input argument #%d: A real scalar or an integer scalar expected.\n"), "getDimFromVar", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } return sciErr; }
SciErr getBooleanSparseMatrix(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, int* _piNbItem, int** _piNbItemRow, int** _piColPos) { SciErr sciErr; sciErr.iErr = 0; sciErr.iMsgCount = 0; int iType = 0; if( _piAddress == NULL) { addErrorMessage(&sciErr, API_ERROR_INVALID_POINTER, _("%s: Invalid argument address"), "getBooleanSparseMatrix"); return sciErr; } sciErr = getVarType(_pvCtx, _piAddress, &iType); if(sciErr.iErr || iType != sci_boolean_sparse) { addErrorMessage(&sciErr, API_ERROR_GET_BOOLEAN_SPARSE, _("%s: Unable to get argument #%d"), "getBooleanSparseMatrix", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } sciErr = getVarDimension(_pvCtx, _piAddress, _piRows, _piCols); if(sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_BOOLEAN_SPARSE, _("%s: Unable to get argument #%d"), "getBooleanSparseMatrix", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } *_piNbItem = _piAddress[4]; if(_piNbItemRow == NULL) { return sciErr; } *_piNbItemRow = _piAddress + 5;//4 for header + 1 for NbItem if(_piColPos == NULL) { return sciErr; } *_piColPos = *_piNbItemRow + *_piRows; return sciErr; }
SciErr getCommonSparseMatrix(void* _pvCtx, int* _piAddress, int _iComplex, int* _piRows, int* _piCols, int* _piNbItem, int** _piNbItemRow, int** _piColPos, double** _pdblReal, double** _pdblImg) { SciErr sciErr; sciErr.iErr = 0; sciErr.iMsgCount = 0; int iPos = 0; int iType = 0; if( _piAddress == NULL) { addErrorMessage(&sciErr, API_ERROR_INVALID_POINTER, _("%s: Invalid argument address"), _iComplex ? "getComplexSparseMatrix" : "getSparseMatrix"); return sciErr; } sciErr = getVarType(_pvCtx, _piAddress, &iType); if(sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_SPARSE, _("%s: Unable to get argument #%d"), _iComplex ? "getComplexSparseMatrix" : "getSparseMatrix", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } if(iType != sci_sparse) { addErrorMessage(&sciErr, API_ERROR_INVALID_TYPE, _("%s: Invalid argument type, %s excepted"), _iComplex ? "getComplexSparseMatrix" : "getSparseMatrix", _("sparse matrix")); return sciErr; } if(isVarComplex(_pvCtx, _piAddress) != _iComplex) { addErrorMessage(&sciErr, API_ERROR_INVALID_COMPLEXITY, _("%s: Bad call to get a non complex matrix"), _iComplex ? "getComplexSparseMatrix" : "getSparseMatrix"); return sciErr; } sciErr = getVarDimension(_pvCtx, _piAddress, _piRows, _piCols); if(sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_SPARSE, _("%s: Unable to get argument #%d"), _iComplex ? "getComplexSparseMatrix" : "getSparseMatrix", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } *_piNbItem = _piAddress[4]; if(_piNbItemRow == NULL) { return sciErr; } *_piNbItemRow = _piAddress + 5;//4 for header + 1 for NbItem if(_piColPos == NULL) { return sciErr; } *_piColPos = *_piNbItemRow + *_piRows; if(_pdblReal == NULL) { return sciErr; } iPos = (*_piNbItem + *_piRows) % 2 == 1 ? 0 : 1; *_pdblReal = (double*)(*_piColPos + *_piNbItem + iPos); if(_iComplex == 1 && _pdblImg != NULL) { *_pdblImg = *_pdblReal + *_piNbItem; } return sciErr; }
/*--------------------------------------------------------------------------*/ static int getCommonAllocatedSinglePoly(void* _pvCtx, int* _piAddress, int _iComplex, int* _piNbCoef, double** _pdblReal, double** _pdblImg) { SciErr sciErr; sciErr.iErr = 0; sciErr.iMsgCount = 0; int iRows = 0; int iCols = 0; if (isScalar(_pvCtx, _piAddress) == 0) { addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_SINGLE_POLY, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), _iComplex ? "getAllocatedSingleComplexPoly" : "getAllocatedSinglePoly", getRhsFromAddress(_pvCtx, _piAddress)); printError(&sciErr, 0); return sciErr.iErr; } sciErr = getCommonMatrixOfPoly(_pvCtx, _piAddress, _iComplex, &iRows, &iCols, _piNbCoef, NULL, NULL); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_SINGLE_POLY, _("%s: Unable to get argument #%d"), _iComplex ? "getAllocatedSingleComplexPoly" : "getAllocatedSinglePoly", getRhsFromAddress(_pvCtx, _piAddress)); printError(&sciErr, 0); return sciErr.iErr; } *_pdblReal = (double*)MALLOC(sizeof(double) * *_piNbCoef); if (_iComplex) { *_pdblImg = (double*)MALLOC(sizeof(double) * *_piNbCoef); } sciErr = getCommonMatrixOfPoly(_pvCtx, _piAddress, _iComplex, &iRows, &iCols, _piNbCoef, _pdblReal, _pdblImg); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_SINGLE_POLY, _("%s: Unable to get argument #%d"), _iComplex ? "getAllocatedSingleComplexPoly" : "getAllocatedSinglePoly", getRhsFromAddress(_pvCtx, _piAddress)); printError(&sciErr, 0); return sciErr.iErr; } return 0; }
/*--------------------------------------------------------------------------*/ static int getCommonAllocatedSparseMatrix(void* _pvCtx, int* _piAddress, int _iComplex, int* _piRows, int* _piCols, int* _piNbItem, int** _piNbItemRow, int** _piColPos, double** _pdblReal, double** _pdblImg) { SciErr sciErr; int* piNbItemRow = NULL; int* piColPos = NULL; int iOne = 1; double* pdblReal = NULL; double* pdblImg = NULL; sciErr = getCommonSparseMatrix(_pvCtx, _piAddress, _iComplex, _piRows, _piCols, _piNbItem, &piNbItemRow, &piColPos, &pdblReal, &pdblImg); if(sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_SPARSE, _("%s: Unable to get argument #%d"), _iComplex ? "getAllocatedComplexSparseMatrix" : "getAllocatedSparseMatrix", getRhsFromAddress(_pvCtx, _piAddress)); printError(&sciErr, 0); return sciErr.iErr; } *_piNbItemRow = (int*)MALLOC(sizeof(int) * *_piRows); memcpy(*_piNbItemRow, piNbItemRow, sizeof(int) * *_piRows); *_piColPos = (int*)MALLOC(sizeof(int) * *_piNbItem); memcpy(*_piColPos, piColPos, sizeof(int) * *_piNbItem); *_pdblReal = (double*)MALLOC(sizeof(double) * *_piNbItem); C2F(dcopy)(_piNbItem, pdblReal, &iOne, *_pdblReal, &iOne); if(_iComplex) { *_pdblImg = (double*)MALLOC(sizeof(double) * *_piNbItem); C2F(dcopy)(_piNbItem, pdblImg, &iOne, *_pdblImg, &iOne); } return 0; }
SciErr getCommonMatrixOfPoly(void* _pvCtx, int* _piAddress, int _iComplex, int* _piRows, int* _piCols, int* _piNbCoef, double** _pdblReal, double** _pdblImg) { SciErr sciErr; sciErr.iErr = 0; sciErr.iMsgCount = 0; int iType = 0; int iSize = 0; int *piOffset = NULL; double *pdblReal = NULL; double *pdblImg = NULL; if (_piAddress == NULL) { addErrorMessage(&sciErr, API_ERROR_INVALID_POINTER, _("%s: Invalid argument address"), _iComplex ? "getComplexMatrixOfPoly" : "getMatrixOfPoly"); return sciErr; } sciErr = getVarType(_pvCtx, _piAddress, &iType); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_POLY, _("%s: Unable to get argument #%d"), _iComplex ? "getComplexMatrixOfPoly" : "getMatrixOfPoly", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } if (iType != sci_poly) { addErrorMessage(&sciErr, API_ERROR_INVALID_TYPE, _("%s: Invalid argument type, %s excepted"), _iComplex ? "getComplexMatrixOfPoly" : "getMatrixOfPoly", _("polynomial matrix")); return sciErr; } if (isVarComplex(_pvCtx, _piAddress) != _iComplex) { addErrorMessage(&sciErr, API_ERROR_INVALID_COMPLEXITY, _("%s: Bad call to get a non complex matrix"), _iComplex ? "getComplexMatrixOfPoly" : "getMatrixOfPoly"); return sciErr; } sciErr = getVarDimension(_pvCtx, _piAddress, _piRows, _piCols); if (sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_POLY, _("%s: Unable to get argument #%d"), _iComplex ? "getComplexMatrixOfPoly" : "getMatrixOfPoly", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } iSize = *_piRows * *_piCols; if (_piNbCoef == NULL) { return sciErr; } piOffset = _piAddress + 8; //4 for header and 4 for variable name for (int i = 0 ; i < iSize ; i++) { _piNbCoef[i] = piOffset[i + 1] - piOffset[i]; } if (_pdblReal == NULL) { return sciErr; } pdblReal = (double*)(piOffset + iSize + 1 + ((iSize + 1) % 2 == 0 ? 0 : 1 )); for (int i = 0 ; i < iSize ; i++) { memcpy(_pdblReal[i], pdblReal + piOffset[i] - 1, sizeof(double) * _piNbCoef[i]); } if (_iComplex == 1) { pdblImg = pdblReal + piOffset[iSize] - 1; for (int i = 0 ; i < iSize ; i++) { memcpy(_pdblImg[i], pdblImg + piOffset[i] - 1, sizeof(double) * _piNbCoef[i]); } } return sciErr; }
SciErr getComplexZMatrixOfDouble(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, doublecomplex** _pdblZ) { SciErr sciErr; sciErr.iErr = 0; sciErr.iMsgCount = 0; double *pdblReal = NULL; double *pdblImg = NULL; sciErr = getCommonMatrixOfDouble(_pvCtx, _piAddress, isVarComplex(_pvCtx, _piAddress), _piRows, _piCols, &pdblReal, &pdblImg); if(sciErr.iErr) { addErrorMessage(&sciErr, API_ERROR_GET_ZDOUBLE, _("%s: Unable to get argument #%d"), "getComplexZMatrixOfDouble", getRhsFromAddress(_pvCtx, _piAddress)); return sciErr; } *_pdblZ = oGetDoubleComplexFromPointer(pdblReal, pdblImg, *_piRows * *_piCols); return sciErr; }