Merge remote-tracking branch 'origin/master' into windows
[scilab.git] / scilab / modules / fileio / src / cpp / mgetl.cpp
index a25b238..0ad188d 100644 (file)
@@ -3,11 +3,14 @@
 * Copyright (C) 2010 - DIGITEO - Allan CORNET
 * Copyright (C) 2010 - DIGITEO - Antoine ELIAS
 *
-* 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.
 *
 */
 /*--------------------------------------------------------------------------*/
@@ -26,6 +29,7 @@ extern "C"
 #include "mtell.h"
 #include "mseek.h"
 #include "sciprint.h"
+#include "freeArrayOfString.h"
 }
 
 #include <iostream>
@@ -106,11 +110,12 @@ char** mgetl(int fd, int nbLinesIn, int *nbLinesOut, int *ierr)
             {
                 *nbLinesOut = 0;
                 *ierr = MGETL_MEMORY_ALLOCATION_ERROR;
+                FREE(Line);
                 return NULL;
             }
             while ( getLine ( Line, LINE_MAX * iLineSizeMult, pFile ) != NULL )
             {
-                if (((int) strlen(Line)) >= (LINE_MAX * iLineSizeMult) - 1)
+                if (((int)strlen(Line)) >= (LINE_MAX * iLineSizeMult) - 1 && iPos >= 0)
                 {
                     FREE(Line);
                     iLineSizeMult++;
@@ -136,6 +141,7 @@ char** mgetl(int fd, int nbLinesIn, int *nbLinesOut, int *ierr)
                 {
                     *nbLinesOut = 0;
                     *ierr = MGETL_MEMORY_ALLOCATION_ERROR;
+                    FREE(Line);
                     return NULL;
                 }
 
@@ -144,6 +150,8 @@ char** mgetl(int fd, int nbLinesIn, int *nbLinesOut, int *ierr)
                 {
                     *nbLinesOut = 0;
                     *ierr = MGETL_MEMORY_ALLOCATION_ERROR;
+                    freeArrayOfString(strLines, nbLines);
+                    FREE(Line);
                     return NULL;
                 }
                 
@@ -158,11 +166,6 @@ char** mgetl(int fd, int nbLinesIn, int *nbLinesOut, int *ierr)
             {
                 *ierr = MGETL_EOF;
                 *nbLinesOut = 0;
-                if (strLines)
-                {
-                    FREE(strLines);
-                }
-                strLines = NULL;
             }
             else
             {
@@ -173,6 +176,7 @@ char** mgetl(int fd, int nbLinesIn, int *nbLinesOut, int *ierr)
                 {
                     *nbLinesOut = 0;
                     *ierr = MGETL_MEMORY_ALLOCATION_ERROR;
+                    FREE(Line);
                     return NULL;
                 }
 
@@ -206,6 +210,7 @@ char** mgetl(int fd, int nbLinesIn, int *nbLinesOut, int *ierr)
                                 char* tmpLine = os_strdup(Line);
                                 memset(Line, 0x00, LINE_MAX * iLineSizeMult);
                                 strcpy(Line, &tmpLine[1]);
+                                FREE(tmpLine);
                             }
                             nbLines++;
                             strLines[nbLines - 1] = os_strdup(removeEOL(Line));
@@ -213,6 +218,8 @@ char** mgetl(int fd, int nbLinesIn, int *nbLinesOut, int *ierr)
                             {
                                 *nbLinesOut = 0;
                                 *ierr = MGETL_MEMORY_ALLOCATION_ERROR;
+                                FREE(Line);
+                                freeArrayOfString(strLines, nbLines);
                                 return NULL;
                             }