Merge remote-tracking branch 'origin/5.4'
[scilab.git] / scilab / modules / fftw / sci_gateway / c / sci_get_fftw_wisdom.c
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2006 - INRIA - Alan LAYEC
4 * Copyright (C) 2007 - INRIA - Allan CORNET
5 * Copyright (C) 2012 - Scilab Enterprises - Cedric Delamarre
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-en.txt
12 *
13 */
14 /*--------------------------------------------------------------------------*/
15 #include <stdlib.h>
16 #include "callfftw.h"
17 #include "api_scilab.h"
18 #include "MALLOC.h"
19 #include "gw_fftw.h"
20 #include "localization.h"
21 #include "freeArrayOfString.h"
22 #include "Scierror.h"
23 /*--------------------------------------------------------------------------*/
24 /* Return text of fftw wisdom
25 *
26 * Scilab Calling sequence :
27 *   -->tt=get_fftw_wisdom();
28 *
29 * Input : Nothing
30 *
31 * Output : a scilab string matrix
32 *
33 */
34 int sci_get_fftw_wisdom(char *fname, unsigned long fname_len)
35 {
36     int n1 = 0, i = 0, j = 0;
37     char *Str = NULL;
38     char **Str1 = NULL;
39
40     CheckInputArgument(pvApiCtx, 0, 0);
41     CheckOutputArgument(pvApiCtx, 0, 1);
42
43     if ((Str = call_fftw_export_wisdom_to_string()) == NULL)
44     {
45         Scierror(999, _("%s: MKL fftw library does not implement wisdom functions yet.\n"), fname);
46         return 1;
47     }
48
49     n1 = 0;
50     j = 0;
51     if (Str)
52     {
53         for (i = 0; i < (int)strlen(Str); i++)
54         {
55             if (Str[i] == '\n')
56             {
57                 int len = 0;
58                 int k = 0;
59
60                 n1++;
61
62                 if (Str1)
63                 {
64                     Str1 = (char **)REALLOC(Str1, sizeof(char *) * n1);
65                 }
66                 else
67                 {
68                     Str1 = (char **)MALLOC(sizeof(char *) * n1);
69                 }
70
71                 if (Str1 == NULL)
72                 {
73                     Scierror(999, _("%s: No more memory.\n"), fname);
74                     if (Str)
75                     {
76                         // According to the FFTW documentation we should free Str
77                         // string but doing makes Scilab crash!?
78                         //free(Str);
79                     }
80                     return 1;
81                 }
82
83                 len = i - j;
84
85                 if ((Str1[n1 - 1] = (char *)MALLOC(sizeof(char) * (len + 1))) == NULL)
86                 {
87                     freeArrayOfString(Str1, n1 - 1);
88                     if (Str)
89                     {
90                         // According to the FFTW documentation we should free Str
91                         // string but doing makes Scilab crash!?
92                         //free(Str);
93                     }
94                     Scierror(999, _("%s: No more memory.\n"), fname);
95                     return 1;
96                 }
97
98                 for (k = 0; k < len; k++)
99                 {
100                     Str1[n1 - 1][k] = Str[k + j];
101                 }
102                 Str1[n1 - 1][len] = '\0';
103                 j = i + 1;
104             }
105         }
106     }
107
108     n1++;
109
110     if (Str1)
111     {
112         Str1 = (char **)REALLOC(Str1, sizeof(char *) * n1);
113     }
114     else
115     {
116         Str1 = (char **)MALLOC(sizeof(char *) * n1);
117     }
118
119     if (Str1 == NULL)
120     {
121         Scierror(999, _("%s: No more memory.\n"), fname);
122         if (Str)
123         {
124             // According to the FFTW documentation we should free Str
125             // string but doing makes Scilab crash!?
126             //free(Str);
127         }
128         return 1;
129     }
130
131     if ((Str1[n1 - 1] = (char *)MALLOC(sizeof(char))) == NULL)
132     {
133         freeArrayOfString(Str1, n1 - 1);
134         if (Str)
135         {
136             // According to the FFTW documentation we should free Str
137             // string but doing makes Scilab crash!?
138             //free(Str);
139         }
140         Scierror(999, _("%s: No more memory.\n"), fname);
141         return 1;
142     }
143     Str1[n1 - 1][0] = '\0';
144
145     createMatrixOfString(pvApiCtx, nbInputArgument(pvApiCtx) + 1, n1, 1, Str1);
146
147     freeArrayOfString(Str1, n1);
148     if (Str)
149     {
150         // According to the FFTW documentation we should free Str
151         // string but doing makes Scilab crash!?
152         //free(Str);
153     }
154
155     AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
156     ReturnArguments(pvApiCtx);
157
158     return 0;
159 }
160 /*--------------------------------------------------------------------------*/