Fix CIDs #1371081 & #1371077
[scilab.git] / scilab / modules / spreadsheet / src / c / csvRead.c
index 7e7386d..7c2d61d 100644 (file)
@@ -2,17 +2,20 @@
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2010-2011 - DIGITEO - Allan CORNET
  *
- * This file must be used under the terms of the CeCILL.
- * This source file is licensed as described in the file COPYING, which
- * you should have received as part of this distribution.  The terms
- * are also available at
- * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ *
+ * This file is hereby licensed under the terms of the GNU GPL v2.0,
+ * pursuant to article 5.3.4 of the CeCILL v.2.1.
+ * This file was originally licensed under the terms of the CeCILL v2.1,
+ * and continues to be available under such terms.
+ * For more information, see the COPYING file which you should have received
+ * along with this program.
  *
  */
 #include <string.h>
 #include <stdio.h>
 #include "csvRead.h"
-#include "MALLOC.h"
+#include "sci_malloc.h"
 #include "freeArrayOfString.h"
 #include "mopen.h"
 #include "mgetl.h"
 #include "expandPathVariable.h"
 #include "FileExist.h"
 #include "mclose.h"
-#include "sci_warning.h"
+#include "configvariable_interface.h"
 #include "pcre_private.h"
 #include "sciprint.h"
 #include "splitLine.h"
-#include "os_strdup.h"
+#include "os_string.h"
 #include "csvDefault.h"
 #include "strsubst.h"
+#include "Sciwarning.h"
 // =============================================================================
 #if _MSC_VER
 #define READ_ONLY_TEXT_MODE "rt"
@@ -47,7 +51,7 @@ static char **extractComments(const char **lines, int nbLines, const char *regex
 static char **removeComments(const char **lines, int nbLines, const char *regexpcomments, int *nbNewLine, int *iErr);
 static char **removeAllBlankLines(const char **lines, int *sizelines);
 // =============================================================================
-csvResult* csvRead(const char *filename, const char *separator, const char *decimal, const char **toreplace, int sizetoreplace, const char *regexpcomments)
+csvResult* csvRead(const char *filename, const char *separator, const char *decimal, const char **toreplace, int sizetoreplace, const char *regexpcomments, int header)
 {
     wchar_t *expandedFilename = NULL;
     wchar_t *wideFilename = NULL;
@@ -56,10 +60,9 @@ csvResult* csvRead(const char *filename, const char *separator, const char *deci
     int f_swap = 0;
     double res = 0.0;
     int errMOPEN = MOPEN_INVALID_STATUS;
-    int errMGETL = MGETL_ERROR;
     wchar_t **pwstLines = NULL;
     char **pstLines = NULL;
-    int nblines = 0;
+    int nbLines = 0;
     char **replacedInLines = NULL;
     char **pComments = NULL;
     int nbComments = 0;
@@ -85,21 +88,18 @@ csvResult* csvRead(const char *filename, const char *separator, const char *deci
             result->pstrComments = NULL;
             result->nbComments = 0;
         }
-        if (expandedFilename)
-        {
-            FREE(expandedFilename);
-            expandedFilename = NULL;
-        }
+
+        FREE(expandedFilename);
         return result;
     }
 
     errMOPEN = mopen(expandedFilename, L"rt", f_swap, &fd); // rt = read only
-    printf("error mopen : %d\n", errMOPEN);
     if (expandedFilename)
     {
         FREE(expandedFilename);
         expandedFilename = NULL;
     }
+
     if (errMOPEN != MOPEN_NO_ERROR)
     {
         result = (csvResult*)(MALLOC(sizeof(csvResult)));
@@ -116,29 +116,29 @@ csvResult* csvRead(const char *filename, const char *separator, const char *deci
         return result;
     }
 
-    pwstLines = mgetl(fd, -1, &nblines, &errMGETL);
-    pstLines = (char**)MALLOC(sizeof(char*) * nblines);
-
+    if (header != 0)
     {
-        int i = 0;
-        for (i = 0 ; i < nblines ; i++)
-        {
-            pstLines[i] = wide_string_to_UTF8(pwstLines[i]);
-            printf("mgetl %s\n", pstLines[i]);
-        }
-
+        wchar_t **pwstHeaderLines = NULL;
+        mgetl(fd, header, &pwstHeaderLines);
+        FREE(pwstHeaderLines);
     }
 
+    nbLines = mgetl(fd, -1, &pwstLines);
     mclose(fd);
 
-    if (errMGETL != MGETL_NO_ERROR)
+    if (nbLines >= 0)
     {
-        if (pwstLines)
+        int i = 0;
+        pstLines = (char**)MALLOC(sizeof(char*) * nbLines);
+        for (i = 0 ; i < nbLines ; i++)
         {
-            freeArrayOfWideString(pwstLines, nblines);
-            pwstLines = NULL;
+            pstLines[i] = wide_string_to_UTF8(pwstLines[i]);
         }
-
+        freeArrayOfWideString(pwstLines, nbLines);
+        pwstLines = NULL;
+    }
+    else
+    {
         result = (csvResult*)(MALLOC(sizeof(csvResult)));
         if (result)
         {
@@ -156,7 +156,7 @@ csvResult* csvRead(const char *filename, const char *separator, const char *deci
     {
         int iErr = 0;
 
-        pComments = extractComments((const char**)pstLines, nblines, regexpcomments, &nbComments, &iErr);
+        pComments = extractComments((const char**)pstLines, nbLines, regexpcomments, &nbComments, &iErr);
 
         if ((iErr == CAN_NOT_COMPILE_PATTERN) || (iErr == DELIMITER_NOT_ALPHANUMERIC))
         {
@@ -174,6 +174,7 @@ csvResult* csvRead(const char *filename, const char *separator, const char *deci
                 result->pstrComments = NULL;
                 result->nbComments = 0;
             }
+            freeArrayOfString(pstLines, nbLines);
             return result;
         }
 
@@ -183,13 +184,12 @@ csvResult* csvRead(const char *filename, const char *separator, const char *deci
             int nbCleanedLines = 0;
             int i = 0;
 
-            pCleanedLines = removeComments((const char**)pstLines, nblines, (const char*)regexpcomments, &nbCleanedLines, &iErr);
+            pCleanedLines = removeComments((const char**)pstLines, nbLines, (const char*)regexpcomments, &nbCleanedLines, &iErr);
             if (pCleanedLines)
             {
-                FREE(pwstLines);
                 FREE(pstLines);
                 pstLines = pCleanedLines;
-                nblines = nbCleanedLines;
+                nbLines = nbCleanedLines;
             }
 
         }
@@ -197,40 +197,27 @@ csvResult* csvRead(const char *filename, const char *separator, const char *deci
 
     if (toreplace && (sizetoreplace > 0))
     {
-        replacedInLines = replaceStrings((const char**)pstLines, nblines, toreplace, sizetoreplace);
+        replacedInLines = replaceStrings((const char**)pstLines, nbLines, toreplace, sizetoreplace);
         if (replacedInLines)
         {
-            freeArrayOfString(pstLines, nblines);
+            freeArrayOfString(pstLines, nbLines);
             pstLines = replacedInLines;
         }
     }
 
-    {
-        int i = 0;
-        for (i = 0 ; i < nblines ; i++)
-        {
-            printf("csvtextscan %s\n", pstLines[i]);
-        }
-
-    }
-    result = csvTextScan((const char**)pstLines, nblines, (const char*)separator, (const char*)decimal);
-    if (pstLines)
-    {
-        freeArrayOfString(pstLines, nblines);
-        pstLines = NULL;
-    }
-
-    if (pwstLines)
-    {
-        freeArrayOfWideString(pwstLines, nblines);
-        pwstLines = NULL;
-    }
+    result = csvTextScan((const char**)pstLines, nbLines, (const char*)separator, (const char*)decimal);
+    freeArrayOfString(pstLines, nbLines);
+    freeArrayOfWideString(pwstLines, nbLines);
 
     if (result)
     {
         result->pstrComments = pComments;
         result->nbComments = nbComments;
     }
+    else
+    {
+        freeArrayOfString(pComments, nbComments);
+    }
 
     return result;
 }
@@ -278,14 +265,6 @@ csvResult* csvTextScan(const char **lines, int numberOfLines, const char *separa
         }
     }
 
-    {
-        int i = 0;
-        for (i = 0 ; i < nbLines ; i++)
-        {
-            printf("%s\n", cleanedLines[i]);
-        }
-
-    }
     nbColumns = getNumbersOfColumnsInLines((const char **)cleanedLines, nbLines, separator);
     if (nbColumns == 0)
     {
@@ -308,7 +287,6 @@ csvResult* csvTextScan(const char **lines, int numberOfLines, const char *separa
     }
 
     cellsStrings = getStringsFromLines((const char **)cleanedLines, nbLines, separator, decimal, nbColumns, nbRows);
-    printf("nbRows %d, nbColumns %d \n", nbRows, nbColumns);
     if (cleanedLines)
     {
         freeArrayOfString(cleanedLines, nbLines);
@@ -392,11 +370,7 @@ static int getNumbersOfColumnsInLines(const char **lines, int sizelines,
             {
                 if (previousNbColumns != NbColumns)
                 {
-                    if (getWarningMode())
-                    {
-                        sciprint(_("%s: Inconsistency found in the columns. At line %d, found %d columns while the previous had %d.\n"), _("Warning"), i + 1, NbColumns, previousNbColumns);
-                    }
-
+                    Sciwarning(_("%s: Inconsistency found in the columns. At line %d, found %d columns while the previous had %d.\n"), _("Warning"), i + 1, NbColumns, previousNbColumns);
                     return 0;
                 }
             }
@@ -655,7 +629,7 @@ static char **replaceStrings(const char **lines, int nbLines, const char **torep
                 replacedStrings[j] = os_strdup(lines[j]);
             }
             // Make replacements within the target replacedStrings.
-            for (i = 0; i < nr; i = i++)
+            for (i = 0; i < nr; i++)
             {
                 for (j = 0; j < nbLines; j++)
                 {
@@ -681,10 +655,17 @@ static char **extractComments(const char **lines, int nbLines,
 
         if ( (answer == CAN_NOT_COMPILE_PATTERN) || (answer == DELIMITER_NOT_ALPHANUMERIC))
         {
+            if (pComments)
+            {
+                freeArrayOfString(pComments, *nbcomments);
+            }
+
             *nbcomments = 0;
+
             *iErr = answer;
             return NULL;
         }
+
         if ( answer == PCRE_FINISHED_OK )
         {
             (*nbcomments)++;