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