* Bug #10816 fixed - Allow the usage of the '$' keyword in the part function. 96/12396/7
Samuel Gougeon [Sat, 31 Aug 2013 11:39:37 +0000 (13:39 +0200)]
Change-Id: Ic20bfbd9b5dcdcfb6a026da61e32beee8078d3a5

scilab/CHANGES_5.5.X
scilab/modules/string/help/en_US/part.xml
scilab/modules/string/macros/%ip_part.sci [new file with mode: 0644]
scilab/modules/string/macros/%p_part.sci [new file with mode: 0644]
scilab/modules/string/tests/unit_tests/part.dia.ref
scilab/modules/string/tests/unit_tests/part.tst

index 504d607..97433a9 100644 (file)
@@ -51,6 +51,8 @@ BDF methods with direct and preconditioned Krylov linear solvers, from ODEPACK.
 
 * Switch to the CeCILL 2.1 license
 
+* Allow the usage of the '$' keyword in the part function.
+
 
 Syntax changes
 ===============
index f3a84de..56d4c77 100644 (file)
@@ -2,7 +2,8 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) INRIA - 
- * 
+ * Copyright (C) Samuel GOUGEON - 2013 : $ is now supported. More examples.
+ *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
  * you should have received as part of this distribution.  The terms
@@ -13,7 +14,7 @@
 <refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns5="http://www.w3.org/1999/xhtml" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xml:id="part" xml:lang="en">
     <refnamediv>
         <refname>part</refname>
-        <refpurpose>extraction of strings</refpurpose>
+        <refpurpose>string built from extracted characters</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>Calling Sequence</title>
@@ -31,7 +32,9 @@
             <varlistentry>
                 <term>v</term>
                 <listitem>
-                    <para>an integer row vector.</para>
+                    <para>
+                        an integer row vector. <literal>$</literal> is accepted and means length(strings_in)
+                    </para>
                 </listitem>
             </varlistentry>
         </variablelist>
     <refsection>
         <title>Examples</title>
         <programlisting role="example"><![CDATA[
-// returns characters position 8 to 11
-part("How to use ""part"" ?",8:11)
+// Returns characters position 8 to 11
+part("How to use ""part"" ?", 8:11)
 
-// returns characters position 2 to 4 for each element
-// no characters replaced by ''
-c = part(['a','abc','abcd'],2:4)
+// Returns characters position 2 to 4 for each element
+// No characters replaced by ''
+c = part(['a', 'abc', 'abcd'], 2:4)
 
-// returns character position 1 for each element and add characters position
+// Returns character position 1 for each element and add characters position
 // 4 to 7 of each element
-c = part(['abcdefg','hijklmn','opqrstu'],[1,4:7]);
+c = part(['abcdefg', 'hijklmn', 'opqrstu'], [1, 4:7]);
 
-// returns character 4 for each element, add characters position 1 to 7 and
+// Returns character 4 for each element, add characters position 1 to 7 and
 // add character position 4 for each element
-c = part(['abcdefg','hijklmn','opqrstu'],[4,1:7,4]);
+c = part(['abcdefg', 'hijklmn', 'opqrstu'], [4, 1:7, 4]);
 
-// returns character position 1, add again character position 1 and
+// Returns character position 1, add again character position 1 and
 // character position 2
-c=part(['a','abc','abcd'],[1,1,2])
+c=part(['a', 'abc', 'abcd'], [1, 1, 2])
+
+
+part(['a', 'abc', 'abcd'], [1])                // =>  ['a' 'a' 'a']
+part(['a', 'abc', 'abcd'], [1, 1])             // =>  ['aa' 'aa' 'aa']
+part(['a', 'abc', 'abcd'], [1, 1, 2])  // =>  ['aa' 'aab' 'aab']
+
+// Repeating a character N times:
+N = 10; part('-', ones(1:N))           // => '----------'
 
-// a a a
-part(['a','abc','abcd'],[1])
+// Repeating a pattern N times:
+N = 6; pat = '- '; 
+part(pat, ones(1:N).*.(1:length(pat))) // => '- - - - - - '
 
-// aa aa aa
-part(['a','abc','abcd'],[1,1])
+// Using $ = implicit length of strings: 
+// 1)
+part(['a string' 'another longer one'], $-2:$ ) // => [ 'ing' 'one']
 
-// aa aab aab
-part(['a','abc','abcd'],[1,1,2])
+// 2) Another implementation for strrev():
+part('Hello world', $:-1:1)              // => 'dlrow olleH'
+
+// 3) With unranging $:
+part('Hello world', [ $ 4:5 ])   // => 'dlo'
+
+// 4) Mixing scalar or unrangin $ with ranging ones is not possible:
+part("Hello", [ 1 $-1:$ $ ])      // =>  error
     ]]></programlisting>
     </refsection>
     <refsection role="see also">
@@ -97,4 +116,16 @@ part(['a','abc','abcd'],[1,1,2])
             </member>
         </simplelist>
     </refsection>
+    
+    <refsection>
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.5.0</revnumber>
+                <revremark>
+                    <literal>$</literal> standing for length(input_strings) is now accepted in indices of selected characters
+                </revremark>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
diff --git a/scilab/modules/string/macros/%ip_part.sci b/scilab/modules/string/macros/%ip_part.sci
new file mode 100644 (file)
index 0000000..8c5daee
--- /dev/null
@@ -0,0 +1,41 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) - 2013 - Samuel GOUGEON
+//
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution.  The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+
+function r = %ip_part(txt, s)
+    // Allows calls such as: part(txt, $:-1:1)  // (== strrev() )
+    // Calls with unranging $ are not supported => define %p_part()
+    // txt may be a matrix of texts with different lengths
+    //  => $ might not have the same value for all of them
+
+    //check s
+    if ~checkip(s) then
+        msg = _("%s: Wrong value for input argument #%d: $ expected.\n", 2);
+        error(msprintf(msg,"part"))
+    end
+
+    L = length(txt)
+    U = unique(L)
+    r = emptystr(txt)
+    for u = U(:)'
+        j = 1:u
+        k = find(L==u)
+        r(k) = part(txt(k), j(s))
+    end
+endfunction
+
+function b = checkip(p)
+    b = checkvar(p(1)) & checkvar(p(2)) & checkvar(p(3));
+endfunction
+
+function b = checkvar(p)
+    b = %t;
+    if typeof(p) == "polynomial" & varn(p) ~= "$" then
+        b = %f;
+    end
+endfunction
diff --git a/scilab/modules/string/macros/%p_part.sci b/scilab/modules/string/macros/%p_part.sci
new file mode 100644 (file)
index 0000000..7495c0b
--- /dev/null
@@ -0,0 +1,29 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) - 2013 - Samuel GOUGEON
+//
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution.  The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+
+function r = %p_part(txt, s)
+    // Allows calls such as: part(txt, [ 2 $ 3:4 $-1])
+    //  with un-ranging implicit size $ standing for length(txt)
+    // Calls with ranging $ (ex: 3:$ ) are implemented with %ip_part()
+    //
+    // txt may be a matrix of texts with different lengths
+    //  => $ might have not the same value for all elements of txt.
+    if varn(s)~="$" then
+        msg = _("%s: $ is the only implicit variable supported in selected indices")
+        error(msprintf(msg,"part"))
+    end
+    L = length(txt)
+    U = unique(L)
+    r = emptystr(txt)
+    for u = U(:)'
+        j = 1:u
+        k = find(L==u)
+        r(k) = part(txt(k), horner(s(:)',u))
+    end
+endfunction
index 8c4190e..a81913e 100644 (file)
@@ -43,3 +43,20 @@ if or(part(['abc';'x'],[1,2])<>['ab';'x ']) then bugmes();quit;end
 if or(part(['abc';'x'],[1;1])<>['aa';'xx']) then bugmes();quit;end
 if or(part(['abc';'x'],[1;2])<>['ab';'x ']) then bugmes();quit;end
 //===============================
+a=part(['a','abc','abcd'],[1]);
+assert_checkequal(a,['a','a','a']);
+a=part(['a','abc','abcd'],[1,1]);
+assert_checkequal(a,['aa','aa','aa']);
+a=part(['a','abc','abcd'],[1,1,2]);
+assert_checkequal(a,['aa ','aab','aab']);
+N = 10; a=part('-',ones(1:N));
+assert_checkequal(a,"----------");
+N = 6; pat = '- ';
+a=part(pat, ones(1:N).*.(1:length(pat)));
+assert_checkequal(a,"- - - - - - ");
+a=part(['a string'  'another longer one'], $-2:$ );
+assert_checkequal(a,["ing","one"]);
+a=part('Hello world', $:-1:1);
+assert_checkequal(a,"dlrow olleH");
+a=part('Hello world', [ $ 5:6 ]);
+assert_checkequal(a,"do ");
index d8451c7..211ca93 100644 (file)
@@ -10,8 +10,8 @@
 //===============================
 // unit tests part
 //===============================
-EMPTY_STR = '';
-BLANK = ' ';
+EMPTY_STR = "";
+BLANK = " ";
 //===============================
 s = part(EMPTY_STR ,[]);
 if (s <> EMPTY_STR ) then pause,end
@@ -21,28 +21,54 @@ N = 50;
 s = part(EMPTY_STR ,N);
 if (s <> BLANK) then pause,end
 //===============================
-s = part(['a','abc','abcd'],[1,1,2]);
-if (s <> ['aa','aab','aab']) then pause,end
+s = part(["a","abc","abcd"],[1,1,2]);
+if (s <> ["aa","aab","aab"]) then pause,end
 //===============================
-s1 = part(['a','abc','abcd'],[2,4,6]);
-s2 = part(['a','abc','abcd'],[2,4,5]);
+s1 = part(["a","abc","abcd"],[2,4,6]);
+s2 = part(["a","abc","abcd"],[2,4,5]);
 if (s1 <> s2)  then pause,end
-if (s1 <> ['   ','b','bd']) then pause,end
+if (s1 <> ["   ","b","bd"]) then pause,end
 //===============================
 N = 20;
 s = part(" ",ones(1,N));
 if (blanks(N) <> s) then pause,end
 //===============================
-if part('abc',1)<>'a' then pause,end
-if part('abc',[1 1])<>'aa' then pause,end
-if part('abc',[1;1])<>'aa' then pause,end
-if part('abc',[])<>emptystr() then pause,end
-if part('abc',5)<>BLANK then pause,end
-if part('abc',5:6)<>'  ' then pause,end
-if or(part(['abc';'x'],1)<>['a';'x']) then pause,end
-if or(part(['abc';'x'],[1,1])<>['aa';'xx']) then pause,end
-if or(part(['abc';'x'],[1,2])<>['ab';'x ']) then pause,end
-if or(part(['abc';'x'],[1;1])<>['aa';'xx']) then pause,end
-if or(part(['abc';'x'],[1;2])<>['ab';'x ']) then pause,end
+if part("abc",1)<>"a" then pause,end
+if part("abc",[1 1])<>"aa" then pause,end
+if part("abc",[1;1])<>"aa" then pause,end
+if part("abc",[])<>emptystr() then pause,end
+if part("abc",5)<>BLANK then pause,end
+if part("abc",5:6)<>"  " then pause,end
+if or(part(["abc";"x"],1)<>["a";"x"]) then pause,end
+if or(part(["abc";"x"],[1,1])<>["aa";"xx"]) then pause,end
+if or(part(["abc";"x"],[1,2])<>["ab";"x "]) then pause,end
+if or(part(["abc";"x"],[1;1])<>["aa";"xx"]) then pause,end
+if or(part(["abc";"x"],[1;2])<>["ab";"x "]) then pause,end
 //===============================
 
+
+
+a=part(["a","abc","abcd"],[1]);
+assert_checkequal(a,["a","a","a"]);
+
+a=part(["a","abc","abcd"],[1,1]);
+assert_checkequal(a,["aa","aa","aa"]);
+
+a=part(["a","abc","abcd"],[1,1,2]);
+assert_checkequal(a,["aa ","aab","aab"]);
+
+N = 10; a=part("-",ones(1:N));
+assert_checkequal(a,"----------");
+
+N = 6; pat = "- ";
+a=part(pat, ones(1:N).*.(1:length(pat)));
+assert_checkequal(a,"- - - - - - ");
+
+a=part(["a string"  "another longer one"], $-2:$ );
+assert_checkequal(a,["ing","one"]);
+
+a=part("Hello world", $:-1:1);
+assert_checkequal(a,"dlrow olleH");
+a=part("Hello world", [ $ 5:6 ]);
+assert_checkequal(a,"do ");
+