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-en.txt
12 * This code is also published under the GPL v3 license.
18 #include "gw_csv_tools.h"
19 #include "api_scilab.h"
21 #include "localization.h"
23 #include "freeArrayOfString.h"
28 #include "strdup_windows.h"
30 #include "stringToComplex.h"
31 #include "csvDefault.h"
32 #include "csv_complex.h"
33 #include "gw_csv_helpers.h"
35 /* ==================================================================== */
36 #define CONVTOSTR "string"
37 #define CONVTODOUBLE "double"
38 /* ==================================================================== */
39 /* csvRead(filename, separator, decimal, conversion, substitute, range)*/
40 /* ==================================================================== */
41 int sci_csvRead(char *fname)
46 char *filename = NULL;
47 char *separator = NULL;
49 char *conversion = NULL;
53 char **toreplace = NULL;
54 int nbElementsToReplace = 0;
58 csvResult *result = NULL;
60 double *dRealValues = NULL;
69 iRange = csv_getArgumentAsMatrixofIntFromDouble(pvApiCtx, 7, fname, &m7, &n7, &iErr);
72 if ((m7 * n7 != SIZE_RANGE_SUPPORTED) )
79 Scierror(999, _("%s: Wrong size for input argument #%d: Four entries expected.\n"), fname, 7);
83 if ((m7 != 1) && (n7 != 1))
90 Scierror(999, _("%s: Wrong size for input argument #%d: A column or row vector expected.\n"), fname, 7);
94 if (isValidRange(iRange, m7 * n7))
105 Scierror(999, _("%s: Wrong value for input argument #%d: Unconsistent range.\n"), fname, 7);
113 regexp = csv_getArgumentAsStringWithEmptyManagement(pvApiCtx, 6, fname, getCsvDefaultCommentsRegExp(), &iErr);
116 if (strcmp(regexp, "") == 0)
126 regexp = strdup(getCsvDefaultCommentsRegExp());
129 if (strcmp(regexp, "") == 0)
139 if (csv_isEmpty(pvApiCtx, 5))
142 nbElementsToReplace = 0;
147 toreplace = csv_getArgumentAsMatrixOfString(pvApiCtx, 5, fname, &m5, &n5, &iErr);
165 freeArrayOfString(toreplace, m5 * n5);
167 Scierror(999, _("%s: Wrong size for input argument #%d.\n"), fname, 5);
170 nbElementsToReplace = m5;
176 nbElementsToReplace = 0;
182 conversion = csv_getArgumentAsStringWithEmptyManagement(pvApiCtx, 4, fname, getCsvDefaultConversion(), &iErr);
184 if (!((strcmp(conversion, CONVTOSTR) == 0) || (strcmp(conversion, CONVTODOUBLE) == 0)))
193 freeArrayOfString(toreplace, nbElementsToReplace * 2);
201 Scierror(999, _("%s: Wrong value for input argument #%d: '%s' or '%s' string expected.\n"), fname, 4, "double", "string");
207 /* read_csv is using a 'string' conversion while csvRead is doing
208 a 'double' conversion */
209 if (strcmp(fname, "read_csv") == 0)
211 conversion = (char*)MALLOC((strlen("string") + 1) * sizeof(char));
212 strcpy(conversion, "string");
216 conversion = strdup(getCsvDefaultConversion());
223 decimal = csv_getArgumentAsStringWithEmptyManagement(pvApiCtx, 3, fname, getCsvDefaultDecimal(), &iErr);
238 freeArrayOfString(toreplace, nbElementsToReplace * 2);
246 decimal = strdup(getCsvDefaultDecimal());
252 separator = csv_getArgumentAsStringWithEmptyManagement(pvApiCtx, 2, fname, getCsvDefaultSeparator(), &iErr);
262 freeArrayOfString(toreplace, nbElementsToReplace * 2);
280 separator = strdup(getCsvDefaultSeparator());
283 if (strcmp(separator, "\\t") == 0)
285 /* In Scilab, if the user is providing \t as separator, transform it to a real
286 tab. Example: read_csv(filename,"\t");
288 strcpy(separator, "\t");
292 filename = csv_getArgumentAsString(pvApiCtx, 1, fname, &iErr);
302 freeArrayOfString(toreplace, nbElementsToReplace * 2);
323 result = csvRead(filename, separator, decimal, (const char**)toreplace, nbElementsToReplace * 2, regexp);
331 freeArrayOfString(toreplace, nbElementsToReplace * 2);
349 case CSV_READ_REGEXP_ERROR:
351 Scierror(999, _("%s: Wrong value for input argument #%d.\n"), fname, 6);
355 case CSV_READ_SEPARATOR_DECIMAL_EQUAL:
357 Scierror(999, _("%s: separator and decimal must have different values.\n"), fname);
361 case CSV_READ_NO_ERROR:
363 if (strcmp(conversion, CONVTOSTR) == 0)
370 char **pStrRange = getRangeAsString((const char**)result->pstrValues, result->m, result->n, iRange, &newM, &newN);
373 sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, newM, newN, pStrRange);
374 freeArrayOfString(pStrRange, newM * newN);
378 Scierror(999, _("%s: Memory allocation error.\n"), fname);
383 sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, result->m, result->n, result->pstrValues);
388 stringToComplexError ierr = STRINGTOCOMPLEX_ERROR;
389 csv_complexArray *ptrCsvComplexArray = stringsToCsvComplexArray((const char**)result->pstrValues, result->m * result->n, decimal, TRUE, &ierr);
391 if (ptrCsvComplexArray == NULL)
393 freeCsvResult(result);
404 if (ierr == STRINGTOCOMPLEX_ERROR)
406 Scierror(999, _("%s: can not convert data.\n"), fname);
410 Scierror(999, _("%s: Memory allocation error.\n"), fname);
417 case STRINGTOCOMPLEX_NOT_A_NUMBER:
418 case STRINGTOCOMPLEX_NO_ERROR:
424 csv_complexArray *csvComplexRange = getRangeAsCsvComplexArray(ptrCsvComplexArray, result->m, result->n, iRange, &newM, &newN);
427 if (csvComplexRange->isComplex)
429 sciErr = createComplexMatrixOfDouble(pvApiCtx, Rhs + 1, newM, newN, ptrCsvComplexArray->realPart, ptrCsvComplexArray->imagPart);
433 sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 1, newM, newN, csvComplexRange->realPart);
435 freeCsvComplexArray(csvComplexRange);
436 csvComplexRange = NULL;
440 Scierror(999, _("%s: Memory allocation error.\n"), fname);
445 if (ptrCsvComplexArray->isComplex)
447 sciErr = createComplexMatrixOfDouble(pvApiCtx, Rhs + 1, result->m, result->n, ptrCsvComplexArray->realPart, ptrCsvComplexArray->imagPart);
451 sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 1, result->m, result->n, ptrCsvComplexArray->realPart);
453 freeCsvComplexArray(ptrCsvComplexArray);
454 ptrCsvComplexArray = NULL;
459 case STRINGTOCOMPLEX_MEMORY_ALLOCATION:
461 Scierror(999, _("%s: Memory allocation error.\n"), fname);
464 case STRINGTOCOMPLEX_ERROR:
466 Scierror(999, _("%s: can not convert data.\n"), fname);
473 freeCsvResult(result);
484 printError(&sciErr, 0);
485 Scierror(17, _("%s: Memory allocation error.\n"), fname);
494 sciErr = createMatrixOfString(pvApiCtx, Rhs + 2, result->nbComments, 1, result->pstrComments);
497 freeCsvResult(result);
508 printError(&sciErr, 0);
509 Scierror(17, _("%s: Memory allocation error.\n"), fname);
519 case CSV_READ_FILE_NOT_EXIST:
521 Scierror(999, _("%s: %s does not exist.\n"), fname, filename);
525 case CSV_READ_MOPEN_ERROR:
527 Scierror(999, _("%s: can not open file %s.\n"), fname, filename);
531 case CSV_READ_MEMORY_ALLOCATION:
533 Scierror(999, _("%s: Memory allocation error.\n"), fname);
537 case CSV_READ_READLINES_ERROR:
538 case CSV_READ_COLUMNS_ERROR:
541 Scierror(999, _("%s: can not read file %s.\n"), fname, filename);
548 Scierror(999, _("%s: Memory allocation error.\n"), fname);
550 freeCsvResult(result);
564 /* ==================================================================== */