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
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
12 * This code is also published under the GPL v3 license.
18 #include "gw_spreadsheet.h"
19 #include "api_scilab.h"
21 #include "sci_malloc.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"
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)
64 return sci_csvDefault_no_rhs(fname, pvApiCtx);
66 return sci_csvDefault_one_rhs(fname, pvApiCtx);
68 return sci_csvDefault_two_rhs(fname, pvApiCtx);
72 // =============================================================================
73 static int sci_csvDefault_no_rhs(char *fname, void* pvApiCtx)
75 int sizeArray = NUMBER_FIELD * 2;
76 char **arrayOut = (char**)MALLOC(sizeof(char*) * sizeArray);
82 int nbRows = NUMBER_FIELD;
84 const char *currentEol = getCsvDefaultEOL();
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);
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());
103 if (strcmp(currentEol, MACOS9_EOL) == 0)
105 arrayOut[13] = os_strdup(MACOS9_EOL_STRING);
107 else if (strcmp(currentEol, WINDOWS_EOL) == 0)
109 arrayOut[13] = os_strdup(WINDOWS_EOL_STRING);
111 else if (strcmp(currentEol, LINUX_EOL) == 0)
113 arrayOut[13] = os_strdup(LINUX_EOL_STRING);
117 arrayOut[13] = os_strdup("ERROR");
122 arrayOut[13] = os_strdup("ERROR");
125 arrayOut[14] = os_strdup(getCsvDefaultEncoding());
126 arrayOut[15] = os_strdup(getCsvDefaultCsvIgnoreBlankLine());
128 sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, nbRows, nbCols, arrayOut);
129 freeArrayOfString(arrayOut, sizeArray);
132 printError(&sciErr, 0);
141 Scierror(999, _("%s: Memory allocation error.\n"), fname);
146 // =============================================================================
147 static int sci_csvDefault_one_rhs(char *fname, void* pvApiCtx)
151 char *fieldname = NULL;
152 char *fieldvalue = NULL;
154 fieldname = csv_getArgumentAsString(pvApiCtx, 1, fname, &iErr);
157 freeVar(&fieldname, &fieldvalue);
161 if (strcmp(fieldname, SEPARATOR_FIELDNAME) == 0)
163 fieldvalue = os_strdup(getCsvDefaultSeparator());
165 else if (strcmp(fieldname, DECIMAL_FIELDNAME) == 0)
167 fieldvalue = os_strdup(getCsvDefaultDecimal());
169 else if (strcmp(fieldname, CONVERSION_FIELDNAME) == 0)
171 fieldvalue = os_strdup(getCsvDefaultConversion());
173 else if (strcmp(fieldname, PRECISION_FIELDNAME) == 0)
175 fieldvalue = os_strdup(getCsvDefaultPrecision());
177 else if (strcmp(fieldname, COMMENTSREGEXP_FIELDNAME) == 0)
179 fieldvalue = os_strdup(getCsvDefaultCommentsRegExp());
181 else if (strcmp(fieldname, EOL_FIELDNAME) == 0)
183 const char *currentEol = getCsvDefaultEOL();
186 if (strcmp(currentEol, MACOS9_EOL) == 0)
188 fieldvalue = os_strdup(MACOS9_EOL_STRING);
190 else if (strcmp(currentEol, WINDOWS_EOL) == 0)
192 fieldvalue = os_strdup(WINDOWS_EOL_STRING);
194 else if (strcmp(currentEol, LINUX_EOL) == 0)
196 fieldvalue = os_strdup(LINUX_EOL_STRING);
200 fieldvalue = os_strdup("ERROR");
205 fieldvalue = os_strdup("ERROR");
208 else if (strcmp(fieldname, ENCODING_FIELDNAME) == 0)
210 fieldvalue = os_strdup(getCsvDefaultEncoding());
212 else if (strcmp(fieldname, BLANK_FIELDNAME) == 0)
214 fieldvalue = os_strdup(getCsvDefaultCsvIgnoreBlankLine());
216 else if (strcmp(fieldname, RESET_PARAMATERS) == 0)
218 freeVar(&fieldname, &fieldvalue);
220 setCsvDefaultReset();
222 createEmptyMatrix(pvApiCtx, Rhs + 1);
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);
235 createSingleString(pvApiCtx, Rhs + 1, fieldvalue);
237 freeVar(&fieldname, &fieldvalue);
244 // =============================================================================
245 static int sci_csvDefault_two_rhs(char *fname, void* pvApiCtx)
250 char *fieldname = NULL;
251 char *fieldvalue = NULL;
254 fieldname = csv_getArgumentAsString(pvApiCtx, 1, fname, &iErr);
257 freeVar(&fieldname, &fieldvalue);
261 if (strcmp(fieldname, PRECISION_FIELDNAME) == 0)
263 if (csv_isEmpty(pvApiCtx, 2))
265 freeVar(&fieldname, &fieldvalue);
266 Scierror(999, _("%s: Wrong type for input argument #%d: A double expected.\n"), fname, 2);
270 if (csv_isDoubleScalar(pvApiCtx, 2))
272 #define FORMAT_FIELDVALUESTR "%%.%dlg"
273 ifieldvalue = (int) csv_getArgumentAsScalarDouble(pvApiCtx, 2, fname, &iErr);
276 freeVar(&fieldname, &fieldvalue);
280 if ((ifieldvalue < 1) || (ifieldvalue > 17))
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);
287 fieldvalue = (char*)MALLOC(sizeof(char) * ((int)strlen(FORMAT_FIELDVALUESTR) + 1));
288 if (fieldvalue == NULL)
290 freeVar(&fieldname, &fieldvalue);
291 Scierror(999, _("%s: Memory allocation error.\n"), fname);
294 sprintf(fieldvalue, FORMAT_FIELDVALUESTR, ifieldvalue);
298 fieldvalue = csv_getArgumentAsString(pvApiCtx, 2, fname, &iErr);
301 freeVar(&fieldname, &fieldvalue);
308 fieldvalue = csv_getArgumentAsString(pvApiCtx, 2, fname, &iErr);
311 freeVar(&fieldname, &fieldvalue);
316 if (strcmp(fieldname, SEPARATOR_FIELDNAME) == 0)
318 resultSet = setCsvDefaultSeparator(fieldvalue);
320 else if (strcmp(fieldname, DECIMAL_FIELDNAME) == 0)
322 resultSet = setCsvDefaultDecimal(fieldvalue);
324 else if (strcmp(fieldname, CONVERSION_FIELDNAME) == 0)
326 resultSet = setCsvDefaultConversion(fieldvalue);
328 else if (strcmp(fieldname, PRECISION_FIELDNAME) == 0)
330 resultSet = setCsvDefaultPrecision(fieldvalue);
332 else if (strcmp(fieldname, COMMENTSREGEXP_FIELDNAME) == 0)
334 resultSet = setCsvDefaultCommentsRegExp(fieldvalue);
336 else if (strcmp(fieldname, EOL_FIELDNAME) == 0)
338 if (strcmp(fieldvalue, MACOS9_EOL_STRING) == 0)
340 resultSet = setCsvDefaultEOL(MACOS9_EOL);
342 else if (strcmp(fieldvalue, WINDOWS_EOL_STRING) == 0)
344 resultSet = setCsvDefaultEOL(WINDOWS_EOL);
346 else if (strcmp(fieldvalue, LINUX_EOL_STRING) == 0)
348 resultSet = setCsvDefaultEOL(LINUX_EOL);
355 else if (strcmp(fieldname, ENCODING_FIELDNAME) == 0)
357 resultSet = setCsvDefaultEncoding(fieldvalue);
359 else if (strcmp(fieldname, BLANK_FIELDNAME) == 0)
361 resultSet = setCsvDefaultCsvIgnoreBlankLine(fieldvalue);
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);
370 createScalarBoolean(pvApiCtx, Rhs + 1, (resultSet == 0));
372 freeVar(&fieldname, &fieldvalue);
379 // =============================================================================
380 static void freeVar(char** fieldname, char** fieldvalue)
382 if (fieldname && *fieldname)
388 if (fieldvalue && *fieldvalue)