# polynomial example

Polynom use case.

## Description

This example shows how to get a polynomial variable and return it to Scilab.

## Gateway Source

    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(pvApiCtx) + 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(pvApiCtx) + 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(pvApiCtx) + 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(pvApiCtx) + 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(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
    	}
    	else
    	{
            AssignOutputVariable(pvApiCtx, 1) = 0;
    	}
    	return 0;
    }

## Scilab test script

    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