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.
16 #include "gw_csv_tools.h"
17 #include "api_scilab.h"
21 #include "localization.h"
23 #include "freeArrayOfString.h"
26 #include "strdup_windows.h"
28 #include "stringToComplex.h"
29 #include "csvDefault.h"
32 #include "gw_csv_helpers.h"
33 // =============================================================================
34 #define CONVTOSTR "string"
35 #define CONVTODOUBLE "double"
36 // =============================================================================
37 int sci_csvTextScan(char *fname)
43 int *piAddressVarOne = NULL;
48 int *lengthText = NULL;
51 char *separator = NULL;
53 char *conversion = NULL;
55 double * dRealValues = NULL;
60 csvResult *result = NULL;
69 iRange = csv_getArgumentAsMatrixofIntFromDouble(pvApiCtx, 5, fname, &m5, &n5, &iErr);
72 if ((m5 * n5 != SIZE_RANGE_SUPPORTED) )
79 Scierror(999, _("%s: Wrong size for input argument #%d: Four entries expected.\n"), fname, 5);
83 if ((m5 != 1) && (n5 != 1))
90 Scierror(999, _("%s: Wrong size for input argument #%d: A column or row vector expected.\n"), fname, 5);
94 if (isValidRange(iRange, m5 * n5))
105 Scierror(999, _("%s: Wrong value for input argument #%d: Unconsistent range.\n"), fname, 5);
112 conversion = csv_getArgumentAsStringWithEmptyManagement(pvApiCtx, 4, fname, getCsvDefaultConversion(), &iErr);
123 if (!((strcmp(conversion, CONVTOSTR) == 0) || (strcmp(conversion, CONVTODOUBLE) == 0)))
136 Scierror(999, _("%s: Wrong value for input argument #%d: '%s' or '%s' string expected.\n"), fname, 4, "double", "string");
142 conversion = strdup(getCsvDefaultConversion());
147 decimal = csv_getArgumentAsStringWithEmptyManagement(pvApiCtx, 3, fname, getCsvDefaultDecimal(), &iErr);
165 decimal = strdup(getCsvDefaultDecimal());
170 separator = csv_getArgumentAsStringWithEmptyManagement(pvApiCtx, 2, fname, getCsvDefaultSeparator(), &iErr);
193 separator = strdup(getCsvDefaultSeparator());
196 if (!csv_isRowVector(pvApiCtx, 1) &&
197 !csv_isColumnVector(pvApiCtx, 1) &&
198 !csv_isScalar(pvApiCtx, 1))
220 Scierror(999, _("%s: Wrong size for input argument #%d: string expected.\n"), fname, 1);
224 text = csv_getArgumentAsMatrixOfString(pvApiCtx, 1, fname, &m1, &n1, &iErr);
251 result = csvTextScan((const char**)text, nbLines, separator, decimal);
260 freeArrayOfString(text, nbLines);
274 case CSV_READ_SEPARATOR_DECIMAL_EQUAL:
276 Scierror(999, _("%s: separator and decimal must have different values.\n"), fname);
280 case CSV_READ_NO_ERROR:
282 if (strcmp(conversion, CONVTOSTR) == 0)
289 char **pStrRange = getRangeAsString((const char**)result->pstrValues, result->m, result->n, iRange, &newM, &newN);
292 sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, newM, newN, pStrRange);
293 freeArrayOfString(pStrRange, newM * newN);
297 Scierror(999, _("%s: Memory allocation error.\n"), fname);
303 sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, result->m, result->n, result->pstrValues);
308 stringToComplexError ierr = STRINGTOCOMPLEX_ERROR;
309 csv_complexArray *ptrCsvComplexArray = stringsToCvsComplexArray((const char**)result->pstrValues, result->m * result->n, decimal, TRUE, &ierr);
310 if (ptrCsvComplexArray == NULL)
312 freeCsvResult(result);
328 if (ierr == STRINGTOCOMPLEX_ERROR)
330 Scierror(999, _("%s: can not convert data.\n"), fname);
334 Scierror(999, _("%s: Memory allocation error.\n"), fname);
341 case STRINGTOCOMPLEX_NOT_A_NUMBER:
342 case STRINGTOCOMPLEX_NO_ERROR:
348 csv_complexArray *csvComplexRange = getRangeAsCsvComplexArray(ptrCsvComplexArray, result->m, result->n, iRange, &newM, &newN);
351 if (csvComplexRange->isComplex)
353 sciErr = createComplexMatrixOfDouble(pvApiCtx, Rhs + 1, newM, newN, ptrCsvComplexArray->realPart, ptrCsvComplexArray->imagPart);
357 sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 1, newM, newN, csvComplexRange->realPart);
359 freeCsvComplexArray(csvComplexRange);
360 csvComplexRange = NULL;
364 Scierror(999, _("%s: Memory allocation error.\n"), fname);
369 if (ptrCsvComplexArray->isComplex)
371 sciErr = createComplexMatrixOfDouble(pvApiCtx, Rhs + 1, result->m, result->n, ptrCsvComplexArray->realPart, ptrCsvComplexArray->imagPart);
375 sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 1, result->m, result->n, ptrCsvComplexArray->realPart);
378 freeCsvComplexArray(ptrCsvComplexArray);
379 ptrCsvComplexArray = NULL;
383 case STRINGTOCOMPLEX_MEMORY_ALLOCATION:
385 Scierror(999, _("%s: Memory allocation error.\n"), fname);
388 case STRINGTOCOMPLEX_ERROR:
390 Scierror(999, _("%s: can not convert data.\n"), fname);
397 freeCsvResult(result);
413 printError(&sciErr, 0);
414 Scierror(17, _("%s: Memory allocation error.\n"), fname);
425 case CSV_READ_MEMORY_ALLOCATION:
427 Scierror(999, _("%s: Memory allocation error.\n"), fname);
431 case CSV_READ_READLINES_ERROR:
432 case CSV_READ_COLUMNS_ERROR:
435 Scierror(999, _("%s: can not read text.\n"), fname);
442 Scierror(999, _("%s: Memory allocation error.\n"), fname);
444 freeCsvResult(result);
463 // =============================================================================