Remove some double free declarations
[scilab.git] / scilab / modules / scicos / sci_gateway / c / sci_callblk.c
1 /*  Scicos
2 *
3 *  Copyright (C) INRIA -
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 *
19 * See the file ./license.txt
20 */
21 /*--------------------------------------------------------------------------*/
22 #include <stdio.h>
23 #include "gw_scicos.h"
24 #include "stack-c.h"
25 #include "scicos_block4.h"
26 #include "Scierror.h"
27 #include "localization.h"
28 #include "cvstr.h"
29 #include "createblklist.h"
30 #include "extractblklist.h"
31 #include "scicos.h"
32 #include "MALLOC.h"
33 /*--------------------------------------------------------------------------*/
34 extern int *listentry(int *header, int i);
35 /*--------------------------------------------------------------------------*/
36 int sci_callblk(char *fname, unsigned long fname_len)
37 {
38     /* auxilary variables -dimension and address-
39     * for scilab stack variables
40     */
41     int *il1 = NULL;
42     int m1 = 0, n1 = 0;
43     int *il2_1 = NULL;
44     int m2_1 = 0, n2_1 = 0;
45     int *il2 = NULL;
46     int m2 = 0, n2 = 0;
47     int *il3 = NULL;
48     int m3 = 0, n3 = 0;
49
50     /* local variable */
51     int len_str = 0;
52     char *str = NULL;
53     int ierr = 0, ret = 0;
54     int j = 0;
55     int TopSave = 0;
56     int l_tmp = 0;
57
58     /* length of the scilab list scicos struct */
59     int nblklst = 40;
60
61     /* variable for callf */
62     scicos_flag flag = 0;
63     double t = 0.;
64
65     scicos_block Block;
66     memset(&Block, 0, sizeof(scicos_block));
67
68     /* check number of rhs/lhs param */
69     CheckRhs(3, 3);
70     CheckLhs(1, 1);
71
72     /* check rhs 1 (input scilab structure) */
73     il1 = (int *) GetData(1);
74     m1  = il1[1];
75     n1  = il1[2];
76     if (il1[0] != 16)
77     {
78         Scierror(888, _("%s : First argument must be a scicos_block typed list.\n"), fname);
79         return 0;
80     }
81
82     il2_1 = (int *) (listentry(il1, 1));
83     m2_1  = il2_1[1];
84     n2_1  = il2_1[2];
85     if ((il2_1[0] != 10) || ((m2_1 * n2_1) != nblklst))
86     {
87         Scierror(888, _("%s : First argument must be a valid scicos_block typed list.\n"), fname);
88         return 0;
89     }
90     len_str = il2_1[5] - 1;
91     if (len_str != 0)
92     {
93         if ((str = (char *) MALLOC((len_str + 1) * sizeof(char))) == NULL)
94         {
95             Scierror(888, _("%s: Memory allocation error.\n"), fname);
96             return 0;
97         }
98         str[len_str] = '\0';
99         C2F(cvstr)(&len_str, &il2_1[5 + nblklst], str, (j = 1, &j), len_str);
100         ret = strcmp("scicos_block", str);
101         FREE(str);
102         if (ret != 0)
103         {
104             Scierror(888, _("%s : First argument must be a valid scicos_block typed list.\n"), fname);
105             return 0;
106         }
107     }
108     else
109     {
110         Scierror(888, _("%s : First argument must be a valid scicos_block typed list.\n"), fname);
111         return 0;
112     }
113
114     /* convert scilab scicos struct to a C scicos struct */
115     ret = extractblklist(il1, &Block, &ierr);
116
117     /* error table */
118     switch (ierr)
119     {
120         case -39 :
121             Scierror(888, _("%s: Memory allocation error.\n"), fname);
122             break;
123
124         case 98  :
125             Scierror(888, _("%s : First argument must be a valid scicos_block typed list.\n"), fname);
126             break;
127
128         default:
129             break;
130     }
131
132     if (ierr != 0)
133     {
134         FREE(Block.z);
135         FREE(Block.ozsz);
136         FREE(Block.oztyp);
137         for (j = 0; j < Block.noz; j++) FREE(Block.ozptr[j]);
138         FREE(Block.ozptr);
139         FREE(Block.x);
140         FREE(Block.xd);
141         FREE(Block.xprop);
142         FREE(Block.res);
143         FREE(Block.insz);
144         for (j = 0; j < Block.nin; j++) FREE(Block.inptr[j]);
145         FREE(Block.inptr);
146         FREE(Block.outsz);
147         for (j = 0; j < Block.nout; j++) FREE(Block.outptr[j]);
148         FREE(Block.outptr);
149         FREE(Block.evout);
150         FREE(Block.rpar);
151         FREE(Block.ipar);
152         FREE(Block.oparsz);
153         FREE(Block.opartyp);
154         for (j = 0; j < Block.nopar; j++) FREE(Block.oparptr[j]);
155         FREE(Block.oparptr);
156         FREE(Block.g);
157         FREE(Block.jroot);
158         if (strlen(Block.label) != 0) FREE(Block.label);
159         FREE(Block.mode);
160         return 0;
161     }
162
163     /* check rhs 2 (flag) */
164     il2 = (int *) GetData(2);
165     m2  = il2[1];
166     n2  = il2[2];
167     if ((il2[0] != 1) || (m2*n2 != 1))
168     {
169         Scierror(888, _("%s : Second argument must be scalar.\n"), fname);
170         return 0;
171     }
172     flag = (scicos_flag) * ((double *)(&il2[4]));
173
174     /* check rhs 3 (time) */
175     il3 = (int *) GetData(3);
176     m3  = il3[1];
177     n3  = il3[2];
178
179     if ((il3[0] != 1) || (m3*n3 != 1))
180     {
181         Scierror(888, _("%s : Third argument must be scalar.\n"), fname);
182         return 0;
183     }
184     t = *((double *)(&il3[4]));
185
186     /* call block */
187     callf(&t, &Block, &flag);
188
189     /* build output  scilab structure */
190     TopSave = Top;
191
192     ierr = createblklist(&Block, &ierr, -1, Block.type);
193
194     FREE(Block.z);
195     FREE(Block.ozsz);
196     FREE(Block.oztyp);
197     for (j = 0; j < Block.noz; j++) FREE(Block.ozptr[j]);
198     FREE(Block.ozptr);
199     FREE(Block.x);
200     FREE(Block.xd);
201     FREE(Block.res);
202     FREE(Block.insz);
203     for (j = 0; j < Block.nin; j++) FREE(Block.inptr[j]);
204     FREE(Block.inptr);
205     FREE(Block.outsz);
206     for (j = 0; j < Block.nout; j++) FREE(Block.outptr[j]);
207     FREE(Block.outptr);
208     FREE(Block.evout);
209     FREE(Block.rpar);
210     FREE(Block.ipar);
211     FREE(Block.oparsz);
212     FREE(Block.opartyp);
213     for (j = 0; j < Block.nopar; j++) FREE(Block.oparptr[j]);
214     FREE(Block.oparptr);
215     FREE(Block.g);
216     FREE(Block.jroot);
217     if (strlen(Block.label) != 0) FREE(Block.label);
218     FREE(Block.mode);
219
220     Top = TopSave;
221
222     CreateVar(4, TYPED_LIST_DATATYPE, &nblklst, (j = 1, &j), &l_tmp);
223     LhsVar(1) = 4;
224     PutLhsVar();
225
226     return 0;
227 }
228 /*--------------------------------------------------------------------------*/