Bug #14012 fixed - String: added a flag to remove either leading or trailing or both... 12/19012/5
Siddhartha Gairola [Mon, 23 Jan 2017 17:30:09 +0000 (22:30 +0530)]
Change-Id: I979b44c5c8db9b1c05af3e96bab1d1a4f45c6015

scilab/CHANGES.md
scilab/modules/string/help/en_US/stripblanks.xml
scilab/modules/string/sci_gateway/cpp/sci_stripblanks.cpp
scilab/modules/string/src/cpp/stripblanks.cpp
scilab/modules/string/src/cpp/stripblanks.hxx
scilab/modules/string/tests/nonreg_tests/bug_14012.tst [new file with mode: 0644]

index 6291230..397a0e0 100644 (file)
@@ -207,6 +207,7 @@ or a 3-components vector to set the position in axes coordinates to draw the dat
 * `getPreferencesValue` can now read a tag having multiple occurrences, and accepts the path to a preferences file instead of its XML handle.
 * atomsSetConfig does not update cache.
 * lqi function added to compute "linear quadratic integral compensator".
+* The function `stripblanks` now supports an option to remove trailing or leading spaces or both.
 
 
 Help pages:
@@ -550,6 +551,7 @@ Bug Fixes
 * [#13986](http://bugzilla.scilab.org/show_bug.cgi?id=13986): `setdefaultlanguage` did not set value correctly in Windows registry.
 * [#13990](http://bugzilla.scilab.org/show_bug.cgi?id=13990): `gettext` did not manage the added `_W` macro.
 * [#13999](http://bugzilla.scilab.org/show_bug.cgi?id=13999): `editor` was modal. It locked the console using an external editor.
+* [#14012](http://bugzilla.scilab.org/show_bug.cgi?id=14012): Function `stripblanks` did not allow to remove only leading spaces of a set of strings, or only trailing one. An option to do so was added.
 * [#14020](http://bugzilla.scilab.org/show_bug.cgi?id=14020): Incorrect carriage return ascii code.
 * [#14022](http://bugzilla.scilab.org/show_bug.cgi?id=14022): `getscilabkeywords` was KO (+gateway what() added).
 * [#14023](http://bugzilla.scilab.org/show_bug.cgi?id=14023): It was not possible to concatenate cells.
index 3538956..f72e470 100644 (file)
@@ -1,69 +1,99 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
- * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) INRIA -
- *
- * Copyright (C) 2012 - 2016 - Scilab Enterprises
- *
- * This file is hereby licensed under the terms of the GNU GPL v2.0,
- * pursuant to article 5.3.4 of the CeCILL v.2.1.
- * This file was originally licensed under the terms of the CeCILL v2.1,
- * and continues to be available under such terms.
- * For more information, see the COPYING file which you should have received
- * along with this program.
- *
- -->
+* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+* Copyright (C) INRIA -
+*
+* Copyright (C) 2012 - 2016 - Scilab Enterprises
+*
+* This file is hereby licensed under the terms of the GNU GPL v2.0,
+* pursuant to article 5.3.4 of the CeCILL v.2.1.
+* This file was originally licensed under the terms of the CeCILL v2.1,
+* and continues to be available under such terms.
+* For more information, see the COPYING file which you should have received
+* along with this program.
+*
+-->
 <refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:lang="en" xml:id="stripblanks">
     <refnamediv>
         <refname>stripblanks</refname>
         <refpurpose>
-            strips / trims leading and trailing
+            strips / trims leading or trailing or both
             blanks (and tabs) of strings
         </refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>Syntax</title>
-        <synopsis>txt = stripblanks(txt[,tabs])</synopsis>
+        <synopsis>
+            Txtout = stripblanks(Txt)
+            Txtout = stripblanks(Txt, notabs)
+            Txtout = stripblanks(Txt, notabs, trimloc)
+        </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Arguments</title>
         <variablelist>
             <varlistentry>
-                <term>txt</term>
+                <term>Txt, Txtout</term>
                 <listitem>
                     <para>
-                        a character string or matrix of character strings.
+                        Texts or matrices of texts, with size(Txtout)==size(Txt).
                     </para>
                 </listitem>
             </varlistentry>
             <varlistentry>
-                <term>tabs</term>
+                <term>notabs</term>
                 <listitem>
                     <para>
                         a boolean, if <constant>%t</constant> then tabs are also stripped (default value is <constant>%f</constant>).
                     </para>
                 </listitem>
             </varlistentry>
+            <varlistentry>
+                <term>trimloc</term>
+                <listitem>
+                    <para>
+                        an argument which, if trimloc = -1 remove only leading spaces, if trimloc = 1 remove only trailing spaces.
+                        default value is 0, which trims both the leading and trailing spaces.
+                    </para>
+                </listitem>
+            </varlistentry>
         </variablelist>
     </refsection>
     <refsection>
         <title>Description</title>
         <para>
-            The <function>stripblanks</function> function strips / trims leading and trailing blanks (and tabs) of strings.
+            The <function>stripblanks</function> function strips / trims leading or trailing or both blanks (and tabs) of strings.
         </para>
     </refsection>
     <refsection>
         <title>Examples</title>
         <programlisting role="example"><![CDATA[
-a='  123   ';
-'!'+a+'!'
-'!'+stripblanks(a)+'!'
-a=['  123   ',' xyz']
-strcat(stripblanks(a))
+            a='  123   ';
+            '!'+a+'!'
+            '!'+stripblanks(a)+'!'
+            a=['  123   ',' xyz']
+            stripblanks(a)
+
+            a = msprintf("\t  \tHello world!\t\t")
+            stripblanks(a,%f)
+            stripblanks(a,%t)
 
-a = msprintf("\t  \tHello world!\t\t")
-strcat(stripblanks(a,%f)+'?')
-strcat(stripblanks(a,%t)+'?')
- ]]></programlisting>
+            a = '    hello    ';
+            '|'+a+'|'
+            '|'+stripblanks(a,%t,-1)+'|'
+            '|'+stripblanks(a,%t,0)+'|'
+            '|'+stripblanks(a,%t,1)+'|'
+            ]]></programlisting>
+    </refsection>
+    <refsection>
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.0</revnumber>
+                <revremark>
+                    New input trimloc added to remove trailing, leading or both spaces.
+                </revremark>
+            </revision>
+        </revhistory>
     </refsection>
 </refentry>
index 83e7312..46d76ad 100644 (file)
@@ -3,6 +3,7 @@
 *  Copyright (C) 2010 - DIGITEO - Allan CORNET
 *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ * Copyright (C) 2017 Siddhartha Gairola
  *
  * This file is hereby licensed under the terms of the GNU GPL v2.0,
  * pursuant to article 5.3.4 of the CeCILL v.2.1.
@@ -25,17 +26,18 @@ extern "C"
 {
 #include "localization.h"
 #include "Scierror.h"
-};
+}
 /*--------------------------------------------------------------------------*/
 types::Function::ReturnValue sci_stripblanks(types::typed_list &in, int _iRetCount, types::typed_list &out)
 {
 #define FUNCNAME "stripblanks"
     bool bRemoveTab = false;
+    double  flag = 0;
 
     // check input parameters
-    if (in.size() < 1 || in.size() > 2)
+    if (in.size() < 1 || in.size() > 3)
     {
-        Scierror(999, _("%s: Wrong number of input arguments: %d or %d expected.\n"), FUNCNAME, 1, 2);
+        Scierror(999, _("%s: Wrong number of input arguments: %d to %d expected.\n"), FUNCNAME, 1, 3);
         return types::Function::Error;
     }
 
@@ -46,9 +48,9 @@ types::Function::ReturnValue sci_stripblanks(types::typed_list &in, int _iRetCou
         return types::Function::Error;
     }
 
-    if (in.size() == 2)
+    if (in.size() > 1)
     {
-        if (in[1]->isBool() == false || in[1]->getAs<types::Bool>()->getSize() != 1)
+        if (in[1]->isBool() == false || in[1]->getAs<types::Bool>()->isScalar() == false)
         {
             Scierror(999, _("%s: Wrong type for input argument #%d: A boolean expected.\n"), FUNCNAME, 2);
             return types::Function::Error;
@@ -60,11 +62,32 @@ types::Function::ReturnValue sci_stripblanks(types::typed_list &in, int _iRetCou
         }
     }
 
+    if (in.size() == 3)
+    {
+        if (in[2]->isDouble() == false || in[2]->getAs<types::Double>()->isScalar() == false) 
+        {
+
+            Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), FUNCNAME, 2);
+            return types::Function::Error;
+
+        }
+
+        flag = in[2]->getAs<types::Double>()->get()[0];
+
+        if (floor(flag) != flag || (flag != 0.0 && flag != 1.0 && flag != -1.0)) 
+        {
+
+            Scierror(999, _("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"), FUNCNAME, 3, "-1, 0, 1");
+            return types::Function::Error;
+        }
+
+    }
+
     switch (in[0]->getType())
     {
         case types::InternalType::ScilabString:
         {
-            types::String *pS = stripblanks(in[0]->getAs<types::String>(), bRemoveTab);
+            types::String *pS = stripblanks(in[0]->getAs<types::String>(), bRemoveTab, static_cast<int>(flag));
             if (pS == NULL)
             {
                 Scierror(999, _("%s : No more memory.\n"), FUNCNAME);
@@ -72,8 +95,8 @@ types::Function::ReturnValue sci_stripblanks(types::typed_list &in, int _iRetCou
             }
 
             out.push_back(pS);
+            break;
         }
-        break;
         case types::InternalType::ScilabDouble://manage []
         {
             if (in[0]->getAs<types::Double>()->getSize() != 0)
@@ -83,11 +106,13 @@ types::Function::ReturnValue sci_stripblanks(types::typed_list &in, int _iRetCou
             }
 
             out.push_back(types::Double::Empty());
+            break;
         }
-        break;
         default:
+        {
             Scierror(999, _("%s: Wrong type for input argument #%d: Matrix of strings or empty matrix expected.\n"), FUNCNAME, 1);
             return types::Function::Error;
+        }
     }
 
     return types::Function::OK;
index b06227c..d2a5104 100644 (file)
@@ -1,9 +1,10 @@
 /*
-* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-*  Copyright (C) 2010 - DIGITEO - Allan CORNET
-*  Copyright (C) 2010 - DIGITEO - Antoine ELIAS
-*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ *  Copyright (C) 2010 - DIGITEO - Allan CORNET
+ *  Copyright (C) 2010 - DIGITEO - Antoine ELIAS
+ *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ * Copyright (C) 2017 - Siddhartha Gairola
  *
  * This file is hereby licensed under the terms of the GNU GPL v2.0,
  * pursuant to article 5.3.4 of the CeCILL v.2.1.
@@ -11,8 +12,8 @@
  * and continues to be available under such terms.
  * For more information, see the COPYING file which you should have received
  * along with this program.
-*
-*/
+ *
+ */
 /*--------------------------------------------------------------------------*/
 #include "stripblanks.hxx"
 
@@ -28,42 +29,48 @@ extern "C"
 /*--------------------------------------------------------------------------*/
 static wchar_t* subwcs(const wchar_t *_pstStr, int _iStartPos, int _iEndPos);
 /*--------------------------------------------------------------------------*/
-types::String * stripblanks(types::String *InputStrings, bool bRemoveTAB)
+types::String * stripblanks(types::String *InputStrings, bool bRemoveTAB, int flag)
 {
-    types::String *pOutputStrings = new types::String(InputStrings->getRows(), InputStrings->getCols());
+    types::String *pOutputStrings = InputStrings->clone();
+    //flag = -1 to remove leading spaces, flag = 1 to remove trailing spaces, flag = 0 to remove both.
     if (pOutputStrings)
     {
-        pOutputStrings->set(InputStrings->get());
-
-        for (int x = 0 ; x < InputStrings->getSize() ; x++)
+        for (int x = 0; x < InputStrings->getSize(); x++)
         {
             wchar_t* pStr = InputStrings->get(x);
-            int iInputStartIndex    = 0;
-            int iInputEndIndex      = (int)wcslen(pStr);
+            int iInputStartIndex = 0;
+            int iInputLength = static_cast<int>(wcslen(pStr));
+            int iInputEndIndex = iInputLength;
 
             /* search character ' ' or TAB from end of the string */
-            for (int i = static_cast<int>(wcslen(pStr) - 1) ; i >= 0 ; i--)
+            if (flag == 1 || flag == 0)
             {
-                if (pStr[i] == BLANK_CHARACTER || (bRemoveTAB == true && pStr[i] == TAB_CHARACTER))
-                {
-                    iInputEndIndex--;
-                }
-                else
+                for (int i = iInputLength - 1; i >= 0; i--)
                 {
-                    break;
+                    if (pStr[i] == BLANK_CHARACTER || (bRemoveTAB == true && pStr[i] == TAB_CHARACTER))
+                    {
+                        iInputEndIndex--;
+                    }
+                    else
+                    {
+                        break;
+                    }
                 }
             }
 
             /* search character ' ' or TAB from beginning of the string */
-            for (int i = 0 ; i < static_cast<int>(wcslen(pStr)) ; i++)
+            if (flag == -1 || flag == 0)
             {
-                if (pStr[i] == BLANK_CHARACTER || (bRemoveTAB == true && pStr[i] == TAB_CHARACTER))
-                {
-                    iInputStartIndex++;
-                }
-                else
+                for (int i = 0; i < iInputLength; i++)
                 {
-                    break;
+                    if (pStr[i] == BLANK_CHARACTER || (bRemoveTAB == true && pStr[i] == TAB_CHARACTER))
+                    {
+                        iInputStartIndex++;
+                    }
+                    else
+                    {
+                        break;
+                    }
                 }
             }
 
@@ -72,6 +79,7 @@ types::String * stripblanks(types::String *InputStrings, bool bRemoveTAB)
             FREE(pwstReplace);
         }
     }
+
     return pOutputStrings;
 }
 /*--------------------------------------------------------------------------*/
index 82ae9cc..9febea8 100644 (file)
@@ -25,7 +25,7 @@
 * @param[in] Bool: remove TAB if get() != 0
 * @return String: output String
 */
-STRING_IMPEXP types::String * stripblanks(types::String *InputStrings, bool bWithTAB);
+STRING_IMPEXP types::String * stripblanks(types::String *InputStrings, bool bWithTAB, int flag);
 
 #endif /* __STRIPBLANKS_HXX__ */
 /*--------------------------------------------------------------------------*/
diff --git a/scilab/modules/string/tests/nonreg_tests/bug_14012.tst b/scilab/modules/string/tests/nonreg_tests/bug_14012.tst
new file mode 100644 (file)
index 0000000..023e20e
--- /dev/null
@@ -0,0 +1,59 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - Siddhartha Gairola
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+
+// <-- Non-regression test for bug 14012 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=14012
+//
+// <-- Short Description -->
+// Now we can also remove leading and trailing spaces or both.
+
+TAB_CHAR = ascii(9);
+
+// Checking default which removes both leading and trailing spaces.
+res1 = stripblanks("    hello    ",%f);
+assert_checkequal(res1, "hello");
+
+// Checking that the end is trimmed.
+res2 = stripblanks("    hello    ",%t, 1);
+assert_checkequal(res2, "    hello");
+
+// Checking that the start is trimmed.
+res3 = stripblanks("    hello    ",%t, -1);
+assert_checkequal(res3, "hello    ");
+
+// Checking that both start and end are trimmed.
+res4 = stripblanks("    hello    ",%t, 0);
+assert_checkequal(res4, "hello");
+
+//Checking that only spaces are removed and not tabs.
+res5 = stripblanks("    hello    "+TAB_CHAR, %f, 0);
+assert_checkequal(res5, "hello    "+TAB_CHAR);
+
+//Checking that only spaces as well as tabs are removed.
+res6 = stripblanks("    hello    "+TAB_CHAR, %t, 0);
+assert_checkequal(res6, "hello");
+
+//Checking that only leading spaces are removed and no tabs.
+res7 = stripblanks("    "+TAB_CHAR+"hello    ", %f, -1);
+assert_checkequal(res7, TAB_CHAR+"hello    ");
+
+//Checking that only trailing spaces are removed and no tabs.
+res8 = stripblanks("    hello"+TAB_CHAR+"    ", %f, 1);
+assert_checkequal(res8, "    hello"+TAB_CHAR);
+
+//Checking that only trailing spaces are removed along with tabs.
+res9 = stripblanks("    hello"+TAB_CHAR+"    ", %t, 1);
+assert_checkequal(res9, "    hello");
+
+//Checking that only leading spaces are removed along with tabs.
+res10 = stripblanks("    "+TAB_CHAR+"hello    ", %t, -1);
+assert_checkequal(res10, "hello    ");