Remove printf calls
[scilab.git] / scilab / modules / spreadsheet / sci_gateway / c / sci_csvDefault.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - 2012 - INRIA - Allan CORNET
4  * Copyright (C) 2011 - INRIA - Michael Baudin
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11  *
12  * This code is also published under the GPL v3 license.
13  *
14  */
15
16 #include <string.h>
17 #include <stdio.h>
18 #include "gw_spreadsheet.h"
19 #include "api_scilab.h"
20 #include "Scierror.h"
21 #include "sci_malloc.h"
22 #include "Scierror.h"
23 #include "localization.h"
24 #include "freeArrayOfString.h"
25 #include "os_string.h"
26 #include "csvDefault.h"
27 #include "gw_csv_helpers.h"
28 #include "csvDefault.h"
29
30 // =============================================================================
31 #define SEPARATOR_FIELDNAME "separator"
32 #define DECIMAL_FIELDNAME "decimal"
33 #define CONVERSION_FIELDNAME "conversion"
34 #define PRECISION_FIELDNAME "precision"
35 #define COMMENTSREGEXP_FIELDNAME "regexp"
36 #define EOL_FIELDNAME "eol"
37 #define ENCODING_FIELDNAME "encoding"
38 #define RESET_PARAMATERS "reset"
39 #define BLANK_FIELDNAME "blank"
40 // =============================================================================
41 #define MACOS9_EOL_STRING "macos9"
42 #define MACOS9_EOL "\r"
43 #define WINDOWS_EOL_STRING "windows"
44 #define WINDOWS_EOL "\r\n"
45 #define LINUX_EOL_STRING "linux"
46 #define LINUX_EOL "\n"
47 // =============================================================================
48 #define NUMBER_FIELD 8
49 // =============================================================================
50 static void freeVar(char** fieldname, char** fieldvalue);
51 static int sci_csvDefault_no_rhs(char *fname, void* pvApiCtx);
52 static int sci_csvDefault_one_rhs(char *fname, void* pvApiCtx);
53 static int sci_csvDefault_two_rhs(char *fname, void* pvApiCtx);
54 // =============================================================================
55 int sci_csvDefault(char *fname, void* pvApiCtx)
56 {
57     Rhs = Max(0, Rhs);
58     CheckRhs(0, 2);
59     CheckLhs(1, 1);
60
61     switch (Rhs)
62     {
63         case 0:
64             return sci_csvDefault_no_rhs(fname, pvApiCtx);
65         case 1:
66             return sci_csvDefault_one_rhs(fname, pvApiCtx);
67         case 2:
68             return sci_csvDefault_two_rhs(fname, pvApiCtx);
69     }
70     return 0;
71 }
72 // =============================================================================
73 static int sci_csvDefault_no_rhs(char *fname, void* pvApiCtx)
74 {
75     int sizeArray = NUMBER_FIELD * 2;
76     char **arrayOut = (char**)MALLOC(sizeof(char*) * sizeArray);
77
78     if (arrayOut)
79     {
80         SciErr sciErr;
81
82         int nbRows = NUMBER_FIELD;
83         int nbCols = 2;
84         const char *currentEol = getCsvDefaultEOL();
85
86         arrayOut[0] = os_strdup(SEPARATOR_FIELDNAME);
87         arrayOut[1] = os_strdup(DECIMAL_FIELDNAME);
88         arrayOut[2] = os_strdup(CONVERSION_FIELDNAME);
89         arrayOut[3] = os_strdup(PRECISION_FIELDNAME);
90         arrayOut[4] = os_strdup(COMMENTSREGEXP_FIELDNAME);
91         arrayOut[5] = os_strdup(EOL_FIELDNAME);
92         arrayOut[6] = os_strdup(ENCODING_FIELDNAME);
93         arrayOut[7] = os_strdup(BLANK_FIELDNAME);
94
95         arrayOut[8] = os_strdup(getCsvDefaultSeparator());
96         arrayOut[9] = os_strdup(getCsvDefaultDecimal());
97         arrayOut[10] = os_strdup(getCsvDefaultConversion());
98         arrayOut[11] = os_strdup(getCsvDefaultPrecision());
99         arrayOut[12] = os_strdup(getCsvDefaultCommentsRegExp());
100
101         if (currentEol)
102         {
103             if (strcmp(currentEol, MACOS9_EOL) == 0)
104             {
105                 arrayOut[13] = os_strdup(MACOS9_EOL_STRING);
106             }
107             else if (strcmp(currentEol, WINDOWS_EOL) == 0)
108             {
109                 arrayOut[13] = os_strdup(WINDOWS_EOL_STRING);
110             }
111             else if (strcmp(currentEol, LINUX_EOL) == 0)
112             {
113                 arrayOut[13] = os_strdup(LINUX_EOL_STRING);
114             }
115             else
116             {
117                 arrayOut[13] = os_strdup("ERROR");
118             }
119         }
120         else
121         {
122             arrayOut[13] = os_strdup("ERROR");
123         }
124
125         arrayOut[14] = os_strdup(getCsvDefaultEncoding());
126         arrayOut[15] = os_strdup(getCsvDefaultCsvIgnoreBlankLine());
127
128         sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, nbRows, nbCols, arrayOut);
129         freeArrayOfString(arrayOut, sizeArray);
130         if (sciErr.iErr)
131         {
132             printError(&sciErr, 0);
133             return 0;
134         }
135
136         LhsVar(1) = Rhs + 1;
137         PutLhsVar();
138     }
139     else
140     {
141         Scierror(999, _("%s: Memory allocation error.\n"), fname);
142     }
143
144     return 0;
145 }
146 // =============================================================================
147 static int sci_csvDefault_one_rhs(char *fname, void* pvApiCtx)
148 {
149     int iErr = 0;
150
151     char *fieldname = NULL;
152     char *fieldvalue = NULL;
153
154     fieldname = csv_getArgumentAsString(pvApiCtx, 1, fname, &iErr);
155     if (iErr)
156     {
157         freeVar(&fieldname, &fieldvalue);
158         return 0;
159     }
160
161     if (strcmp(fieldname, SEPARATOR_FIELDNAME) == 0)
162     {
163         fieldvalue = os_strdup(getCsvDefaultSeparator());
164     }
165     else if (strcmp(fieldname, DECIMAL_FIELDNAME) == 0)
166     {
167         fieldvalue = os_strdup(getCsvDefaultDecimal());
168     }
169     else if (strcmp(fieldname, CONVERSION_FIELDNAME) == 0)
170     {
171         fieldvalue = os_strdup(getCsvDefaultConversion());
172     }
173     else if (strcmp(fieldname, PRECISION_FIELDNAME) == 0)
174     {
175         fieldvalue = os_strdup(getCsvDefaultPrecision());
176     }
177     else if (strcmp(fieldname, COMMENTSREGEXP_FIELDNAME) == 0)
178     {
179         fieldvalue = os_strdup(getCsvDefaultCommentsRegExp());
180     }
181     else if (strcmp(fieldname, EOL_FIELDNAME) == 0)
182     {
183         const char *currentEol = getCsvDefaultEOL();
184         if (currentEol)
185         {
186             if (strcmp(currentEol, MACOS9_EOL) == 0)
187             {
188                 fieldvalue = os_strdup(MACOS9_EOL_STRING);
189             }
190             else if (strcmp(currentEol, WINDOWS_EOL) == 0)
191             {
192                 fieldvalue = os_strdup(WINDOWS_EOL_STRING);
193             }
194             else if (strcmp(currentEol, LINUX_EOL) == 0)
195             {
196                 fieldvalue = os_strdup(LINUX_EOL_STRING);
197             }
198             else
199             {
200                 fieldvalue = os_strdup("ERROR");
201             }
202         }
203         else
204         {
205             fieldvalue = os_strdup("ERROR");
206         }
207     }
208     else if (strcmp(fieldname, ENCODING_FIELDNAME) == 0)
209     {
210         fieldvalue = os_strdup(getCsvDefaultEncoding());
211     }
212     else if (strcmp(fieldname, BLANK_FIELDNAME) == 0)
213     {
214         fieldvalue = os_strdup(getCsvDefaultCsvIgnoreBlankLine());
215     }
216     else if (strcmp(fieldname, RESET_PARAMATERS) == 0)
217     {
218         freeVar(&fieldname, &fieldvalue);
219
220         setCsvDefaultReset();
221
222         createEmptyMatrix(pvApiCtx, Rhs + 1);
223
224         LhsVar(1) = Rhs + 1;
225         PutLhsVar();
226         return 0;
227     }
228     else
229     {
230         Scierror(999, _("%s: Wrong value for input argument #%d: '%s', '%s', '%s', '%s', '%s' or '%s' expected.\n"), fname, 1, SEPARATOR_FIELDNAME, DECIMAL_FIELDNAME, CONVERSION_FIELDNAME, COMMENTSREGEXP_FIELDNAME, EOL_FIELDNAME, BLANK_FIELDNAME);
231         freeVar(&fieldname, &fieldvalue);
232         return 0;
233     }
234
235     createSingleString(pvApiCtx, Rhs + 1, fieldvalue);
236
237     freeVar(&fieldname, &fieldvalue);
238
239     LhsVar(1) = Rhs + 1;
240     PutLhsVar();
241
242     return 0;
243 }
244 // =============================================================================
245 static int sci_csvDefault_two_rhs(char *fname, void* pvApiCtx)
246 {
247     int iErr = 0;
248     int resultSet = 0;
249
250     char *fieldname = NULL;
251     char *fieldvalue = NULL;
252     int  ifieldvalue = 0;
253
254     fieldname = csv_getArgumentAsString(pvApiCtx, 1, fname, &iErr);
255     if (iErr)
256     {
257         freeVar(&fieldname, &fieldvalue);
258         return 0;
259     }
260
261     if (strcmp(fieldname, PRECISION_FIELDNAME) == 0)
262     {
263         if (csv_isEmpty(pvApiCtx, 2))
264         {
265             freeVar(&fieldname, &fieldvalue);
266             Scierror(999, _("%s: Wrong type for input argument #%d: A double expected.\n"), fname, 2);
267             return 0;
268         }
269
270         if (csv_isDoubleScalar(pvApiCtx, 2))
271         {
272 #define FORMAT_FIELDVALUESTR "%%.%dlg"
273             ifieldvalue = (int) csv_getArgumentAsScalarDouble(pvApiCtx, 2, fname, &iErr);
274             if (iErr)
275             {
276                 freeVar(&fieldname, &fieldvalue);
277                 return 0;
278             }
279
280             if ((ifieldvalue < 1) || (ifieldvalue > 17))
281             {
282                 freeVar(&fieldname, &fieldvalue);
283                 Scierror(999, _("%s: Wrong value for input argument #%d: A double (value %d to %d) expected.\n"), fname, 2, 1, 17);
284                 return 0;
285             }
286
287             fieldvalue = (char*)MALLOC(sizeof(char) * ((int)strlen(FORMAT_FIELDVALUESTR) + 1));
288             if (fieldvalue == NULL)
289             {
290                 freeVar(&fieldname, &fieldvalue);
291                 Scierror(999, _("%s: Memory allocation error.\n"), fname);
292                 return 0;
293             }
294             sprintf(fieldvalue, FORMAT_FIELDVALUESTR, ifieldvalue);
295         }
296         else
297         {
298             fieldvalue = csv_getArgumentAsString(pvApiCtx, 2, fname, &iErr);
299             if (iErr)
300             {
301                 freeVar(&fieldname, &fieldvalue);
302                 return 0;
303             }
304         }
305     }
306     else
307     {
308         fieldvalue = csv_getArgumentAsString(pvApiCtx, 2, fname, &iErr);
309         if (iErr)
310         {
311             freeVar(&fieldname, &fieldvalue);
312             return 0;
313         }
314     }
315
316     if (strcmp(fieldname, SEPARATOR_FIELDNAME) == 0)
317     {
318         resultSet = setCsvDefaultSeparator(fieldvalue);
319     }
320     else if (strcmp(fieldname, DECIMAL_FIELDNAME) == 0)
321     {
322         resultSet = setCsvDefaultDecimal(fieldvalue);
323     }
324     else if (strcmp(fieldname, CONVERSION_FIELDNAME) == 0)
325     {
326         resultSet = setCsvDefaultConversion(fieldvalue);
327     }
328     else if (strcmp(fieldname, PRECISION_FIELDNAME) == 0)
329     {
330         resultSet = setCsvDefaultPrecision(fieldvalue);
331     }
332     else if (strcmp(fieldname, COMMENTSREGEXP_FIELDNAME) == 0)
333     {
334         resultSet = setCsvDefaultCommentsRegExp(fieldvalue);
335     }
336     else if (strcmp(fieldname, EOL_FIELDNAME) == 0)
337     {
338         if (strcmp(fieldvalue, MACOS9_EOL_STRING) == 0)
339         {
340             resultSet = setCsvDefaultEOL(MACOS9_EOL);
341         }
342         else if (strcmp(fieldvalue, WINDOWS_EOL_STRING) == 0)
343         {
344             resultSet = setCsvDefaultEOL(WINDOWS_EOL);
345         }
346         else if (strcmp(fieldvalue, LINUX_EOL_STRING) == 0)
347         {
348             resultSet = setCsvDefaultEOL(LINUX_EOL);
349         }
350         else
351         {
352             resultSet = 1;
353         }
354     }
355     else if (strcmp(fieldname, ENCODING_FIELDNAME) == 0)
356     {
357         resultSet = setCsvDefaultEncoding(fieldvalue);
358     }
359     else if (strcmp(fieldname, BLANK_FIELDNAME) == 0)
360     {
361         resultSet = setCsvDefaultCsvIgnoreBlankLine(fieldvalue);
362     }
363     else
364     {
365         Scierror(999, _("%s: Wrong value for input argument #%d: '%s', '%s', '%s' , '%s', '%s', '%s', '%s' or '%s' expected.\n"), fname, 1, SEPARATOR_FIELDNAME, DECIMAL_FIELDNAME, CONVERSION_FIELDNAME, PRECISION_FIELDNAME, COMMENTSREGEXP_FIELDNAME, EOL_FIELDNAME, ENCODING_FIELDNAME, BLANK_FIELDNAME);
366         freeVar(&fieldname, &fieldvalue);
367         return 0;
368     }
369
370     createScalarBoolean(pvApiCtx, Rhs + 1, (resultSet == 0));
371
372     freeVar(&fieldname, &fieldvalue);
373
374     LhsVar(1) = Rhs + 1;
375     PutLhsVar();
376
377     return 0;
378 }
379 // =============================================================================
380 static void freeVar(char** fieldname, char** fieldvalue)
381 {
382     if (fieldname && *fieldname)
383     {
384         FREE(*fieldname);
385         *fieldname = NULL;
386     }
387
388     if (fieldvalue && *fieldvalue)
389     {
390         FREE(*fieldvalue);
391         *fieldvalue = NULL;
392     }
393 }