* Bug 15206 fixed: now Windows default mopen write mode is binary 88/20688/4
St├ęphane Mottelet [Thu, 10 Jan 2019 17:24:51 +0000 (18:24 +0100)]
http://bugzilla.scilab.org/show_bug.cgi?id=15206

Although the doc is quite clear about this point:

----
In addition, the following characters can be used to specify the type
of file:
t
 text file.
b
 binary file (default).
---

mopen() code missed the fact that Windows uses by default
text mode with LF <-> CR+LF translation.

Change-Id: I8808aea04683031a629a562cc27c3bc10e3a8016

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

index d221f30..aa2b4ac 100644 (file)
@@ -811,6 +811,7 @@ Known issues
 * [#15188](http://bugzilla.scilab.org/show_bug.cgi?id=15188): `sci_hdf5_is_file` was wrongly named in the hdf5 DLL.
 * [#15199](http://bugzilla.scilab.org/show_bug.cgi?id=15199): Scilab crashed when using `fsolve` for functions containing other functions.
 * [#15205](http://bugzilla.scilab.org/show_bug.cgi?id=15205): `get_scicos_version` returned the previous version.
+* [#15206](http://bugzilla.scilab.org/show_bug.cgi?id=15206): Windows default `mopen` read/write mode was text instead of binary.
 * [#15207](http://bugzilla.scilab.org/show_bug.cgi?id=15207): `xcos(scs_m)` did not work for sub-systems.
 * [#15215](http://bugzilla.scilab.org/show_bug.cgi?id=15215): `strcat` did not work correctly with empty strings.
 * [#15223](http://bugzilla.scilab.org/show_bug.cgi?id=15223): `call` crashed in some cases.
index 0ce464d..db97569 100644 (file)
@@ -68,9 +68,29 @@ int mopen(const wchar_t* _pstFilename, const wchar_t* _pstMode, int _iSwap, int*
         return MOPEN_INVALID_STATUS;
     }
 
+    // Bug #15206, default binary mode has to be enforced in write mode under Windows
+    wchar_t _pstFinalMode[4] = {_pstMode[0], L'b', L'\0', L'\0'};
+    bool bModeSet = false;
+
     for ( testRep = 1; testRep < lenChar ; testRep++ )
     {
-        if (( _pstMode[testRep] != '+' ) && ( _pstMode[testRep] != 'b' ) && ( _pstMode[testRep] != 't' ))
+        if (_pstMode[testRep] == L'b' || _pstMode[testRep] == L't')
+        {
+            if (bModeSet == false)
+            {
+                _pstFinalMode[1] = _pstMode[testRep];
+                bModeSet = true;
+            }
+            else
+            {
+                return MOPEN_INVALID_STATUS;
+            }
+        }
+        else if (_pstMode[testRep] == L'+')
+        {
+            _pstFinalMode[2] = L'+';
+        }
+        else
         {
             return MOPEN_INVALID_STATUS;
         }
@@ -81,7 +101,7 @@ int mopen(const wchar_t* _pstFilename, const wchar_t* _pstMode, int _iSwap, int*
         return MOPEN_CAN_NOT_OPEN_FILE;
     }
 
-    FILE* pF = os_wfopen(_pstFilename, _pstMode);
+    FILE* pF = os_wfopen(_pstFilename, _pstFinalMode);
     if (pF == NULL)
     {
         return MOPEN_CAN_NOT_OPEN_FILE;
@@ -92,7 +112,7 @@ int mopen(const wchar_t* _pstFilename, const wchar_t* _pstMode, int _iSwap, int*
     pFile->setFileDesc(pF);
     pFile->setFilename(_pstFilename);
     pFile->setFileType(2); //hard coded value for file opened by C/C++ fopen functions
-    pFile->setFileMode(_pstMode);
+    pFile->setFileMode(_pstFinalMode);
     pFile->setFileSwap(_iSwap);
 
     *_piID = FileManager::addFile(pFile);
diff --git a/scilab/modules/fileio/tests/nonreg_tests/bug_15206.tst b/scilab/modules/fileio/tests/nonreg_tests/bug_15206.tst
new file mode 100644 (file)
index 0000000..ff19075
--- /dev/null
@@ -0,0 +1,27 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2019 - St├ęphane MOTTELET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+// <-- WINDOWS ONLY -->
+//
+// <-- Non-regression test for bug 15206 -->
+//
+// <-- Bugzilla URL -->
+// https://bugzilla.scilab.org/show_bug.cgi?id=15206
+//
+// <-- Short Description -->
+// wrong writing with mput
+
+filename = fullfile(TMPDIR,'test.bin');
+fid = mopen(filename,'w+');
+mput (int16([1:10]), 's', fid ) ;
+offset = mtell(fid) ;
+mclose(fid);
+deletefile(filename);
+assert_checkequal(offset,20);
+