11c783fab5282e29c936d07b432c79fb79886b79
[scilab.git] / scilab / modules / spreadsheet / src / c / 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 #define DEFAULT_CSV_EOL "\n"
25 #define CSV_DECIMAL_MODE_1 DEFAULT_CSV_DECIMAL
26 #define CSV_DECIMAL_MODE_2 ","
27 #define DEFAULT_CSV_CONVERSION "double"
28 #define CSV_CONVERSION_MODE_1 DEFAULT_CSV_CONVERSION
29 #define CSV_CONVERSION_MODE_2 "string"
30 #define DEFAULT_CSV_ENCODING "utf-8"
31 #define DEFAULT_CSV_ENCODING_MODE1 "utf-8"
32 #define DEFAULT_CSV_ENCODING_MODE2 "iso-latin"
33 #define CSV_IGNORE_BLANK_LINE_MODE_1 "off"
34 #define CSV_IGNORE_BLANK_LINE_MODE_2 "on"
35 #define DEFAULT_IGNORE_BLANK_LINE CSV_IGNORE_BLANK_LINE_MODE_2
36 // =============================================================================
37 static char *defaultCsvSeparator = NULL;
38 static char *defaultCsvDecimal = NULL;
39 static char *defaultCsvConversion = NULL;
40 static char *defaultCsvPrecision = NULL;
41 static char *defaultCsvCommentsRegExp = NULL;
42 static char *defaultCsvEOL = NULL;
43 static char *defaultCsvEncoding = NULL;
44 static char *defaultCsvIgnoreBlankLine = NULL;
45 // =============================================================================
46 static int initializeCsvDefaultValues(void);
47 // =============================================================================
48 const char *getCsvDefaultSeparator(void)
49 {
50     initializeCsvDefaultValues();
51     return defaultCsvSeparator;
52 }
53 // =============================================================================
54 const char *getCsvDefaultDecimal(void)
55 {
56     initializeCsvDefaultValues();
57     return defaultCsvDecimal;
58 }
59 // =============================================================================
60 const char *getCsvDefaultConversion(void)
61 {
62     initializeCsvDefaultValues();
63     return defaultCsvConversion;
64 }
65 // =============================================================================
66 const char *getCsvDefaultPrecision(void)
67 {
68     initializeCsvDefaultValues();
69     return defaultCsvPrecision;
70 }
71 // =============================================================================
72 const char *getCsvDefaultCommentsRegExp(void)
73 {
74     initializeCsvDefaultValues();
75     return defaultCsvCommentsRegExp;
76 }
77 // =============================================================================
78 const char *getCsvDefaultEOL(void)
79 {
80     initializeCsvDefaultValues();
81     return defaultCsvEOL;
82 }
83 // =============================================================================
84 const char *getCsvDefaultEncoding(void)
85 {
86     initializeCsvDefaultValues();
87     return defaultCsvEncoding;
88 }
89 // =============================================================================
90 const char *getCsvDefaultCsvIgnoreBlankLine(void)
91 {
92     initializeCsvDefaultValues();
93     return defaultCsvIgnoreBlankLine;
94 }
95 // =============================================================================
96 int setCsvDefaultSeparator(const char *separator)
97 {
98     if (initializeCsvDefaultValues())
99     {
100         return 1;
101     }
102     if (separator == NULL)
103     {
104         return 1;
105     }
106
107     if (strcmp(separator, getCsvDefaultDecimal()) == 0)
108     {
109         return 1;
110     }
111
112     if (defaultCsvSeparator)
113     {
114         FREE(defaultCsvSeparator);
115     }
116     defaultCsvSeparator = strdup(separator);
117     if (defaultCsvSeparator == NULL)
118     {
119         return 1;
120     }
121
122     return 0;
123 }
124 // =============================================================================
125 int setCsvDefaultDecimal(const char *decimal)
126 {
127     if (initializeCsvDefaultValues())
128     {
129         return 1;
130     }
131     if (decimal == NULL)
132     {
133         return 1;
134     }
135
136     /* decimal separator supported . and , */
137     if ((strcmp(decimal, CSV_DECIMAL_MODE_1) == 0) ||
138             (strcmp(decimal, CSV_DECIMAL_MODE_2) == 0))
139     {
140         if (strcmp(decimal, getCsvDefaultSeparator()) == 0)
141         {
142             return 1;
143         }
144         if (defaultCsvDecimal)
145         {
146             FREE(defaultCsvDecimal);
147         }
148         defaultCsvDecimal = strdup(decimal);
149         if (defaultCsvDecimal == NULL)
150         {
151             return 1;
152         }
153         return 0;
154     }
155     return 1;
156 }
157 // =============================================================================
158 int setCsvDefaultConversion(const char *conversion)
159 {
160     if (initializeCsvDefaultValues())
161     {
162         return 1;
163     }
164     if (conversion == NULL)
165     {
166         return 1;
167     }
168
169     if ((strcmp(conversion, CSV_CONVERSION_MODE_1) == 0) ||
170             (strcmp(conversion, CSV_CONVERSION_MODE_2) == 0))
171     {
172         if (defaultCsvConversion)
173         {
174             FREE(defaultCsvConversion);
175         }
176         defaultCsvConversion = strdup(conversion);
177         if (defaultCsvConversion)
178         {
179             return 0;
180         }
181     }
182
183     return 1;
184 }
185 // =============================================================================
186 int setCsvDefaultPrecision(const char *precision)
187 {
188     if (initializeCsvDefaultValues())
189     {
190         return 1;
191     }
192     if (precision == NULL)
193     {
194         return 1;
195     }
196     if (checkCsvWriteFormat(precision) == 0)
197     {
198         if (defaultCsvPrecision)
199         {
200             FREE(defaultCsvPrecision);
201         }
202         defaultCsvPrecision = strdup(precision);
203         if (defaultCsvPrecision)
204         {
205             return 0;
206         }
207     }
208     return 1;
209 }
210 // =============================================================================
211 int setCsvDefaultCsvIgnoreBlankLine(const char *blankMode)
212 {
213     if (initializeCsvDefaultValues())
214     {
215         return 1;
216     }
217     if (blankMode == NULL)
218     {
219         return 1;
220     }
221     if ((strcmp(blankMode, CSV_IGNORE_BLANK_LINE_MODE_1) == 0) ||
222             (strcmp(blankMode, CSV_IGNORE_BLANK_LINE_MODE_2) == 0))
223     {
224         if (defaultCsvIgnoreBlankLine)
225         {
226             FREE(defaultCsvIgnoreBlankLine);
227         }
228         defaultCsvIgnoreBlankLine = strdup(blankMode);
229         if (defaultCsvIgnoreBlankLine)
230         {
231             return 0;
232         }
233     }
234     return 1;
235 }
236 // =============================================================================
237 static int initializeCsvDefaultValues(void)
238 {
239     if (defaultCsvSeparator == NULL)
240     {
241         defaultCsvSeparator = strdup(DEFAULT_CSV_SEPARATOR);
242     }
243
244     if (defaultCsvDecimal == NULL)
245     {
246         defaultCsvDecimal = strdup(DEFAULT_CSV_DECIMAL);
247     }
248
249     if (defaultCsvConversion == NULL)
250     {
251         defaultCsvConversion = strdup(DEFAULT_CSV_CONVERSION);
252     }
253
254     if (defaultCsvPrecision == NULL)
255     {
256         defaultCsvPrecision = strdup(DEFAULT_CSV_PRECISION);
257     }
258
259     if (defaultCsvCommentsRegExp == NULL)
260     {
261         defaultCsvCommentsRegExp = strdup(DEFAULT_CSV_COMMENTS_REGEXP);
262     }
263
264     if (defaultCsvEOL == NULL)
265     {
266         defaultCsvEOL = strdup(DEFAULT_CSV_EOL);
267     }
268
269     if (defaultCsvEncoding == NULL)
270     {
271         defaultCsvEncoding = strdup(DEFAULT_CSV_ENCODING);
272     }
273
274     if (defaultCsvIgnoreBlankLine == NULL)
275     {
276         defaultCsvIgnoreBlankLine =  strdup(DEFAULT_IGNORE_BLANK_LINE);
277     }
278
279     if ((defaultCsvSeparator == NULL) ||
280             (defaultCsvDecimal == NULL) ||
281             (defaultCsvConversion == NULL) ||
282             (defaultCsvPrecision == NULL) ||
283             (defaultCsvCommentsRegExp == NULL) ||
284             (defaultCsvEOL == NULL) ||
285             (defaultCsvEncoding == NULL) ||
286             (defaultCsvIgnoreBlankLine == NULL))
287     {
288         return 1;
289     }
290
291     return 0;
292 }
293 // =============================================================================
294 int setCsvDefaultReset(void)
295 {
296     if (defaultCsvSeparator)
297     {
298         FREE(defaultCsvSeparator);
299         defaultCsvSeparator = NULL;
300     }
301     if (defaultCsvDecimal)
302     {
303         FREE(defaultCsvDecimal);
304         defaultCsvDecimal = NULL;
305     }
306     if (defaultCsvConversion)
307     {
308         FREE(defaultCsvConversion);
309         defaultCsvConversion = NULL;
310     }
311     if (defaultCsvPrecision)
312     {
313         FREE(defaultCsvPrecision);
314         defaultCsvPrecision = NULL;
315     }
316     if (defaultCsvCommentsRegExp)
317     {
318         FREE(defaultCsvCommentsRegExp);
319         defaultCsvCommentsRegExp = NULL;
320     }
321     if (defaultCsvEOL)
322     {
323         FREE(defaultCsvEOL);
324         defaultCsvEOL = NULL;
325     }
326     if (defaultCsvEncoding)
327     {
328         FREE(defaultCsvEncoding);
329         defaultCsvEncoding = NULL;
330     }
331     if (defaultCsvIgnoreBlankLine)
332     {
333         FREE(defaultCsvIgnoreBlankLine);
334         defaultCsvIgnoreBlankLine = NULL;
335     }
336     return initializeCsvDefaultValues();
337 }
338 // =============================================================================
339 int setCsvDefaultCommentsRegExp(const char *commentsRegExp)
340 {
341     if (initializeCsvDefaultValues())
342     {
343         return 1;
344     }
345     if (commentsRegExp == NULL)
346     {
347         return 1;
348     }
349
350     if (strcmp(commentsRegExp, getCsvDefaultCommentsRegExp()) == 0)
351     {
352         return 1;
353     }
354
355     if (defaultCsvCommentsRegExp)
356     {
357         FREE(defaultCsvCommentsRegExp);
358         defaultCsvCommentsRegExp = NULL;
359     }
360
361     defaultCsvCommentsRegExp = strdup(commentsRegExp);
362
363     if (defaultCsvDecimal == NULL)
364     {
365         return 1;
366     }
367
368     return 0;
369 }
370 // =============================================================================
371 int setCsvDefaultEOL(const char *eol)
372 {
373     if (initializeCsvDefaultValues())
374     {
375         return 1;
376     }
377     if (eol == NULL)
378     {
379         return 1;
380     }
381
382     if (strcmp(eol, getCsvDefaultEOL()) == 0)
383     {
384         return 0;
385     }
386
387     if (defaultCsvEOL)
388     {
389         FREE(defaultCsvEOL);
390         defaultCsvEOL = NULL;
391     }
392
393     defaultCsvEOL = strdup(eol);
394
395     if (defaultCsvEOL == NULL)
396     {
397         return 1;
398     }
399
400     return 0;
401 }
402 // =============================================================================
403 int setCsvDefaultEncoding(const char *encoding)
404 {
405     if (initializeCsvDefaultValues())
406     {
407         return 1;
408     }
409     if (encoding == NULL)
410     {
411         return 1;
412     }
413
414     if (strcmp(encoding, getCsvDefaultEncoding()) == 0)
415     {
416         return 1;
417     }
418
419     if ((strcmp(encoding, DEFAULT_CSV_ENCODING_MODE1) != 0) &&
420             (strcmp(encoding, DEFAULT_CSV_ENCODING_MODE2) != 0))
421     {
422         return 1;
423     }
424
425     if (defaultCsvEncoding)
426     {
427         FREE(defaultCsvEncoding);
428         defaultCsvEncoding = NULL;
429     }
430
431     defaultCsvEncoding = strdup(encoding);
432
433     if (defaultCsvEncoding == NULL)
434     {
435         return 1;
436     }
437
438     return 0;
439 }
440 // =============================================================================