* Bug 15974 fixed: msprintf("%d", %nan) does not return Nan 76/20876/6
Antoine ELIAS [Fri, 22 Feb 2019 08:21:53 +0000 (09:21 +0100)]
http://bugzilla.scilab.org/15974

Change-Id: I2bc0a66e429d732afb884121ec9a6195d4088a90

scilab/CHANGES.md
scilab/modules/output_stream/src/cpp/scilab_sprintf.cpp
scilab/modules/output_stream/tests/nonreg_tests/bug_15974.dia.ref [new file with mode: 0644]
scilab/modules/output_stream/tests/nonreg_tests/bug_15974.tst [new file with mode: 0644]

index 9a9afbe..92e3dfe 100644 (file)
@@ -128,7 +128,7 @@ User Interface improvements:
 ----------------------------
 
 * The `ans` variable is editable as any other variable
-* Commands history is saved *before* executing a command to have the correct history on crash.
+* Commands history is saved before executing a command to have the correct history on crash.
 * Used memory per variable is displayed by BrowserVar to give the user numbers on memory usage repartition and let the user `clear` the big ones first.
 
 Xcos
@@ -206,6 +206,7 @@ Bug Fixes
 * [#15812](http://bugzilla.scilab.org/show_bug.cgi?id=15812): On assigning variables the source variable may become become corrupted
 * [#15840](http://bugzilla.scilab.org/show_bug.cgi?id=15840): `grand(1,"prm",m)` yielded an unsqueezed size([size(m) 1]) hypermatrix
 * [#15964](http://bugzilla.scilab.org/show_bug.cgi?id=15954): A complex empty sparse matrix could be obtained after insertion.
+* [#15974](http://bugzilla.scilab.org/show_bug.cgi?id=15974): `msprintf("%d", %nan)` did not return Nan
 * [#15983](http://bugzilla.scilab.org/show_bug.cgi?id=15983): `group()` regressed in 5.5.2 due to a too intrusive fix.
 * [#15984](http://bugzilla.scilab.org/show_bug.cgi?id=15984): display scale was wrong with Retina dispplays on OSX..
 * [#15995](http://bugzilla.scilab.org/show_bug.cgi?id=15995): patch was missing in surface plot (regression)
index 0e6bbe7..66d12e5 100644 (file)
@@ -35,7 +35,7 @@ extern "C"
 }
 
 static wchar_t* replaceAndCountLines(const wchar_t* _pwstInput, int* _piLines, int* _piNewLine);
-static wchar_t* addl(TokenDef* token);
+static wchar_t* replace_with_ls(TokenDef* token);
 static void updatel(TokenDef* token);
 static void replace_lu_llu(TokenDef* token);
 static void replace_ld_lld(TokenDef* token);
@@ -439,7 +439,7 @@ wchar_t** scilab_sprintf(const std::string& funcname, const wchar_t* _pwstInput,
                     }
                     else
                     {
-                        wchar_t* newToken = addl(tok);
+                        wchar_t* newToken = replace_with_ls(tok);
 
                         if (std::isnan(dblVal))
                         {
@@ -494,7 +494,7 @@ wchar_t** scilab_sprintf(const std::string& funcname, const wchar_t* _pwstInput,
                     }
                     else
                     {
-                        wchar_t* newToken = addl(tok);
+                        wchar_t* newToken = replace_with_ls(tok);
 
                         if (std::isnan(dblVal))
                         {
@@ -552,7 +552,7 @@ wchar_t** scilab_sprintf(const std::string& funcname, const wchar_t* _pwstInput,
                     }
                     else
                     {
-                        wchar_t* newToken = addl(tok);
+                        wchar_t* newToken = replace_with_ls(tok);
 
                         if (std::isnan(dblVal))
                         {
@@ -788,7 +788,7 @@ static wchar_t* replaceAndCountLines(const wchar_t* _pwstInput, int* _piLines, i
     return pwstFirstOutput;
 }
 /*--------------------------------------------------------------------------*/
-static wchar_t* addl(TokenDef* token)
+static wchar_t* replace_with_ls(TokenDef* token)
 {
     //replace %s or %c by %ls or %lc to wide char compatibility
     int iPos = token->typePos;
@@ -797,7 +797,7 @@ static wchar_t* addl(TokenDef* token)
 
     wcsncpy(pwstToken, token->pwstToken, iPos);
     pwstToken[iPos] = L'l';
-    pwstToken[iPos + 1] = token->pwstToken[iPos];
+    pwstToken[iPos + 1] = L's';
     wcsncpy(&pwstToken[iPos + 2], token->pwstToken + iPos + 1, sizeTotal - (iPos + 1));
     pwstToken[sizeTotal + 1] = L'\0';
 
@@ -806,7 +806,7 @@ static wchar_t* addl(TokenDef* token)
 /*--------------------------------------------------------------------------*/
 static void updatel(TokenDef* token)
 {
-    wchar_t* newToken = addl(token);
+    wchar_t* newToken = replace_with_ls(token);
     delete[] token->pwstToken;
     token->pwstToken = newToken;
 }
diff --git a/scilab/modules/output_stream/tests/nonreg_tests/bug_15974.dia.ref b/scilab/modules/output_stream/tests/nonreg_tests/bug_15974.dia.ref
new file mode 100644 (file)
index 0000000..dd1660c
--- /dev/null
@@ -0,0 +1,34 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2019 - ESI - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 15974 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/15974
+//
+// <-- Short Description -->
+// msprintf(*, %nan) doesn't return Nan
+mprintf("%f\n",%inf)
+Inf
+mprintf("%f\n",-%inf)
+-Inf
+mprintf("%f\n",%nan)
+Nan
+mfprintf(6,"%f\n",%inf)
+Inf
+mfprintf(6,"%f\n",-%inf)
+-Inf
+mfprintf(6,"%f\n",%nan)
+Nan
+infStr = msprintf("%f",%inf);
+minusInfStr = msprintf("%f",-%inf);
+nanStr = msprintf("%f",%nan);
+assert_checkequal(infStr,"Inf");
+assert_checkequal(minusInfStr,"-Inf");
+assert_checkequal(nanStr,"Nan");
diff --git a/scilab/modules/output_stream/tests/nonreg_tests/bug_15974.tst b/scilab/modules/output_stream/tests/nonreg_tests/bug_15974.tst
new file mode 100644 (file)
index 0000000..4656ef6
--- /dev/null
@@ -0,0 +1,32 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2019 - ESI - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 15974 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/15974
+//
+// <-- Short Description -->
+// msprintf(*, %nan) doesn't return Nan
+
+mprintf("%f\n",%inf)
+mprintf("%f\n",-%inf)
+mprintf("%f\n",%nan)
+
+mfprintf(6,"%f\n",%inf)
+mfprintf(6,"%f\n",-%inf)
+mfprintf(6,"%f\n",%nan)
+
+infStr = msprintf("%f",%inf);
+minusInfStr = msprintf("%f",-%inf);
+nanStr = msprintf("%f",%nan);
+
+assert_checkequal(infStr,"Inf");
+assert_checkequal(minusInfStr,"-Inf");
+assert_checkequal(nanStr,"Nan");