Bug 16325: mgetl could not read single line data which is greater than ~260,000 chara... 19/21319/2
Antoine ELIAS [Thu, 13 Feb 2020 16:20:41 +0000 (17:20 +0100)]
http://bugzilla.scilab.org/16325

Change-Id: I64fd700f83b9a85c148781d529eec2e2db521cd9

scilab/CHANGES.md
scilab/modules/fileio/src/cpp/mgetl.cpp
scilab/modules/fileio/tests/nonreg_tests/bug_16325.tst [new file with mode: 0644]

index 69782eb..c4005bd 100644 (file)
@@ -405,3 +405,4 @@ Bug Fixes
 * [#16320](http://bugzilla.scilab.org/show_bug.cgi?id=16320): There were unsupported UTF-8 characters in some gettext id messages.
 * [#16321](http://bugzilla.scilab.org/show_bug.cgi?id=16321): There were typo errors in the documentation.
 * [#16323](http://bugzilla.scilab.org/show_bug.cgi?id=16323): `conj(sparse(x))` was complex when x is real. 
+* [#16325](http://bugzilla.scilab.org/show_bug.cgi?id=16325): `mgetl` could not read single line data which is greater than ~260,000 characters. 
index e1bd129..45594d0 100644 (file)
@@ -38,10 +38,10 @@ extern "C"
 static const unsigned char UTF8_BOM[] = {0xEF, 0xBB, 0xBF, 0x00};
 
 //remove \r
-inline void rtrim(char* s)
+inline void rtrim(wchar_t* s)
 {
-    size_t n = strlen(s);
-    if (n && s[n - 1] == '\r')
+    size_t n = wcslen(s);
+    if (n && s[n - 1] == L'\r')
     {
         s[n - 1] = 0;
     }
@@ -96,14 +96,12 @@ int mgetl(int iFileID, int iLineCount, wchar_t*** pwstLines)
     std::ifstream ifs(fd);
 #endif
 
-#define MAX_READ_LEN 262144
-    char str[MAX_READ_LEN];
-    std::vector<wchar_t*> lst;
+    std::string str;
+    std::vector<std::string> lst;
 
-    while ((iLineCount == -1 || lst.size() < iLineCount) && ifs.getline(str, MAX_READ_LEN))
+    while ((iLineCount == -1 || lst.size() < iLineCount) && std::getline(ifs, str))
     {
-        rtrim(str);
-        lst.push_back(to_wide_string(str));
+        lst.push_back(str);
     }
 
     int nbLinesOut = (int)lst.size();
@@ -120,7 +118,9 @@ int mgetl(int iFileID, int iLineCount, wchar_t*** pwstLines)
 
     for (int i = 0; i < nbLinesOut; ++i)
     {
-        (*pwstLines)[i] = lst[i];
+        wchar_t* str = to_wide_string(lst[i].data());
+        rtrim(str);
+        (*pwstLines)[i] = str;
     }
 
 #ifndef _MSC_VER
diff --git a/scilab/modules/fileio/tests/nonreg_tests/bug_16325.tst b/scilab/modules/fileio/tests/nonreg_tests/bug_16325.tst
new file mode 100644 (file)
index 0000000..5e82296
--- /dev/null
@@ -0,0 +1,33 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 16325 -->
+//
+// <-- Bugzilla URL -->
+// https://bugzilla.scilab.org/show_bug.cgi?id=16325
+//
+// <-- Short Description -->
+// mgetl could not read text file with single line data which is greater than ~260,000 characters
+
+//create file with 1 line
+n = [1d0 1d1 1d2 1d3 1d4 1d5 1d6];
+
+for i=n
+    a = rand(1, i) * 10;
+    a = a + ascii("0");
+    filename = fullfile(TMPDIR, "16325.dat");
+    f = mopen(filename, "wt");
+    mput(a, "c", f);
+    mclose(f);
+
+    //read file
+    x = mgetl(filename);
+    assert_checkequal(length(x), i);
+end