63313644fdecd1c6d1907e88f4c848da66f526c6
[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     printf("rhs %d\n", Rhs);
58     Rhs = Max(0, Rhs);
59     CheckRhs(0, 2);
60     CheckLhs(1, 1);
61
62     switch (Rhs)
63     {
64         case 0:
65             return sci_csvDefault_no_rhs(fname, pvApiCtx);
66         case 1:
67             return sci_csvDefault_one_rhs(fname, pvApiCtx);
68         case 2:
69             return sci_csvDefault_two_rhs(fname, pvApiCtx);
70     }
71     return 0;
72 }
73 // =============================================================================
74 static int sci_csvDefault_no_rhs(char *fname, void* pvApiCtx)
75 {
76     int sizeArray = NUMBER_FIELD * 2;
77     char **arrayOut = (char**)MALLOC(sizeof(char*) * sizeArray);
78
79     if (arrayOut)
80     {
81         SciErr sciErr;
82
83         int nbRows = NUMBER_FIELD;
84         int nbCols = 2;
85         const char *currentEol = getCsvDefaultEOL();
86
87         arrayOut[0] = os_strdup(SEPARATOR_FIELDNAME);
88         arrayOut[1] = os_strdup(DECIMAL_FIELDNAME);
89         arrayOut[2] = os_strdup(CONVERSION_FIELDNAME);
90         arrayOut[3] = os_strdup(PRECISION_FIELDNAME);
91         arrayOut[4] = os_strdup(COMMENTSREGEXP_FIELDNAME);
92         arrayOut[5] = os_strdup(EOL_FIELDNAME);
93         arrayOut[6] = os_strdup(ENCODING_FIELDNAME);
94         arrayOut[7] = os_strdup(BLANK_FIELDNAME);
95
96         arrayOut[8] = os_strdup(getCsvDefaultSeparator());
97         arrayOut[9] = os_strdup(getCsvDefaultDecimal());
98         arrayOut[10] = os_strdup(getCsvDefaultConversion());
99         arrayOut[11] = os_strdup(getCsvDefaultPrecision());
100         arrayOut[12] = os_strdup(getCsvDefaultCommentsRegExp());
101
102         if (currentEol)
103         {
104             if (strcmp(currentEol, MACOS9_EOL) == 0)
105             {
106                 arrayOut[13] = os_strdup(MACOS9_EOL_STRING);
107             }
108             else if (strcmp(currentEol, WINDOWS_EOL) == 0)
109             {
110                 arrayOut[13] = os_strdup(WINDOWS_EOL_STRING);
111             }
112             else if (strcmp(currentEol, LINUX_EOL) == 0)
113             {
114                 arrayOut[13] = os_strdup(LINUX_EOL_STRING);
115             }
116             else
117             {
118                 arrayOut[13] = os_strdup("ERROR");
119             }
120         }
121         else
122         {
123             arrayOut[13] = os_strdup("ERROR");
124         }
125
126         arrayOut[14] = os_strdup(getCsvDefaultEncoding());
127         arrayOut[15] = os_strdup(getCsvDefaultCsvIgnoreBlankLine());
128
129         sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, nbRows, nbCols, arrayOut);
130         freeArrayOfString(arrayOut, sizeArray);
131         if (sciErr.iErr)
132         {
133             printError(&sciErr, 0);
134             return 0;
135         }
136
137         LhsVar(1) = Rhs + 1;
138         PutLhsVar();
139     }
140     else
141     {
142         Scierror(999, _("%s: Memory allocation error.\n"), fname);
143     }
144
145     return 0;
146 }
147 // =============================================================================
148 static int sci_csvDefault_one_rhs(char *fname, void* pvApiCtx)
149 {
150     int iErr = 0;
151
152     char *fieldname = NULL;
153     char *fieldvalue = NULL;
154
155     fieldname = csv_getArgumentAsString(pvApiCtx, 1, fname, &iErr);
156     if (iErr)
157     {
158         freeVar(&fieldname, &fieldvalue);
159         return 0;
160     }
161
162     if (strcmp(fieldname, SEPARATOR_FIELDNAME) == 0)
163     {
164         fieldvalue = os_strdup(getCsvDefaultSeparator());
165     }
166     else if (strcmp(fieldname, DECIMAL_FIELDNAME) == 0)
167     {
168         fieldvalue = os_strdup(getCsvDefaultDecimal());
169     }
170     else if (strcmp(fieldname, CONVERSION_FIELDNAME) == 0)
171     {
172         fieldvalue = os_strdup(getCsvDefaultConversion());
173     }
174     else if (strcmp(fieldname, PRECISION_FIELDNAME) == 0)
175     {
176         fieldvalue = os_strdup(getCsvDefaultPrecision());
177     }
178     else if (strcmp(fieldname, COMMENTSREGEXP_FIELDNAME) == 0)
179     {
180         fieldvalue = os_strdup(getCsvDefaultCommentsRegExp());
181     }
182     else if (strcmp(fieldname, EOL_FIELDNAME) == 0)
183     {
184         const char *currentEol = getCsvDefaultEOL();
185         if (currentEol)
186         {
187             if (strcmp(currentEol, MACOS9_EOL) == 0)
188             {
189                 fieldvalue = os_strdup(MACOS9_EOL_STRING);
190             }
191             else if (strcmp(currentEol, WINDOWS_EOL) == 0)
192             {
193                 fieldvalue = os_strdup(WINDOWS_EOL_STRING);
194             }
195             else if (strcmp(currentEol, LINUX_EOL) == 0)
196             {
197                 fieldvalue = os_strdup(LINUX_EOL_STRING);
198             }
199             else
200             {
201                 fieldvalue = os_strdup("ERROR");
202             }
203         }
204         else
205         {
206             fieldvalue = os_strdup("ERROR");
207         }
208     }
209     else if (strcmp(fieldname, ENCODING_FIELDNAME) == 0)
210     {
211         fieldvalue = os_strdup(getCsvDefaultEncoding());
212     }
213     else if (strcmp(fieldname, BLANK_FIELDNAME) == 0)
214     {
215         fieldvalue = os_strdup(getCsvDefaultCsvIgnoreBlankLine());
216     }
217     else if (strcmp(fieldname, RESET_PARAMATERS) == 0)
218     {
219         freeVar(&fieldname, &fieldvalue);
220
221         setCsvDefaultReset();
222
223         createEmptyMatrix(pvApiCtx, Rhs + 1);
224
225         LhsVar(1) = Rhs + 1;
226         PutLhsVar();
227         return 0;
228     }
229     else
230     {
231         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);
232         freeVar(&fieldname, &fieldvalue);
233         return 0;
234     }
235
236     createSingleString(pvApiCtx, Rhs + 1, fieldvalue);
237
238     freeVar(&fieldname, &fieldvalue);
239
240     LhsVar(1) = Rhs + 1;
241     PutLhsVar();
242
243     return 0;
244 }
245 // =============================================================================
246 static int sci_csvDefault_two_rhs(char *fname, void* pvApiCtx)
247 {
248     int iErr = 0;
249     int resultSet = 0;
250
251     char *fieldname = NULL;
252     char *fieldvalue = NULL;
253     int  ifieldvalue = 0;
254
255     fieldname = csv_getArgumentAsString(pvApiCtx, 1, fname, &iErr);
256     if (iErr)
257     {
258         freeVar(&fieldname, &fieldvalue);
259         return 0;
260     }
261
262     if (strcmp(fieldname, PRECISION_FIELDNAME) == 0)
263     {
264         if (csv_isEmpty(pvApiCtx, 2))
265         {
266             freeVar(&fieldname, &fieldvalue);
267             Scierror(999, _("%s: Wrong type for input argument #%d: A double expected.\n"), fname, 2);
268             return 0;
269         }
270
271         if (csv_isDoubleScalar(pvApiCtx, 2))
272         {
273 #define FORMAT_FIELDVALUESTR "%%.%dlg"
274             ifieldvalue = (int) csv_getArgumentAsScalarDouble(pvApiCtx, 2, fname, &iErr);
275             if (iErr)
276             {
277                 freeVar(&fieldname, &fieldvalue);
278                 return 0;
279             }
280
281             if ((ifieldvalue < 1) || (ifieldvalue > 17))
282             {
283                 freeVar(&fieldname, &fieldvalue);
284                 Scierror(999, _("%s: Wrong value for input argument #%d: A double (value %d to %d) expected.\n"), fname, 2, 1, 17);
285                 return 0;
286             }
287
288             fieldvalue = (char*)MALLOC(sizeof(char) * ((int)strlen(FORMAT_FIELDVALUESTR) + 1));
289             if (fieldvalue == NULL)
290             {
291                 freeVar(&fieldname, &fieldvalue);
292                 Scierror(999, _("%s: Memory allocation error.\n"), fname);
293                 return 0;
294             }
295             sprintf(fieldvalue, FORMAT_FIELDVALUESTR, ifieldvalue);
296         }
297         else
298         {
299             fieldvalue = csv_getArgumentAsString(pvApiCtx, 2, fname, &iErr);
300             if (iErr)
301             {
302                 freeVar(&fieldname, &fieldvalue);
303                 return 0;
304             }
305         }
306     }
307     else
308     {
309         fieldvalue = csv_getArgumentAsString(pvApiCtx, 2, fname, &iErr);
310         if (iErr)
311         {
312             freeVar(&fieldname, &fieldvalue);
313             return 0;
314         }
315     }
316
317     if (strcmp(fieldname, SEPARATOR_FIELDNAME) == 0)
318     {
319         resultSet = setCsvDefaultSeparator(fieldvalue);
320     }
321     else if (strcmp(fieldname, DECIMAL_FIELDNAME) == 0)
322     {
323         resultSet = setCsvDefaultDecimal(fieldvalue);
324     }
325     else if (strcmp(fieldname, CONVERSION_FIELDNAME) == 0)
326     {
327         resultSet = setCsvDefaultConversion(fieldvalue);
328     }
329     else if (strcmp(fieldname, PRECISION_FIELDNAME) == 0)
330     {
331         resultSet = setCsvDefaultPrecision(fieldvalue);
332     }
333     else if (strcmp(fieldname, COMMENTSREGEXP_FIELDNAME) == 0)
334     {
335         resultSet = setCsvDefaultCommentsRegExp(fieldvalue);
336     }
337     else if (strcmp(fieldname, EOL_FIELDNAME) == 0)
338     {
339         if (strcmp(fieldvalue, MACOS9_EOL_STRING) == 0)
340         {
341             resultSet = setCsvDefaultEOL(MACOS9_EOL);
342         }
343         else if (strcmp(fieldvalue, WINDOWS_EOL_STRING) == 0)
344         {
345             resultSet = setCsvDefaultEOL(WINDOWS_EOL);
346         }
347         else if (strcmp(fieldvalue, LINUX_EOL_STRING) == 0)
348         {
349             resultSet = setCsvDefaultEOL(LINUX_EOL);
350         }
351         else
352         {
353             resultSet = 1;
354         }
355     }
356     else if (strcmp(fieldname, ENCODING_FIELDNAME) == 0)
357     {
358         resultSet = setCsvDefaultEncoding(fieldvalue);
359     }
360     else if (strcmp(fieldname, BLANK_FIELDNAME) == 0)
361     {
362         resultSet = setCsvDefaultCsvIgnoreBlankLine(fieldvalue);
363     }
364     else
365     {
366         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);
367         freeVar(&fieldname, &fieldvalue);
368         return 0;
369     }
370
371     createScalarBoolean(pvApiCtx, Rhs + 1, (resultSet == 0));
372
373     freeVar(&fieldname, &fieldvalue);
374
375     LhsVar(1) = Rhs + 1;
376     PutLhsVar();
377
378     return 0;
379 }
380 // =============================================================================
381 static void freeVar(char** fieldname, char** fieldvalue)
382 {
383     if (fieldname && *fieldname)
384     {
385         FREE(*fieldname);
386         *fieldname = NULL;
387     }
388
389     if (fieldvalue && *fieldvalue)
390     {
391         FREE(*fieldvalue);
392         *fieldvalue = NULL;
393     }
394 }