Polynom use case.
This example shows how to get a polynomial variable and return it to Scilab.
int polyExample(char *fname,unsigned long fname_len)
{
SciErr sciErr;
int* piAddr = NULL;
int iType = 0;
int iRet = 0;
CheckInputArgument(pvApiCtx, 1, 1);
CheckOutputArgument(pvApiCtx, 0, 1);
sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
if(sciErr.iErr)
{
printError(&sciErr, 0);
return 0;
}
if(isPolyType(pvApiCtx, piAddr))
{
char pstVarName[64];
int iLen = 0;
sciErr = getPolyVariableName(pvApiCtx, piAddr, pstVarName, &iLen);
if(sciErr.iErr)
{
printError(&sciErr, 0);
return sciErr.iErr;
}
if(isScalar(pvApiCtx, piAddr))
{
int iNbCoef = 0;
double* pdblReal = NULL;
double* pdblImg = NULL;
if(isVarComplex(pvApiCtx, piAddr))
{
iRet = getAllocatedSingleComplexPoly(pvApiCtx, piAddr, &iNbCoef, &pdblReal, &pdblImg);
if(iRet)
{
freeAllocatedSingleComplexPoly(pdblReal, pdblImg);
return iRet;
}
sciErr = createComplexMatrixOfPoly(pvApiCtx, nbInputArgument + 1, pstVarName, 1, 1, &iNbCoef, &pdblReal, &pdblImg);
if(sciErr.iErr)
{
freeAllocatedSingleComplexPoly(pdblReal, pdblImg);
printError(&sciErr, 0);
return sciErr.iErr;
}
freeAllocatedSingleComplexPoly(pdblReal, pdblImg);
}
else
{
iRet = getAllocatedSinglePoly(pvApiCtx, piAddr, &iNbCoef, &pdblReal);
if(iRet)
{
freeAllocatedSinglePoly(pdblReal);
return iRet;
}
sciErr = createMatrixOfPoly(pvApiCtx, nbInputArgument + 1, pstVarName, 1, 1, &iNbCoef, &pdblReal);
if(sciErr.iErr)
{
freeAllocatedSinglePoly(pdblReal);
printError(&sciErr, 0);
return sciErr.iErr;
}
freeAllocatedSinglePoly(pdblReal);
}
}
else
{
int iRows = 0;
int iCols = 0;
int* piNbCoef = NULL;
double** pdblReal = NULL;
double** pdblImg = NULL;
if(isVarComplex(pvApiCtx, piAddr))
{
iRet = getAllocatedMatrixOfComplexPoly(pvApiCtx, piAddr, &iRows, &iCols, &piNbCoef, &pdblReal, &pdblImg);
if(iRet)
{
freeAllocatedMatrixOfComplexPoly(iRows, iCols, piNbCoef, pdblReal, pdblImg);
return iRet;
}
sciErr = createComplexMatrixOfPoly(pvApiCtx, nbInputArgument + 1, pstVarName, iRows, iCols, piNbCoef, pdblReal, pdblImg);
if(sciErr.iErr)
{
freeAllocatedMatrixOfComplexPoly(iRows, iCols, piNbCoef, pdblReal, pdblImg);
printError(&sciErr, 0);
return sciErr.iErr;
}
freeAllocatedMatrixOfComplexPoly(iRows, iCols, piNbCoef, pdblReal, pdblImg);
}
else
{
iRet = getAllocatedMatrixOfPoly(pvApiCtx, piAddr, &iRows, &iCols, &piNbCoef, &pdblReal);
if(iRet)
{
freeAllocatedMatrixOfPoly(iRows, iCols, piNbCoef, pdblReal);
return iRet;
}
sciErr = createMatrixOfPoly(pvApiCtx, nbInputArgument + 1, pstVarName, iRows, iCols, piNbCoef, pdblReal);
if(sciErr.iErr)
{
freeAllocatedMatrixOfPoly(iRows, iCols, piNbCoef, pdblReal);
printError(&sciErr, 0);
return sciErr.iErr;
}
freeAllocatedMatrixOfPoly(iRows, iCols, piNbCoef, pdblReal);
}
}
AssignOutputVariable(1) = nbInputArgument + 1;
}
else
{
AssignOutputVariable(1) = 0;
}
return 0;
}
a = %s;
b = (2 + 3*%i) * %s;
c = [a, 2*a, 3*a;4*a, 5*a, 6*a];
d = [c + c * %i];
if polyExample(a) <> a then pause, end
if polyExample(b) <> b then pause, end
if polyExample(c) <> c then pause, end
if polyExample(d) <> d then pause, end