check input argument type in light_create function and clean code
[scilab.git] / scilab / modules / graphics / sci_gateway / c / sci_light_create.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2013 - Pedro SOUZA
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #include "gw_graphics.h"
14 #include "api_scilab.h"
15 #include "Scierror.h"
16 #include "localization.h"
17 #include "HandleManagement.h"
18 #include "Light.h"
19 #include "stricmp.h"
20
21
22
23 int sci_light_create(char *fname, unsigned long fname_len)
24 {
25     int type = -1;
26     BOOL visible = 1;
27     double* position = NULL;
28     double* direction = NULL;
29     double* ambient_color = NULL;
30     double* diffuse_color = NULL;
31     double* specular_color = NULL;
32
33     SciErr sciErr;
34     int* piAddr = NULL;
35     int length = 0;
36     char * pStr = NULL;
37     long long light_handle;
38     long long axesHandle;
39     BOOL result;
40
41
42     static rhs_opts opts[] =
43     {
44         { -1, "ambient_color", -1, 0, 0, NULL},
45         { -1, "diffuse_color", -1, 0, 0, NULL},
46         { -1, "direction", -1, 0, 0, NULL},
47         { -1, "position", -1, 0, 0, NULL},
48         { -1, "specular_color", -1, 0, 0, NULL},
49         { -1, "type", -1, 0, 0, NULL},
50         { -1, "visible", -1, 0, 0, NULL},
51         { -1, NULL, -1, 0, 0, NULL}
52     };
53
54
55     if (nbInputArgument(pvApiCtx) == 0)
56     {
57         result = createLight(fname, -1, -1, TRUE, NULL, NULL, NULL, NULL, NULL, &light_handle);
58     }
59     else
60     {
61         CheckInputArgument(pvApiCtx, 1, 15);
62
63         sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
64         if (sciErr.iErr)
65         {
66             Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
67             return 0;
68         }
69
70         if (isHandleType(pvApiCtx, piAddr) == FALSE || isScalar(pvApiCtx, piAddr) == FALSE)
71         {
72             Scierror(999, _("%s: Wrong type for input argument #%d: A graphic handle expected.\n"), fname, 1);
73             return 0;
74         }
75
76         if (getScalarHandle(pvApiCtx, piAddr, &axesHandle))
77         {
78             Scierror(999, _("%s: Wrong type for input argument #%d: A graphic handle expected.\n"), fname, 1);
79             return 0;
80         }
81
82         if (getOptionals(pvApiCtx, fname, opts) == 0)
83         {
84             ReturnArguments(pvApiCtx);
85             return 0;
86         }
87
88         if (opts[6].iPos != -1 && opts[6].iType == sci_strings && opts[6].iCols == 1 && opts[6].iRows == 1)
89         {
90             if (getAllocatedSingleString(pvApiCtx, opts[6].piAddr, &pStr))
91             {
92                 Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 7);
93                 return 0;
94             }
95
96             if (stricmp(pStr, "on") == 0)
97             {
98                 visible = 1;
99             }
100             else if (stricmp(pStr, "off") == 0)
101             {
102                 visible = 0;
103             }
104
105             freeAllocatedSingleString(pStr);
106         }
107
108         if (opts[5].iPos != -1 && opts[5].iType == sci_strings && opts[5].iCols == 1 && opts[5].iRows == 1)
109         {
110             if (getAllocatedSingleString(pvApiCtx, opts[5].piAddr, &pStr))
111             {
112                 Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 6);
113                 return 0;
114             }
115
116             if (stricmp(pStr, "directional") == 0)
117             {
118                 type = 0;
119             }
120             else if (stricmp(pStr, "point") == 0)
121             {
122                 type = 1;
123             }
124
125             freeAllocatedSingleString(pStr);
126         }
127
128         if ((opts[3].iPos != -1) && (opts[3].iType == sci_matrix) && (opts[3].iCols * opts[3].iRows == 3))
129         {
130             sciErr = getMatrixOfDouble(pvApiCtx, opts[3].piAddr, &opts[3].iCols, &opts[3].iRows, &position);
131         }
132
133         if ((opts[2].iPos != -1) && (opts[2].iType == sci_matrix) && (opts[2].iCols * opts[2].iRows == 3))
134         {
135             sciErr = getMatrixOfDouble(pvApiCtx, opts[2].piAddr, &opts[2].iCols, &opts[2].iRows, &direction);
136         }
137
138         if ((opts[0].iPos != -1) && (opts[0].iType == sci_matrix) && (opts[0].iCols * opts[0].iRows == 3))
139         {
140             sciErr = getMatrixOfDouble(pvApiCtx, opts[0].piAddr, &opts[0].iCols, &opts[0].iRows, &ambient_color);
141         }
142
143         if ((opts[1].iPos != -1) && (opts[1].iType == sci_matrix) && (opts[1].iCols * opts[1].iRows == 3))
144         {
145             sciErr = getMatrixOfDouble(pvApiCtx, opts[1].piAddr, &opts[1].iCols, &opts[1].iRows, &diffuse_color);
146         }
147
148         if ((opts[4].iPos != -1) && (opts[4].iType == sci_matrix) && (opts[4].iCols * opts[4].iRows == 3))
149         {
150             sciErr = getMatrixOfDouble(pvApiCtx, opts[4].piAddr, &opts[4].iCols, &opts[4].iRows, &specular_color);
151         }
152
153         result = createLight(fname, axesHandle, type, visible, position, direction, ambient_color, diffuse_color, specular_color, &light_handle);
154
155     }
156
157     if (result == FALSE)
158     {
159         //error msg come from createLight
160         return 0;
161     }
162
163     if (createScalarHandle(pvApiCtx, nbInputArgument(pvApiCtx) + 1, light_handle))
164     {
165         Scierror(999, _("%s: Memory allocation error.\n"), fname);
166         return 0;
167     }
168
169     AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
170     ReturnArguments(pvApiCtx);
171     return 0;
172
173 }