e75b156547888206f3e28f432d79136aa97b38f1
[scilab.git] / scilab / modules / spreadsheet / sci_gateway / cpp / sci_csvStringToDouble.cpp
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-en.txt
11  *
12  * This code is also published under the GPL v3 license.
13  *
14  */
15 #include <string.h>
16 #include "gw_csv_tools.h"
17 #include "api_scilab.h"
18 #include "Scierror.h"
19 #include "MALLOC.h"
20 #include "Scierror.h"
21 #include "localization.h"
22 extern "C" {
23 #include "freeArrayOfString.h"
24 };
25 #ifdef _MSC_VER
26 #include "strdup_windows.h"
27 #endif
28 #include "stringToComplex.h"
29 #include "csvDefault.h"
30 #include "gw_csv_helpers.h"
31 #include "csv_complex.h"
32 // =============================================================================
33 int sci_csvStringToDouble(char *fname)
34 {
35     SciErr sciErr;
36     int iErr = 0;
37     int m1 = 0, n1 = 0;
38     char **pStringValues = NULL;
39
40     BOOL bConvertToNan = TRUE;
41
42     csv_complexArray *ptrCsvComplexArray = NULL;
43     stringToComplexError ierr = STRINGTOCOMPLEX_ERROR;
44
45     CheckRhs(1, 2);
46     CheckLhs(1, 1);
47
48     if (Rhs == 1)
49     {
50         bConvertToNan = TRUE;
51     }
52     else /* Rhs == 2 */
53     {
54         bConvertToNan = (BOOL)csv_getArgumentAsScalarBoolean(pvApiCtx, 2, fname, &iErr);
55         if (iErr) return 0;
56     }
57
58     pStringValues = csv_getArgumentAsMatrixOfString(pvApiCtx, 1, fname, &m1, &n1, &iErr);
59     if (iErr) return 0;
60
61     ptrCsvComplexArray = stringsToCsvComplexArray((const char**)pStringValues, m1 * n1, getCsvDefaultDecimal(), bConvertToNan, &ierr);
62
63     freeArrayOfString(pStringValues, m1 * n1);
64     pStringValues = NULL;
65
66     if (ptrCsvComplexArray == NULL)
67     {
68         switch (ierr)
69         {
70             case STRINGTOCOMPLEX_NOT_A_NUMBER:
71             case STRINGTOCOMPLEX_ERROR:
72                 Scierror(999, _("%s: can not convert data.\n"), fname);
73                 return 0;
74
75             default:
76                 Scierror(999, _("%s: Memory allocation error.\n"), fname);
77                 return 0;
78         }
79     }
80
81     switch (ierr)
82     {
83         case STRINGTOCOMPLEX_NOT_A_NUMBER:
84         case STRINGTOCOMPLEX_NO_ERROR:
85         {
86             if (ptrCsvComplexArray->isComplex)
87             {
88                 sciErr = createComplexMatrixOfDouble(pvApiCtx, Rhs + 1, m1, n1, ptrCsvComplexArray->realPart, ptrCsvComplexArray->imagPart);
89             }
90             else
91             {
92                 sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 1, m1, n1, ptrCsvComplexArray->realPart);
93             }
94             freeCsvComplexArray(ptrCsvComplexArray);
95             ptrCsvComplexArray = NULL;
96         }
97         break;
98
99         case STRINGTOCOMPLEX_MEMORY_ALLOCATION:
100         {
101             Scierror(999, _("%s: Memory allocation error.\n"), fname);
102         }
103
104         default:
105         case STRINGTOCOMPLEX_ERROR:
106         {
107             Scierror(999, _("%s: can not convert data.\n"), fname);
108         }
109     }
110
111     if (sciErr.iErr)
112     {
113         printError(&sciErr, 0);
114     }
115     else
116     {
117         LhsVar(1) = Rhs + 1;
118         PutLhsVar();
119     }
120
121     return 0;
122 }
123 // =============================================================================
124