707e14a372f0ce899a8c42a27c1d7ee17869ec67
[scilab.git] / scilab / modules / spreadsheet / src / cpp / csvDefault.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010-2011 - DIGITEO - Allan CORNET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12 #include <string.h>
13 #include "csvDefault.h"
14 #include "MALLOC.h"
15 #ifdef _MSC_VER
16 #include "strdup_windows.h"
17 #endif
18 #include "checkCsvWriteFormat.h"
19 // =============================================================================
20 #define DEFAULT_CSV_SEPARATOR ","
21 #define DEFAULT_CSV_DECIMAL "."
22 #define DEFAULT_CSV_PRECISION "%.17lg"
23 #define DEFAULT_CSV_COMMENTS_REGEXP ""
24 #ifdef _MSC_VER
25 #define DEFAULT_CSV_EOL "\r\n"
26 #else
27 #define DEFAULT_CSV_EOL "\n"
28 #endif
29 #define CSV_DECIMAL_MODE_1 DEFAULT_CSV_DECIMAL
30 #define CSV_DECIMAL_MODE_2 ","
31 #define DEFAULT_CSV_CONVERSION "double"
32 #define CSV_CONVERSION_MODE_1 DEFAULT_CSV_CONVERSION
33 #define CSV_CONVERSION_MODE_2 "string"
34 #define DEFAULT_CSV_ENCODING "utf-8"
35 #define DEFAULT_CSV_ENCODING_MODE1 "utf-8"
36 #define DEFAULT_CSV_ENCODING_MODE2 "iso-latin"
37 #define CSV_IGNORE_BLANK_LINE_MODE_1 "off"
38 #define CSV_IGNORE_BLANK_LINE_MODE_2 "on"
39 #define DEFAULT_IGNORE_BLANK_LINE CSV_IGNORE_BLANK_LINE_MODE_1
40 // =============================================================================
41 static char *defaultCsvSeparator = NULL;
42 static char *defaultCsvDecimal = NULL;
43 static char *defaultCsvConversion = NULL;
44 static char *defaultCsvPrecision = NULL;
45 static char *defaultCsvCommentsRegExp = NULL;
46 static char *defaultCsvEOL = NULL;
47 static char *defaultCsvEncoding = NULL;
48 static char *defaultCsvIgnoreBlankLine = NULL;
49 // =============================================================================
50 static int initializeCsvDefaultValues(void);
51 // =============================================================================
52 const char *getCsvDefaultSeparator(void)
53 {
54     initializeCsvDefaultValues();
55     return defaultCsvSeparator;
56 }
57 // =============================================================================
58 const char *getCsvDefaultDecimal(void)
59 {
60     initializeCsvDefaultValues();
61     return defaultCsvDecimal;
62 }
63 // =============================================================================
64 const char *getCsvDefaultConversion(void)
65 {
66     initializeCsvDefaultValues();
67     return defaultCsvConversion;
68 }
69 // =============================================================================
70 const char *getCsvDefaultPrecision(void)
71 {
72     initializeCsvDefaultValues();
73     return defaultCsvPrecision;
74 }
75 // =============================================================================
76 const char *getCsvDefaultCommentsRegExp(void)
77 {
78     initializeCsvDefaultValues();
79     return defaultCsvCommentsRegExp;
80 }
81 // =============================================================================
82 const char *getCsvDefaultEOL(void)
83 {
84     initializeCsvDefaultValues();
85     return defaultCsvEOL;
86 }
87 // =============================================================================
88 const char *getCsvDefaultEncoding(void)
89 {
90     initializeCsvDefaultValues();
91     return defaultCsvEncoding;
92 }
93 // =============================================================================
94 const char *getCsvDefaultCsvIgnoreBlankLine(void)
95 {
96     initializeCsvDefaultValues();
97     return defaultCsvIgnoreBlankLine;
98 }
99 // =============================================================================
100 int setCsvDefaultSeparator(const char *separator)
101 {
102     if (initializeCsvDefaultValues()) return 1;
103     if (separator == NULL) return 1;
104
105     if (strcmp(separator, getCsvDefaultDecimal()) == 0) return 1;
106
107     if (defaultCsvSeparator) FREE(defaultCsvSeparator);
108     defaultCsvSeparator = strdup(separator);
109     if (defaultCsvSeparator == NULL) return 1;
110
111     return 0;
112 }
113 // =============================================================================
114 int setCsvDefaultDecimal(const char *decimal)
115 {
116     if (initializeCsvDefaultValues()) return 1;
117     if (decimal == NULL) return 1;
118
119     /* decimal separator supported . and , */
120     if ((strcmp(decimal, CSV_DECIMAL_MODE_1) == 0) ||
121             (strcmp(decimal, CSV_DECIMAL_MODE_2) == 0))
122     {
123         if (strcmp(decimal, getCsvDefaultSeparator()) == 0) return 1;
124         if (defaultCsvDecimal) FREE(defaultCsvDecimal);
125         defaultCsvDecimal = strdup(decimal);
126         if (defaultCsvDecimal == NULL) return 1;
127         return 0;
128     }
129     return 1;
130 }
131 // =============================================================================
132 int setCsvDefaultConversion(const char *conversion)
133 {
134     if (initializeCsvDefaultValues()) return 1;
135     if (conversion == NULL) return 1;
136
137     if ((strcmp(conversion, CSV_CONVERSION_MODE_1) == 0) ||
138             (strcmp(conversion, CSV_CONVERSION_MODE_2) == 0))
139     {
140         if (defaultCsvConversion) FREE(defaultCsvConversion);
141         defaultCsvConversion = strdup(conversion);
142         if (defaultCsvConversion) return 0;
143     }
144
145     return 1;
146 }
147 // =============================================================================
148 int setCsvDefaultPrecision(const char *precision)
149 {
150     if (initializeCsvDefaultValues()) return 1;
151     if (precision == NULL) return 1;
152     if (checkCsvWriteFormat(precision) == 0)
153     {
154         if (defaultCsvPrecision) FREE(defaultCsvPrecision);
155         defaultCsvPrecision = strdup(precision);
156         if (defaultCsvPrecision) return 0;
157     }
158     return 1;
159 }
160 // =============================================================================
161 int setCsvDefaultCsvIgnoreBlankLine(const char *blankMode)
162 {
163     if (initializeCsvDefaultValues()) return 1;
164     if (blankMode == NULL) return 1;
165     if ((strcmp(blankMode, CSV_IGNORE_BLANK_LINE_MODE_1) == 0) ||
166             (strcmp(blankMode, CSV_IGNORE_BLANK_LINE_MODE_2) == 0))
167     {
168         if (defaultCsvIgnoreBlankLine) FREE(defaultCsvIgnoreBlankLine);
169         defaultCsvIgnoreBlankLine = strdup(blankMode);
170         if (defaultCsvIgnoreBlankLine) return 0;
171     }
172     return 1;
173 }
174 // =============================================================================
175 static int initializeCsvDefaultValues(void)
176 {
177     if (defaultCsvSeparator == NULL)
178     {
179         defaultCsvSeparator = strdup(DEFAULT_CSV_SEPARATOR);
180     }
181
182     if (defaultCsvDecimal == NULL)
183     {
184         defaultCsvDecimal = strdup(DEFAULT_CSV_DECIMAL);
185     }
186
187     if (defaultCsvConversion == NULL)
188     {
189         defaultCsvConversion = strdup(DEFAULT_CSV_CONVERSION);
190     }
191
192     if (defaultCsvPrecision == NULL)
193     {
194         defaultCsvPrecision = strdup(DEFAULT_CSV_PRECISION);
195     }
196
197     if (defaultCsvCommentsRegExp == NULL)
198     {
199         defaultCsvCommentsRegExp = strdup(DEFAULT_CSV_COMMENTS_REGEXP);
200     }
201
202     if (defaultCsvEOL == NULL)
203     {
204         defaultCsvEOL = strdup(DEFAULT_CSV_EOL);
205     }
206
207     if (defaultCsvEncoding == NULL)
208     {
209         defaultCsvEncoding = strdup(DEFAULT_CSV_ENCODING);
210     }
211
212     if (defaultCsvIgnoreBlankLine == NULL)
213     {
214         defaultCsvIgnoreBlankLine =  strdup(DEFAULT_IGNORE_BLANK_LINE);
215     }
216
217     if ((defaultCsvSeparator == NULL) ||
218             (defaultCsvDecimal == NULL) ||
219             (defaultCsvConversion == NULL) ||
220             (defaultCsvPrecision == NULL) ||
221             (defaultCsvCommentsRegExp == NULL) ||
222             (defaultCsvEOL == NULL) ||
223             (defaultCsvEncoding == NULL) ||
224             (defaultCsvIgnoreBlankLine == NULL))
225     {
226         return 1;
227     }
228
229     return 0;
230 }
231 // =============================================================================
232 int setCsvDefaultReset(void)
233 {
234     if (defaultCsvSeparator)
235     {
236         FREE(defaultCsvSeparator);
237         defaultCsvSeparator = NULL;
238     }
239     if (defaultCsvDecimal)
240     {
241         FREE(defaultCsvDecimal);
242         defaultCsvDecimal = NULL;
243     }
244     if (defaultCsvConversion)
245     {
246         FREE(defaultCsvConversion);
247         defaultCsvConversion = NULL;
248     }
249     if (defaultCsvPrecision)
250     {
251         FREE(defaultCsvPrecision);
252         defaultCsvPrecision = NULL;
253     }
254     if (defaultCsvCommentsRegExp)
255     {
256         FREE(defaultCsvCommentsRegExp);
257         defaultCsvCommentsRegExp = NULL;
258     }
259     if (defaultCsvEOL)
260     {
261         FREE(defaultCsvEOL);
262         defaultCsvEOL = NULL;
263     }
264     if (defaultCsvEncoding)
265     {
266         FREE(defaultCsvEncoding);
267         defaultCsvEncoding = NULL;
268     }
269     if (defaultCsvIgnoreBlankLine)
270     {
271         FREE(defaultCsvIgnoreBlankLine);
272         defaultCsvIgnoreBlankLine = NULL;
273     }
274     return initializeCsvDefaultValues();
275 }
276 // =============================================================================
277 int setCsvDefaultCommentsRegExp(const char *commentsRegExp)
278 {
279     if (initializeCsvDefaultValues()) return 1;
280     if (commentsRegExp == NULL) return 1;
281
282     if (strcmp(commentsRegExp, getCsvDefaultCommentsRegExp()) == 0) return 1;
283
284     if (defaultCsvCommentsRegExp)
285     {
286         FREE(defaultCsvCommentsRegExp);
287         defaultCsvCommentsRegExp = NULL;
288     }
289
290     defaultCsvCommentsRegExp = strdup(commentsRegExp);
291
292     if (defaultCsvDecimal == NULL) return 1;
293
294     return 0;
295 }
296 // =============================================================================
297 int setCsvDefaultEOL(const char *eol)
298 {
299     if (initializeCsvDefaultValues()) return 1;
300     if (eol == NULL) return 1;
301
302     if (strcmp(eol, getCsvDefaultEOL()) == 0) return 0;
303
304     if (defaultCsvEOL)
305     {
306         FREE(defaultCsvEOL);
307         defaultCsvEOL = NULL;
308     }
309
310     defaultCsvEOL = strdup(eol);
311
312     if (defaultCsvEOL == NULL) return 1;
313
314     return 0;
315 }
316 // =============================================================================
317 int setCsvDefaultEncoding(const char *encoding)
318 {
319     if (initializeCsvDefaultValues()) return 1;
320     if (encoding == NULL) return 1;
321
322     if (strcmp(encoding, getCsvDefaultEncoding()) == 0) return 1;
323
324     if ((strcmp(encoding, DEFAULT_CSV_ENCODING_MODE1) != 0) &&
325             (strcmp(encoding, DEFAULT_CSV_ENCODING_MODE2) != 0))
326     {
327         return 1;
328     }
329
330     if (defaultCsvEncoding)
331     {
332         FREE(defaultCsvEncoding);
333         defaultCsvEncoding = NULL;
334     }
335
336     defaultCsvEncoding = strdup(encoding);
337
338     if (defaultCsvEncoding == NULL) return 1;
339
340     return 0;
341 }
342 // =============================================================================