Xcos-Scicos: indent some files before modification
[scilab.git] / scilab / modules / scicos / src / c / createblklist.c
1 /*  Scicos
2 *
3 *  Copyright (C) DIGITEO - 2009 - Allan CORNET
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 "createblklist.h"
23 #include "machine.h"
24 #include "stack-c.h"
25 #include "import.h"
26 #include "var2sci.h"
27 #include "MALLOC.h"
28 /*--------------------------------------------------------------------------*/
29 extern void str2sci(char** x, int n, int m); /* core/src/c/str2sci.h */
30 extern void C2F(itosci)();
31 extern void C2F(dtosci)();
32 extern int C2F(scierr)();
33 extern void C2F(vvtosci)();
34 extern int C2F(mktlist)();
35 /*--------------------------------------------------------------------------*/
36 int createblklist(scicos_block *Blocks, int *ierr, int flag_imp, int funtyp)
37 {
38     /*local variable declaration*/
39     int j, k;
40     int nu, mu, ny, my;
41     int u_typ, y_typ;
42     int oz_typ, opar_typ;
43
44     /*variable used when imp_flag>=0*/
45     int nv, mv;         /* length of data                                        */
46     int nblk, ng;       /* to store number of blocks and number of zero cross.   */
47     void *ptr;          /* ptr for data comming from import structure            */
48     int *ptr_int;       /* ptr to store ptr on integer                           */
49     double *ptr_double; /* ptr to store ptr on double                            */
50     int *xptr = NULL;   /* to retrieve xptr by import and zcptr of scicos_blocks */
51     int *zcptr = NULL;
52     double *x = NULL;   /* ptr for x, xd and g for scicos_blocks              */
53     double *xd = NULL;
54     double *g = NULL;
55
56     /* set length of block list -please update me-                           */
57     static int nblklst = 40;
58     /* set string of first element of scilab Blocks tlist -please update me- */
59     static char *str_blklst[] = { "scicos_block", "nevprt"  , "funpt" , "type"  ,
60                                   "scsptr"      , "nz"      , "z"     , "noz"   ,
61                                   "ozsz"        , "oztyp"   , "oz"    , "nx"    ,
62                                   "x"           , "xd"      , "res"   , "nin"   ,
63                                   "insz"        , "inptr"   , "nout"  , "outsz" ,
64                                   "outptr"      , "nevout"  , "evout" , "nrpar" ,
65                                   "rpar"        , "nipar"   , "ipar"  , "nopar" ,
66                                   "oparsz"      , "opartyp" , "opar"  , "ng"    ,
67                                   "g"           , "ztyp"    , "jroot" , "label" ,
68                                   "work"        , "nmode"   , "mode"  , "xprop"
69                                 };
70
71     /* char ptr for str2sci - see below - */
72     char **str1;
73
74     /* set nblk, x, xd ptr coming from import strucuture,
75     * if flag_imp >=0
76     */
77     if (flag_imp >= 0)
78     {
79         /*retrieve nblk by import structure*/
80         strcpy(C2F(cha1).buf, "nblk");
81         *ierr = getscicosvarsfromimport(C2F(cha1).buf, &ptr, &nv, &mv);
82         if (*ierr == 0)
83         {
84             return 0;
85         }
86         ptr_int = (int *) ptr;
87         nblk = *ptr_int;
88
89         /* retrieve ng by import structure */
90         strcpy(C2F(cha1).buf, "ng");
91         *ierr = getscicosvarsfromimport(C2F(cha1).buf, &ptr, &nv, &mv);
92         ptr_int = (int *) ptr; /* cast void* ptr to int* ptr */
93         ng = *ptr_int;
94
95         /*retrieve xptr by import structure*/
96         strcpy(C2F(cha1).buf, "xptr");
97         *ierr = getscicosvarsfromimport(C2F(cha1).buf, &ptr, &nv, &mv);
98         if (*ierr == 0)
99         {
100             return 0;
101         }
102         ptr_int = (int *) ptr;
103         xptr = ptr_int;
104
105         /*retrieve zcptr by import structure*/
106         strcpy(C2F(cha1).buf, "zcptr");
107         *ierr = getscicosvarsfromimport(C2F(cha1).buf, &ptr, &nv, &mv);
108         ptr_int = (int *) ptr;
109         zcptr = ptr_int;
110
111         /*retrieve x and xd by import structure*/
112         strcpy(C2F(cha1).buf, "x");
113         *ierr = getscicosvarsfromimport(C2F(cha1).buf, &ptr, &nv, &mv);
114         if (*ierr == 0)
115         {
116             return 0;
117         }
118         ptr_double = (double *) ptr;
119         x = ptr_double;
120         xd = &x[xptr[nblk] - 1];
121
122         /*retrieve g by import structure*/
123         strcpy(C2F(cha1).buf, "g");
124         *ierr = getscicosvarsfromimport(C2F(cha1).buf, &ptr, &nv, &mv);
125         ptr_double = (double *) ptr;
126         g = ptr_double;
127     }
128
129     /****************************
130     * create scilab tlist Blocks
131     ****************************/
132     /* 1 - scicos_block */
133     str2sci(str_blklst, 1, nblklst);
134
135     /* 2 - nevprt */
136     C2F(itosci)(&Blocks[0].nevprt, (j = 1, &j), (k = 1, &k));
137     if (C2F(scierr)() != 0)
138     {
139         return 0;
140     }
141
142     /* 3 - funpt */
143     if (sizeof(voidg) >= sizeof(double))
144     {
145         // store N double values as the function pointer value
146         j = sizeof(voidg) / sizeof(double);
147     }
148     else
149     {
150         // push at least one double
151         j = 1;
152     }
153     C2F(dtosci)(&Blocks[0].funpt, &j, (k = 1, &k));
154
155     /* 4 - type */
156     C2F(itosci)(&Blocks[0].type, (j = 1, &j), (k = 1, &k));
157     if (C2F(scierr)() != 0)
158     {
159         return 0;
160     }
161
162     /* 5 - scsptr */
163     C2F(itosci)(&Blocks[0].scsptr, (j = 1, &j), (k = 1, &k));
164     if (C2F(scierr)() != 0)
165     {
166         return 0;
167     }
168
169     /* 6 - nz */
170     C2F(itosci)(&Blocks[0].nz, (j = 1, &j), (k = 1, &k));
171     if (C2F(scierr)() != 0)
172     {
173         return 0;
174     }
175
176     /* 7 - z */
177     if (Blocks[0].scsptr > 0)
178     {
179         C2F(vvtosci)(Blocks[0].z, &Blocks[0].nz);
180         if (C2F(scierr)() != 0)
181         {
182             return 0;
183         }
184     }
185     else
186     {
187         *ierr = var2sci(Blocks[0].z, Blocks[0].nz, 1, SCSREAL_N);
188         if (*ierr != 0)
189         {
190             return 0;
191         }
192     }
193
194     /* 8 - noz */
195     C2F(itosci)(&Blocks[0].noz, (j = 1, &j), (k = 1, &k));
196     if (C2F(scierr)() != 0)
197     {
198         return 0;
199     }
200
201     /* 9 - ozsz */
202     C2F(itosci)(Blocks[0].ozsz, (j = Blocks[0].noz, &j), (k = 2, &k));
203     if (C2F(scierr)() != 0)
204     {
205         return 0;
206     }
207
208     /* 10 - oztyp */
209     C2F(itosci)(Blocks[0].oztyp, (j = Blocks[0].noz, &j), (k = 1, &k));
210     if (C2F(scierr)() != 0)
211     {
212         return 0;
213     }
214
215     /* 11 - oz */
216     for (k = 0; k < Blocks[0].noz; k++)
217     {
218         nu = Blocks[0].ozsz[k]; /* retrieve number of rows */
219         mu = Blocks[0].ozsz[Blocks[0].noz + k]; /* retrieve number of cols */
220         oz_typ = Blocks[0].oztyp[k]; /* retrieve type */
221         *ierr = var2sci(Blocks[0].ozptr[k], nu, mu, oz_typ);
222         if (*ierr != 0)
223         {
224             return 0;
225         }
226     }
227     /* if C blocks or null size then concatenate in a single list */
228     if ((funtyp == 4) || (Blocks[0].noz == 0))
229     {
230         C2F(mklist)(&Blocks[0].noz); /*create oz list*/
231     }
232
233     /* 12 - nx */
234     C2F(itosci)(&Blocks[0].nx, (j = 1, &j), (k = 1, &k));
235     if (C2F(scierr)() != 0)
236     {
237         return 0;
238     }
239
240     /* 13 - x */
241     if (flag_imp >= 0)
242     {
243         *ierr = var2sci(&x[xptr[flag_imp] - 1], Blocks[0].nx, 1, SCSREAL_N);
244     }
245     else
246     {
247         *ierr = var2sci(Blocks[0].x, Blocks[0].nx, 1, SCSREAL_N);
248     }
249     if (*ierr != 0)
250     {
251         return 0;
252     }
253
254     /* 14 - xd */
255     if (flag_imp >= 0)
256     {
257         *ierr = var2sci(&xd[xptr[flag_imp] - 1], Blocks[0].nx, 1, SCSREAL_N);
258     }
259     else
260     {
261         *ierr = var2sci(Blocks[0].xd, Blocks[0].nx, 1, SCSREAL_N);
262     }
263     if (*ierr != 0)
264     {
265         return 0;
266     }
267
268     /* 15 - res */
269     *ierr = var2sci(Blocks[0].res, Blocks[0].nx, 1, SCSREAL_N);
270     if (*ierr != 0)
271     {
272         return 0;
273     }
274
275     /* 16 - nin */
276     C2F(itosci)(&Blocks[0].nin, (j = 1, &j), (k = 1, &k));
277     if (C2F(scierr)() != 0)
278     {
279         return 0;
280     }
281
282     /* 17 - insz */
283     C2F(itosci)(Blocks[0].insz, (j = 3 * Blocks[0].nin, &j), (k = 1, &k));
284     if (C2F(scierr)() != 0)
285     {
286         return 0;
287     }
288
289     /* 18 - inptr */
290     for (k = 0; k < Blocks[0].nin; k++)
291     {
292         nu = Blocks[0].insz[k]; /* retrieve number of rows */
293         mu = Blocks[0].insz[Blocks[0].nin + k]; /* retrieve number of cols */
294         u_typ = Blocks[0].insz[2 * Blocks[0].nin + k]; /* retrieve type */
295         *ierr = var2sci(Blocks[0].inptr[k], nu, mu, u_typ);
296         if (*ierr != 0)
297         {
298             return 0;
299         }
300     }
301     C2F(mklist)(&Blocks[0].nin); /*create inptr list*/
302
303     /* 19 - nout */
304     C2F(itosci)(&Blocks[0].nout, (j = 1, &j), (k = 1, &k));
305     if (C2F(scierr)() != 0)
306     {
307         return 0;
308     }
309
310     /* 20 - outsz */
311     C2F(itosci)(Blocks[0].outsz, (j = 3 * Blocks[0].nout, &j), (k = 1, &k));
312     if (C2F(scierr)() != 0)
313     {
314         return 0;
315     }
316
317     /* 21 - outptr */
318     for (k = 0; k < Blocks[0].nout; k++)
319     {
320         ny = Blocks[0].outsz[k]; /* retrieve number of rows */
321         my = Blocks[0].outsz[Blocks[0].nout + k]; /* retrieve number of cols */
322         y_typ = Blocks[0].outsz[2 * Blocks[0].nout + k]; /* retrieve type */
323         *ierr = var2sci(Blocks[0].outptr[k], ny, my, y_typ);
324         if (*ierr != 0)
325         {
326             return 0;
327         }
328     }
329     C2F(mklist)(&Blocks[0].nout); /*create outptr list*/
330
331     /* 22 - nevout */
332     C2F(itosci)(&Blocks[0].nevout, (j = 1, &j), (k = 1, &k));
333     if (C2F(scierr)() != 0)
334     {
335         return 0;
336     }
337
338     /* 23 - evout */
339     *ierr = var2sci(Blocks[0].evout, Blocks[0].nevout, 1, SCSREAL_N);
340     if (*ierr != 0)
341     {
342         return 0;
343     }
344
345     /* 24 - nrpar */
346     C2F(itosci)(&Blocks[0].nrpar, (j = 1, &j), (k = 1, &k));
347     if (C2F(scierr)() != 0)
348     {
349         return 0;
350     }
351
352     /* 25 - rpar */
353     if (Blocks[0].scsptr > 0)
354     {
355         C2F(vvtosci)(Blocks[0].rpar, &Blocks[0].nrpar);
356         if (C2F(scierr)() != 0)
357         {
358             return 0;
359         }
360     }
361     else
362     {
363         *ierr = var2sci(Blocks[0].rpar, Blocks[0].nrpar, 1, SCSREAL_N);
364         if (*ierr != 0)
365         {
366             return 0;
367         }
368     }
369
370     /* 26 - nipar */
371     C2F(itosci)(&Blocks[0].nipar, (j = 1, &j), (k = 1, &k));
372     if (C2F(scierr)() != 0)
373     {
374         return 0;
375     }
376
377     /* 27 - ipar */
378     C2F(itosci)(Blocks[0].ipar, (j = Blocks[0].nipar, &j), (k = 1, &k));
379     if (C2F(scierr)() != 0)
380     {
381         return 0;
382     }
383
384     /* 28 - nopar */
385     C2F(itosci)(&Blocks[0].nopar, (j = 1, &j), (k = 1, &k));
386     if (C2F(scierr)() != 0)
387     {
388         return 0;
389     }
390
391     /* 29 - oparsz */
392     C2F(itosci)(Blocks[0].oparsz, (j = Blocks[0].nopar, &j), (k = 2, &k));
393     if (C2F(scierr)() != 0)
394     {
395         return 0;
396     }
397
398     /* 30 - opartyp */
399     C2F(itosci)(Blocks[0].opartyp, (j = Blocks[0].nopar, &j), (k = 1, &k));
400     if (C2F(scierr)() != 0)
401     {
402         return 0;
403     }
404
405     /* 31 - opar */
406     for (k = 0; k < Blocks[0].nopar; k++)
407     {
408         nu = Blocks[0].oparsz[k]; /* retrieve number of rows */
409         mu = Blocks[0].oparsz[Blocks[0].nopar + k]; /* retrieve number of cols */
410         opar_typ = Blocks[0].opartyp[k]; /* retrieve type */
411         *ierr = var2sci(Blocks[0].oparptr[k], nu, mu, opar_typ);
412         if (*ierr != 0)
413         {
414             return 0;
415         }
416     }
417     /* if C blocks or null size then concatenate in a single list */
418     if ((funtyp == 4) || (Blocks[0].nopar == 0))
419     {
420         C2F(mklist)(&Blocks[0].nopar); /*create opar list*/
421     }
422
423     /* 32 - ng */
424     C2F(itosci)(&Blocks[0].ng, (j = 1, &j), (k = 1, &k));
425     if (C2F(scierr)() != 0)
426     {
427         return 0;
428     }
429
430     /* 33 - g */
431     if (flag_imp >= 0)
432     {
433         *ierr = var2sci(&g[zcptr[flag_imp] - 1], Blocks[0].ng, 1, SCSREAL_N);
434     }
435     else
436     {
437         *ierr = var2sci(Blocks[0].g, Blocks[0].ng, 1, SCSREAL_N);
438     }
439     if (*ierr != 0)
440     {
441         return 0;
442     }
443
444     /* 34 - ztyp */
445     C2F(itosci)(&Blocks[0].ztyp, (j = 1, &j), (k = 1, &k));
446     if (C2F(scierr)() != 0)
447     {
448         return 0;
449     }
450
451     /* 35 - jroot */
452     C2F(itosci)(Blocks[0].jroot, (j = Blocks[0].ng, &j), (k = 1, &k));
453     if (C2F(scierr)() != 0)
454     {
455         return 0;
456     }
457
458     /* 36 - label */
459     if ((str1 = MALLOC(sizeof(char*))) == NULL )
460     {
461         return 0;
462     }
463     if ((str1[0] = MALLOC(sizeof(char) * (strlen(Blocks[0].label) + 1))) == NULL )
464     {
465         FREE(str1);
466         return 0;
467     }
468     (str1[0])[strlen(Blocks[0].label)] = '\0';
469     strncpy(str1[0], Blocks[0].label, strlen(Blocks[0].label));
470     str2sci(str1, 1, 1);
471     FREE(str1[0]);
472     FREE(str1);
473     if (C2F(scierr)() != 0)
474     {
475         return 0;
476     }
477
478     /* 37 - work*/
479     C2F(itosci)(&Blocks[0].work, (j = 1, &j), (k = 1, &k));
480     if (C2F(scierr)() != 0)
481     {
482         return 0;
483     }
484
485     /* 38 - nmode*/
486     C2F(itosci)(&Blocks[0].nmode, (j = 1, &j), (k = 1, &k));
487     if (C2F(scierr)() != 0)
488     {
489         return 0;
490     }
491
492     /* 39 - mode */
493     C2F(itosci)(Blocks[0].mode, (j = Blocks[0].nmode, &j), (k = 1, &k));
494     if (C2F(scierr)() != 0)
495     {
496         return 0;
497     }
498
499     /* 40 - xprop */
500     C2F(itosci)(Blocks[0].xprop, (j = Blocks[0].nx, &j), (k = 1, &k));
501     if (C2F(scierr)() != 0)
502     {
503         return 0;
504     }
505
506     C2F(mktlist)(&nblklst); /*create Blocks list*/
507     if (C2F(scierr)() != 0)
508     {
509         return 0;
510     }
511
512     /*return 1 if succeeded */
513     return 1;
514 }
515 /*--------------------------------------------------------------------------*/
516