fix sprintf to take care of %%
[scilab.git] / scilab / modules / output_stream / sci_gateway / cpp / sci_msprintf.cpp
index a1356c2..1b8221a 100644 (file)
@@ -54,7 +54,8 @@ types::Callable::ReturnValue sci_msprintf(types::typed_list &in, int _iRetCount,
 
     wchar_t* pwstInput = in[0]->getAs<types::String>()->get()[0];
     int iNumberPercent = 0;
-    for (int i = 0 ; i < wcslen(pwstInput) ; i++)
+    int iNumberPercentPercent = 0;
+    for (int i = 0; i < wcslen(pwstInput); i++)
     {
         if (pwstInput[i] == L'%')
         {
@@ -62,7 +63,7 @@ types::Callable::ReturnValue sci_msprintf(types::typed_list &in, int _iRetCount,
             if (pwstInput[i + 1] == L'%')
             {
                 //it is a %%, not a %_
-                iNumberPercent--;
+                iNumberPercentPercent++;
                 //force incremantation to bypass the second % of %%
                 i++;
             }
@@ -70,7 +71,7 @@ types::Callable::ReturnValue sci_msprintf(types::typed_list &in, int _iRetCount,
     }
 
     //Input values must be less or equal than excepted
-    if ((in.size() - 1) > iNumberPercent)
+    if ((in.size() - 1) > iNumberPercent - iNumberPercentPercent)
     {
         Scierror(999, _("%s: Wrong number of input arguments: at most %d expected.\n"), "msprintf", iNumberPercent);
         return types::Function::Error;
@@ -94,7 +95,7 @@ types::Callable::ReturnValue sci_msprintf(types::typed_list &in, int _iRetCount,
         }
     }
 
-    if (iNumberCols != iNumberPercent)
+    if (iNumberCols != iNumberPercent - iNumberPercentPercent)
     {
         Scierror(999, _("%s: Wrong number of input arguments: data doesn't fit with format.\n"), "msprintf");
         return types::Function::Error;
@@ -102,7 +103,7 @@ types::Callable::ReturnValue sci_msprintf(types::typed_list &in, int _iRetCount,
 
 
     //fill ArgumentPosition structure
-    pArgs = new ArgumentPosition[iNumberPercent];
+    pArgs = new ArgumentPosition[iNumberPercent - iNumberPercentPercent];
     int idx = 0;
     for (int i = 1 ; i < in.size() ; i++)
     {