Graphics: avoid crash due to scope problem
[scilab.git] / scilab / modules / graphics / sci_gateway / c / sci_grayplot.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2006 - INRIA - Fabrice Leray
4  * Copyright (C) 2006 - INRIA - Jean-Baptiste Silvy
5  * Copyright (C) 2011 - DIGITEO - Bruno JOFRET
6  *
7  * This file must be used under the terms of the CeCILL.
8  * This source file is licensed as described in the file COPYING, which
9  * you should have received as part of this distribution.  The terms
10  * are also available at
11  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
12  *
13  */
14
15 /*------------------------------------------------------------------------*/
16 /* file: sci_grayplot.c                                                   */
17 /* desc : interface for grayplot routine                                  */
18 /*------------------------------------------------------------------------*/
19
20 #include "gw_graphics.h"
21 #include "api_scilab.h"
22 #include "GetCommandArg.h"
23 #include "BuildObjects.h"
24 #include "DefaultCommandArg.h"
25 #include "sciCall.h"
26 #include "localization.h"
27 #include "Scierror.h"
28
29 /*--------------------------------------------------------------------------*/
30 int sci_grayplot(char *fname, unsigned long fname_len)
31 {
32     SciErr sciErr;
33     int frame_def = 8;
34     int *frame = &frame_def;
35     int axes_def = 1;
36     int *axes = &axes_def;
37     int m1 = 0, n1 = 0, m2 = 0, n2 = 0, m3 = 0, n3 = 0;
38     static rhs_opts opts[] =
39     {
40         { -1, "axesflag", -1, 0, 0, NULL},
41         { -1, "frameflag", -1, 0, 0, NULL},
42         { -1, "nax", -1, 0, 0, NULL},
43         { -1, "rect", -1, 0, 0, NULL},
44         { -1, "strf", -1, 0, 0, NULL},
45         { -1, NULL, -1, 0, 0, NULL}
46     };
47
48     char   * strf    = NULL ;
49     char strfl[4];
50     double* rect    = NULL ;
51     int    * nax     = NULL ;
52     BOOL     flagNax = FALSE;
53
54     int* piAddr1 = NULL;
55     int* piAddr2 = NULL;
56     int* piAddr3 = NULL;
57
58     double* l1 = NULL;
59     double* l2 = NULL;
60     double* l3 = NULL;
61
62     if (nbInputArgument(pvApiCtx) <= 0)
63     {
64         sci_demo(fname, fname_len);
65         return 0;
66     }
67     CheckInputArgument(pvApiCtx, 3, 7);
68
69     if (getOptionals(pvApiCtx, fname, opts) == 0)
70     {
71         ReturnArguments(pvApiCtx);
72         return 0;
73     }
74
75     if (FirstOpt() < 4)
76     {
77         Scierror(999, _("%s: Misplaced optional argument: #%d must be at position %d.\n"),
78                  fname, 1, 4);
79         return -1;
80     }
81     //get variable address
82     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr1);
83     if (sciErr.iErr)
84     {
85         printError(&sciErr, 0);
86         return 1;
87     }
88
89     // Retrieve a matrix of double at position 1.
90     sciErr = getMatrixOfDouble(pvApiCtx, piAddr1, &m1, &n1, &l1);
91     if (sciErr.iErr)
92     {
93         Scierror(202, _("%s: Wrong type for argument %d: A real expected.\n"), fname, 1);
94         printError(&sciErr, 0);
95         return 1;
96     }
97
98     //CheckVector
99     if (m1 != 1 && n1 != 1)
100     {
101         Scierror(999, _("%s: Wrong size for input argument #%d: Vector expected.\n"), fname, 1);
102         return 1;
103     }
104
105     //get variable address
106     sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2);
107     if (sciErr.iErr)
108     {
109         printError(&sciErr, 0);
110         return 1;
111     }
112
113     // Retrieve a matrix of double at position 2.
114     sciErr = getMatrixOfDouble(pvApiCtx, piAddr2, &m2, &n2, &l2);
115     if (sciErr.iErr)
116     {
117         Scierror(202, _("%s: Wrong type for argument %d: A real expected.\n"), fname, 2);
118         printError(&sciErr, 0);
119         return 1;
120     }
121
122     //CheckVector
123     if (m2 != 1 && n2 != 1)
124     {
125         Scierror(999, _("%s: Wrong size for input argument #%d: Vector expected.\n"), fname, 2);
126         return 1;
127     }
128
129     //get variable address
130     sciErr = getVarAddressFromPosition(pvApiCtx, 3, &piAddr3);
131     if (sciErr.iErr)
132     {
133         printError(&sciErr, 0);
134         return 1;
135     }
136
137     // Retrieve a matrix of double at position 3.
138     sciErr = getMatrixOfDouble(pvApiCtx, piAddr3, &m3, &n3, &l3);
139     if (sciErr.iErr)
140     {
141         Scierror(202, _("%s: Wrong type for argument %d: A real expected.\n"), fname, 3);
142         printError(&sciErr, 0);
143         return 1;
144     }
145
146     if (m3 * n3 == 0)
147     {
148         AssignOutputVariable(pvApiCtx, 1) = 0;
149         ReturnArguments(pvApiCtx);
150         return 0;
151     }
152
153     //CheckDimProp
154     if (m2 * n2 != n3)
155     {
156         Scierror(999, _("%s: Wrong size for input arguments: Incompatible sizes.\n"), fname);
157         return 1;
158     }
159
160     //CheckDimProp
161     if (m1 * n1 != m3)
162     {
163         Scierror(999, _("%s: Wrong size for input arguments: Incompatible sizes.\n"), fname);
164         return 1;
165     }
166
167
168     GetStrf(pvApiCtx, fname, 4, opts, &strf);
169     GetRect(pvApiCtx, fname, 5, opts, &rect);
170     GetNax(pvApiCtx, 6, opts, &nax, &flagNax);
171
172     getOrCreateDefaultSubwin();
173
174     if (isDefStrf(strf))
175     {
176         strcpy(strfl, DEFSTRFN);
177
178         strf = strfl;
179         if (!isDefRect(rect))
180         {
181             strfl[1] = '7';
182         }
183
184         GetOptionalIntArg(pvApiCtx, fname, 7, "frameflag", &frame, 1, opts);
185         if (frame != &frame_def)
186         {
187             strfl[1] = (char)(*frame + 48);
188         }
189         GetOptionalIntArg(pvApiCtx, fname, 7, "axesflag", &axes, 1, opts);
190         if (axes != &axes_def)
191         {
192             strfl[2] = (char)(*axes + 48);
193         }
194     }
195
196     Objgrayplot ((l1), (l2), (l3), &m3, &n3, strf, rect, nax, flagNax);
197
198     AssignOutputVariable(pvApiCtx, 1) = 0;
199     ReturnArguments(pvApiCtx);
200     return 0;
201 }
202 /*--------------------------------------------------------------------------*/