[bug_14187] fscanfMat fixed 78/17378/4
Cedric Delamarre [Thu, 22 Oct 2015 15:09:47 +0000 (17:09 +0200)]
test_run fileio bug_14187
test_run fileio bug_6428

Change-Id: I339a9d81bcd5bc21c57a33da2eb41a6c724b4013

scilab/CHANGES_6.0.X
scilab/modules/fileio/src/c/fscanfMat.c
scilab/modules/fileio/tests/nonreg_tests/bug_14187.dia.ref [new file with mode: 0644]
scilab/modules/fileio/tests/nonreg_tests/bug_14187.tst [new file with mode: 0644]

index f132da8..453a34b 100644 (file)
@@ -126,6 +126,8 @@ Scilab Bug Fixes
 
 * Bug #14159 fixed - Matplot crashed Scilab on boolean input.
 
+* Bug #14187 fixed - fscanfMat failed to read format %d, %i and %f.
+
 * Bug #14199 fixed - sqrt returned wrong dimension results on matrix with more than dimensions.
 
 * Bug #14203 fixed - Improve some error messages, some help pages and some comments.
index 9818099..44a254a 100644 (file)
@@ -579,8 +579,42 @@ static double *getDoubleValuesInLine(char *line,
             dValues = (double*)MALLOC(sizeof(double) * nbColumnsMax);
             for (i = 0; i < nbColumnsMax; i++)
             {
+                int ierr = 0;
                 double dValue = 0.;
-                int ierr = sscanf(splittedStr[i], format, &dValue);
+                char *cleanedFormat = getCleanedFormat(format);
+                int iLen = strlen(cleanedFormat);
+                switch (cleanedFormat[iLen - 1])
+                {
+                    case 'e' :
+                    case 'g' :
+                    case 'f' :
+                    {
+                        if (cleanedFormat[iLen - 2] == 'l')
+                        {
+                            double tmp = 0.;
+                            ierr = sscanf(splittedStr[i], cleanedFormat, &tmp);
+                            dValue = tmp;
+                        }
+                        else
+                        {
+                            float tmp = 0.;
+                            ierr = sscanf(splittedStr[i], cleanedFormat, &tmp);
+                            dValue = tmp;
+                        }
+                        break;
+                    }
+                    case 'd' :
+                    case 'i' :
+                    {
+                        int tmp = 0;
+                        ierr = sscanf(splittedStr[i], cleanedFormat, &tmp);
+                        dValue = tmp;
+                        break;
+                    }
+                }
+
+                FREE(cleanedFormat);
+
                 if ((ierr != 0) && (ierr != EOF))
                 {
                     dValues[i] = dValue;
diff --git a/scilab/modules/fileio/tests/nonreg_tests/bug_14187.dia.ref b/scilab/modules/fileio/tests/nonreg_tests/bug_14187.dia.ref
new file mode 100644 (file)
index 0000000..b27c4da
--- /dev/null
@@ -0,0 +1,24 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 14187 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=14187
+//
+// <-- Short Description -->
+// fscanfMat can not read formats %d, %f and %i
+fd = mopen(TMPDIR + "/Mat", "w");
+mfprintf(fd, "1 2\n");
+mfprintf(fd, "3 4\n");
+mclose(fd);
+assert_checkequal(fscanfMat(TMPDIR + "/Mat"), [1 2; 3 4]);
+assert_checkequal(fscanfMat(TMPDIR + "/Mat","%d"), [1 2; 3 4]);
+assert_checkequal(fscanfMat(TMPDIR + "/Mat","%i"), [1 2; 3 4]);
+assert_checkequal(fscanfMat(TMPDIR + "/Mat","%f"), [1 2; 3 4]);
diff --git a/scilab/modules/fileio/tests/nonreg_tests/bug_14187.tst b/scilab/modules/fileio/tests/nonreg_tests/bug_14187.tst
new file mode 100644 (file)
index 0000000..e3462ed
--- /dev/null
@@ -0,0 +1,26 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 14187 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=14187
+//
+// <-- Short Description -->
+// fscanfMat can not read formats %d, %f and %i
+
+fd = mopen(TMPDIR + "/Mat", "w");
+mfprintf(fd, "1 2\n");
+mfprintf(fd, "3 4\n");
+mclose(fd);
+
+assert_checkequal(fscanfMat(TMPDIR + "/Mat"), [1 2; 3 4]);
+assert_checkequal(fscanfMat(TMPDIR + "/Mat","%d"), [1 2; 3 4]);
+assert_checkequal(fscanfMat(TMPDIR + "/Mat","%i"), [1 2; 3 4]);
+assert_checkequal(fscanfMat(TMPDIR + "/Mat","%f"), [1 2; 3 4]);