2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2010-2011 - DIGITEO - Allan CORNET
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
12 #if defined(__linux__)
13 #define _GNU_SOURCE /* Bug 5673 fix: avoid dependency on GLIBC_2.7 */
15 // =============================================================================
18 #include "stringToDouble.h"
22 #include "expandPathVariable.h"
23 #include "FileExist.h"
26 #include "core_math.h"
28 #include "strdup_windows.h"
30 #include "csv_strsubst.h"
31 #include "csvDefault.h"
32 #include "utftolatin.h"
33 // =============================================================================
34 #define DEFAULT_CSV_WRITE_STRING_FORMAT "%s"
35 #define DEFAULT_CSV_WRITE_DOUBLE_FORMAT "%.lg"
38 #define ComplexStr "i"
39 #define EMPTY_STRING ""
45 // =============================================================================
47 static int signbit(double x)
64 // =============================================================================
65 static int doConvertToLatin(void)
67 const char *encoding = getCsvDefaultEncoding();
70 return (strcmp(encoding, "iso-latin") == 0) ? 1 : 0;
74 // =============================================================================
75 csvWriteError csvWrite_double(const char *filename,
76 const double *pdValues, int m, int n,
77 const char *separator,
79 const char *precisionFormat,
80 const char **headersLines,
85 char *expandedFilename = NULL;
88 if (filename == NULL) return CSV_WRITE_ERROR;
89 if (pdValues == NULL) return CSV_WRITE_ERROR;
90 if (m < 0 || n < 0) return CSV_WRITE_ERROR;
91 if (separator == NULL) return CSV_WRITE_ERROR;
92 if (decimal == NULL) return CSV_WRITE_ERROR;
93 if (precisionFormat == NULL) return CSV_WRITE_ERROR;
95 if (strcmp(separator, decimal) == 0) return CSV_WRITE_SEPARATOR_DECIMAL_EQUAL;
97 expandedFilename = expandPathVariable((char*)filename);
98 wcfopen(fd , filename, MODEWFD);
101 FREE(expandedFilename);
102 expandedFilename = NULL;
104 if ( fd == (FILE *)NULL ) return CSV_WRITE_FOPEN_ERROR;
106 isIsoLatin = doConvertToLatin();
108 if ((headersLines) && (nbHeadersLines > 0))
110 for (i = 0; i < nbHeadersLines; i++)
114 char *converted = utftolatin((char*)headersLines[i]);
117 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, converted);
122 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, headersLines[i]);
127 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, headersLines[i]);
129 fprintf(fd, "%s", getCsvDefaultEOL());
133 for (i = 0; i < m; i++)
135 for (j = 0; j < n; j++)
137 if (ISNAN(pdValues[i + m * j]))
139 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, NanString);
141 else if (finite(pdValues[i + m * j]))
145 sprintf(buffer, precisionFormat, pdValues[i + m * j]);
146 result = csv_strsubst(buffer, getCsvDefaultDecimal(), decimal);
149 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, result);
155 fprintf(fd, DEFAULT_CSV_WRITE_DOUBLE_FORMAT, pdValues[i + m * j]);
160 if ( signbit(pdValues[i + m * j]) )
162 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, NegInfString);
166 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, InfString);
169 if (j + 1 < n) fprintf(fd, "%s", separator);
171 fprintf(fd, "%s", getCsvDefaultEOL());
175 return CSV_WRITE_NO_ERROR;
177 // =============================================================================
178 csvWriteError csvWrite_complex(const char *filename,
179 const double *pdValuesReal,
180 const double *pdValuesImag,
182 const char *separator,
184 const char *precisionFormat,
185 const char **headersLines,
190 char *expandedFilename = NULL;
193 if (filename == NULL) return CSV_WRITE_ERROR;
194 if (pdValuesReal == NULL) return CSV_WRITE_ERROR;
195 if (pdValuesImag == NULL) return CSV_WRITE_ERROR;
196 if (m < 0 || n < 0) return CSV_WRITE_ERROR;
197 if (separator == NULL) return CSV_WRITE_ERROR;
198 if (decimal == NULL) return CSV_WRITE_ERROR;
199 if (precisionFormat == NULL) return CSV_WRITE_ERROR;
201 if (strcmp(separator, decimal) == 0) return CSV_WRITE_SEPARATOR_DECIMAL_EQUAL;
203 expandedFilename = expandPathVariable((char*)filename);
204 wcfopen(fd , filename, MODEWFD);
205 if (expandedFilename)
207 FREE(expandedFilename);
208 expandedFilename = NULL;
210 if ( fd == (FILE *)NULL ) return CSV_WRITE_FOPEN_ERROR;
212 isIsoLatin = doConvertToLatin();
214 if ((headersLines) && (nbHeadersLines > 0))
216 for (i = 0; i < nbHeadersLines; i++)
220 const char *converted = utftolatin((char*)headersLines[i]);
223 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, converted);
224 FREE((char*)converted);
229 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, headersLines[i]);
234 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, headersLines[i]);
236 fprintf(fd, "%s", getCsvDefaultEOL());
240 for (i = 0; i < m; i++)
242 for (j = 0; j < n; j++)
244 char StringValue[65535];
245 if (ISNAN(pdValuesReal[i + m * j]))
247 strcpy(StringValue, NanString);
249 else if (finite(pdValuesReal[i + m * j]))
253 sprintf(buffer, precisionFormat, pdValuesReal[i + m * j]);
254 result = csv_strsubst(buffer, getCsvDefaultDecimal(), decimal);
257 strcpy(StringValue, result);
263 sprintf(StringValue, DEFAULT_CSV_WRITE_DOUBLE_FORMAT, pdValuesReal[i + m * j]);
268 if ( signbit(pdValuesReal[i + m * j]) )
271 strcpy(StringValue, NegInfString);
276 strcpy(StringValue, InfString);
280 if (ISNAN(pdValuesImag[i + m * j]))
282 strcat(StringValue, PlusStr);
283 strcat(StringValue, NanString);
284 strcat(StringValue, ComplexStr);
286 else if (finite(pdValuesImag[i + m * j]))
291 if (pdValuesImag[i + m * j] >= 0)
293 strcat(StringValue, PlusStr);
297 strcat(StringValue, LessStr);
300 sprintf(buffer, precisionFormat, fabs(pdValuesImag[i + m * j]));
301 result = csv_strsubst(buffer, getCsvDefaultDecimal(), decimal);
305 strcat(StringValue, result);
311 sprintf(buffer, DEFAULT_CSV_WRITE_DOUBLE_FORMAT, fabs(pdValuesImag[i + m * j]));
312 strcat(StringValue, buffer);
314 strcat(StringValue, ComplexStr);
318 if ( signbit(pdValuesImag[i + m * j]) )
321 strcat(StringValue, LessStr);
326 strcat(StringValue, PlusStr);
328 strcat(StringValue, InfString);
329 strcat(StringValue, ComplexStr);
331 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, StringValue);
332 if (j + 1 < n) fprintf(fd, "%s", separator);
334 fprintf(fd, "%s", getCsvDefaultEOL());
338 return CSV_WRITE_NO_ERROR;
340 // =============================================================================
341 csvWriteError csvWrite_string(const char *filename,
342 const char **pStrValues, int m, int n,
343 const char *separator,
345 const char **headersLines,
350 char *expandedFilename = NULL;
353 if (filename == NULL) return CSV_WRITE_ERROR;
354 if (pStrValues == NULL) return CSV_WRITE_ERROR;
355 if (m < 0 || n < 0) return CSV_WRITE_ERROR;
356 if (separator == NULL) return CSV_WRITE_ERROR;
358 if (strcmp(separator, decimal) == 0) return CSV_WRITE_SEPARATOR_DECIMAL_EQUAL;
360 expandedFilename = expandPathVariable((char*)filename);
361 wcfopen(fd , filename, MODEWFD);
362 if (expandedFilename)
364 FREE(expandedFilename);
365 expandedFilename = NULL;
367 if ( fd == (FILE *)NULL ) return CSV_WRITE_FOPEN_ERROR;
369 isIsoLatin = doConvertToLatin();
371 if ((headersLines) && (nbHeadersLines > 0))
373 for (i = 0; i < nbHeadersLines; i++)
377 const char *converted = utftolatin((char*)headersLines[i]);
380 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, converted);
381 FREE((char*)converted);
386 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, headersLines[i]);
391 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, headersLines[i]);
393 fprintf(fd, "%s", getCsvDefaultEOL());
397 for (i = 0 ; i < m ; i++ )
399 for ( j = 0 ; j < n ; j++)
405 const char *converted = utftolatin((char*)pStrValues[i + m * j]);
408 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, converted);
409 FREE((char*)converted);
414 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, pStrValues[i + m * j]);
419 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, pStrValues[i + m * j]);
425 result = csv_strsubst((char*)(pStrValues[i + m * j]), getCsvDefaultDecimal(), decimal);
430 char *converted = utftolatin(result);
433 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, converted);
439 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, result);
444 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, result);
451 fprintf(fd, DEFAULT_CSV_WRITE_STRING_FORMAT, pStrValues[i + m * j]);
454 if (j + 1 < n) fprintf(fd, "%s", separator);
456 fprintf(fd, "%s", getCsvDefaultEOL());
460 return CSV_WRITE_NO_ERROR;
462 // =============================================================================