* Bug #14758 fixed - xstringb creates a figure when no exists.
[scilab.git] / scilab / modules / graphics / sci_gateway / c / sci_xstringb.c
1
2 /*
3  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
4  * Copyright (C) 2006 - INRIA - Fabrice Leray
5  * Copyright (C) 2006 - INRIA - Jean-Baptiste Silvy
6  *
7  * Copyright (C) 2012 - 2016 - Scilab Enterprises
8  *
9  * This file is hereby licensed under the terms of the GNU GPL v2.0,
10  * pursuant to article 5.3.4 of the CeCILL v.2.1.
11  * This file was originally licensed under the terms of the CeCILL v2.1,
12  * and continues to be available under such terms.
13  * For more information, see the COPYING file which you should have received
14  * along with this program.
15  *
16  */
17
18 /*------------------------------------------------------------------------*/
19 /* file: sci_xstringb.c                                                   */
20 /* desc : interface for xstringb routine                                  */
21 /*------------------------------------------------------------------------*/
22 #include <string.h>
23 #include "gw_graphics.h"
24 #include "api_scilab.h"
25 #include "Scierror.h"
26 #include "sciCall.h"
27 #include "freeArrayOfString.h"
28 #include "localization.h"
29 #include "CurrentFigure.h"
30 #include "createGraphicObject.h"
31 /*--------------------------------------------------------------------------*/
32 int sci_xstringb(char *fname, void *pvApiCtx)
33 {
34     SciErr sciErr;
35
36     int* piAddrl1 = NULL;
37     double* l1 = NULL;
38     int* piAddrl2 = NULL;
39     double* l2 = NULL;
40     int* piAddrStr = NULL;
41     int* piAddrl4 = NULL;
42     double* l4 = NULL;
43     int* piAddrl5 = NULL;
44     double* l5 = NULL;
45     int* piAddrl6 = NULL;
46     char* l6 = NULL;
47
48     int m1 = 0, n1 = 0, m2 = 0, n2 = 0, m3 = 0, n3 = 0, m4 = 0, n4 = 0, m5 = 0, n5 = 0, m6 = 0, n6 = 0;
49     BOOL autoSize = TRUE ;
50     double x = 0., y = 0., w = 0., hx = 0.;
51     char **Str = NULL;
52     double rect[4], angle = 0.;
53     long hdlstr = 0;
54     double userSize[2] ;
55     int textBoxMode = 1; // 0 : off | 1 : centered | 2 : filled
56     int iCurrentFigure = 0;
57
58     if ( nbInputArgument(pvApiCtx) <= 0 )
59     {
60         /* demo */
61         sci_demo(fname, pvApiCtx);
62         return 0 ;
63     }
64
65     CheckInputArgument(pvApiCtx, 5, 6);
66
67     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddrl1);
68     if (sciErr.iErr)
69     {
70         printError(&sciErr, 0);
71         return 1;
72     }
73
74     // Retrieve a matrix of double at position 1.
75     sciErr = getMatrixOfDouble(pvApiCtx, piAddrl1, &m1, &n1, &l1);
76     if (sciErr.iErr)
77     {
78         printError(&sciErr, 0);
79         Scierror(202, _("%s: Wrong type for argument #%d: A real expected.\n"), fname, 1);
80         return 1;
81     }
82
83     //CheckScalar
84     if (m1 != 1 || n1 != 1)
85     {
86         Scierror(999, _("%s: Wrong size for input argument #%d: A real scalar expected.\n"), fname, 1);
87         return 1;
88     }
89
90     x = *l1;
91     sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddrl2);
92     if (sciErr.iErr)
93     {
94         printError(&sciErr, 0);
95         return 1;
96     }
97
98     // Retrieve a matrix of double at position 2.
99     // YOU MUST REMOVE YOUR VARIABLE DECLARATION "int l2".
100     sciErr = getMatrixOfDouble(pvApiCtx, piAddrl2, &m2, &n2, &l2);
101     if (sciErr.iErr)
102     {
103         printError(&sciErr, 0);
104         Scierror(202, _("%s: Wrong type for argument #%d: A real expected.\n"), fname, 2);
105         return 1;
106     }
107
108     //CheckScalar
109     if (m2 != 1 || n2 != 1)
110     {
111         Scierror(999, _("%s: Wrong size for input argument #%d: A real scalar expected.\n"), fname, 2);
112         return 1;
113     }
114
115     y = *l2;
116     sciErr = getVarAddressFromPosition(pvApiCtx, 3, &piAddrStr);
117     if (sciErr.iErr)
118     {
119         printError(&sciErr, 0);
120         return 1;
121     }
122
123     // Retrieve a matrix of string at position 3.
124     if (getAllocatedMatrixOfString(pvApiCtx, piAddrStr, &m3, &n3, &Str))
125     {
126         Scierror(202, _("%s: Wrong type for argument #%d: string expected.\n"), fname, 3);
127         return 1;
128     }
129
130     if ( m3 * n3 == 0 )
131     {
132         AssignOutputVariable(pvApiCtx, 1) = 0;
133         ReturnArguments(pvApiCtx);
134         freeArrayOfString(Str, m3 * n3);
135         return 0;
136     }
137
138     sciErr = getVarAddressFromPosition(pvApiCtx, 4, &piAddrl4);
139     if (sciErr.iErr)
140     {
141         printError(&sciErr, 0);
142         freeArrayOfString(Str, m3 * n3);
143         return 1;
144     }
145
146     // Retrieve a matrix of double at position 4.
147     sciErr = getMatrixOfDouble(pvApiCtx, piAddrl4, &m4, &n4, &l4);
148     if (sciErr.iErr)
149     {
150         printError(&sciErr, 0);
151         Scierror(202, _("%s: Wrong type for argument #%d: A real expected.\n"), fname, 4);
152         freeArrayOfString(Str, m3 * n3);
153         return 1;
154     }
155
156     //CheckScalar
157     if (m4 != 1 || n4 != 1)
158     {
159         Scierror(999, _("%s: Wrong size for input argument #%d: A real scalar expected.\n"), fname, 4);
160         freeArrayOfString(Str, m3 * n3);
161         return 1;
162     }
163
164     w = *l4;
165     sciErr = getVarAddressFromPosition(pvApiCtx, 5, &piAddrl5);
166     if (sciErr.iErr)
167     {
168         printError(&sciErr, 0);
169         freeArrayOfString(Str, m3 * n3);
170         return 1;
171     }
172
173     // Retrieve a matrix of double at position 5.
174     sciErr = getMatrixOfDouble(pvApiCtx, piAddrl5, &m5, &n5, &l5);
175     if (sciErr.iErr)
176     {
177         printError(&sciErr, 0);
178         Scierror(202, _("%s: Wrong type for argument #%d: A real expected.\n"), fname, 5);
179         freeArrayOfString(Str, m3 * n3);
180         return 1;
181     }
182
183     //CheckScalar
184     if (m5 != 1 || n5 != 1)
185     {
186         Scierror(999, _("%s: Wrong size for input argument #%d: A real scalar expected.\n"), fname, 5);
187         freeArrayOfString(Str, m3 * n3);
188         return 1;
189     }
190
191     hx = *l5;
192
193     if (nbInputArgument(pvApiCtx) == 6)
194     {
195         sciErr = getVarAddressFromPosition(pvApiCtx, 6, &piAddrl6);
196         if (sciErr.iErr)
197         {
198             printError(&sciErr, 0);
199             freeArrayOfString(Str, m3 * n3);
200             return 1;
201         }
202
203         // Retrieve a string at position 6.
204         if (isScalar(pvApiCtx, piAddrl6) == 0)
205         {
206             Scierror(999, _("%s: Wrong type for argument #%d: string expected.\n"), fname, 6);
207             freeArrayOfString(Str, m3 * n3);
208             return 1;
209         }
210
211         if (getAllocatedSingleString(pvApiCtx, piAddrl6, &l6))
212         {
213             Scierror(202, _("%s: Wrong type for argument #%d: string expected.\n"), fname, 6);
214             freeArrayOfString(Str, m3 * n3);
215             return 1;
216         }
217
218         if (strcmp(l6, "fill") == 0 )
219         {
220             autoSize = FALSE ;
221             textBoxMode = 2;
222         }
223         else
224         {
225             Scierror(999, _("%s: Wrong value for input argument #%d: '%s' expected.\n"), fname, 6, "fill");
226             freeAllocatedSingleString(l6);
227             freeArrayOfString(Str, m3 * n3);
228             return 0;
229         }
230
231         freeAllocatedSingleString(l6);
232     }
233
234     userSize[0] = w ;
235     userSize[1] = hx ;
236
237     iCurrentFigure = getCurrentFigure();
238
239     if (iCurrentFigure == 0)
240     {
241         iCurrentFigure = createNewFigureWithAxes();
242     }
243
244     Objstring (Str, m3, n3, x, y, &angle, rect, autoSize, userSize, &hdlstr, textBoxMode, NULL, NULL, FALSE, TRUE, FALSE, ALIGN_CENTER);
245
246     freeArrayOfString(Str, m3 * n3);
247
248     AssignOutputVariable(pvApiCtx, 1) = 0;
249     ReturnArguments(pvApiCtx);
250
251     return 0;
252
253 }
254 /*--------------------------------------------------------------------------*/