Coverity: graphics module unchecked returns fixed
[scilab.git] / scilab / modules / graphics / sci_gateway / c / sci_color.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2014 - Scilab Enterprises - Antoine ELIAS
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15 #include "gw_graphics.h"
16 #include "api_scilab.h"
17 #include "localization.h"
18 #include "Scierror.h"
19 #include "name2rgb.h"
20 #include "CurrentFigure.h"
21 #include "FigureModel.h"
22 #include "addColor.h"
23
24 int sci_color(char *fname, void* pvApiCtx)
25 {
26     SciErr sciErr;
27     int iRows = 0;
28     int iCols = 0;
29     double pdblColor[3];
30
31     int iCurrentFigure = 0;
32     int iColor = 0;
33
34     int iRhs = nbInputArgument(pvApiCtx);
35
36     if (iRhs != 1 && iRhs != 3)
37     {
38         Scierror(77, _("%s: Wrong number of input argument(s): %d or %d expected.\n"), fname, 1, 3);
39         return 1;
40     }
41
42     if (iRhs == 1)
43     {
44         int* piAddr = NULL;
45         char* pstColor = NULL;
46
47         sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
48         if (sciErr.iErr)
49         {
50             printError(&sciErr, 0);
51             return 1;
52         }
53
54         if (isStringType(pvApiCtx, piAddr) == FALSE || isScalar(pvApiCtx, piAddr) == FALSE)
55         {
56             Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), fname, 1);
57             return 1;
58         }
59
60         if (getAllocatedSingleString(pvApiCtx, piAddr, &pstColor))
61         {
62             Scierror(999, _("%s: Wrong type for input argument #%d: A single string expected.\n"), fname, 1);
63             return 1;
64         }
65         name2rgb(pstColor, pdblColor);
66         freeAllocatedSingleString(pstColor);
67         if (pdblColor[0] == -1 || pdblColor[1] == -1 || pdblColor[2] == -1)
68         {
69             Scierror(999, _("%s: Wrong value for input argument #%d: A known color expected.\n"), fname, 1);
70             return 1;
71         }
72
73         pdblColor[0] /= 255;
74         pdblColor[1] /= 255;
75         pdblColor[2] /= 255;
76     }
77     else //iRhs == 3
78     {
79         int i = 0;
80         int count = 3;
81         double dbl = 0;
82         for (i = 0 ; i < count ; i++)
83         {
84             int* piAddr = NULL;
85
86             sciErr = getVarAddressFromPosition(pvApiCtx, i + 1, &piAddr);
87             if (sciErr.iErr)
88             {
89                 printError(&sciErr, 0);
90                 return 1;
91             }
92
93             if (isDoubleType(pvApiCtx, piAddr) == FALSE || isScalar(pvApiCtx, piAddr) == FALSE)
94             {
95                 Scierror(999, _("%s: Wrong size for input argument #%d: A scalar expected.\n"), fname, i + 1);
96                 return 1;
97             }
98
99             getScalarDouble(pvApiCtx, piAddr, &dbl);
100             if (dbl < 0 || dbl > 255)
101             {
102                 Scierror(999, _("%s: Wrong value for input argument #%d: Must be in the interval [%s, %s].\n"), fname, i + 1, "0", "255");
103                 return 1;
104             }
105
106             pdblColor[i] = dbl / 255;
107         }
108     }
109
110     iCurrentFigure = getCurrentFigure();
111     if (iCurrentFigure == 0)
112     {
113         //use gdf
114         iCurrentFigure = getFigureModel();
115     }
116
117     iColor = addColor(iCurrentFigure, pdblColor);
118
119     createScalarDouble(pvApiCtx, iRhs + 1, (double)iColor);
120
121     AssignOutputVariable(pvApiCtx, 1) = iRhs + 1;
122     ReturnArguments(pvApiCtx);
123     return 0;
124 }