* Bug 16079 fixed: part("",$) & part("",$-1:$+2) failed 66/20966/6
Samuel GOUGEON [Fri, 3 May 2019 16:18:50 +0000 (18:18 +0200)]
  http://bugzilla.scilab.org/16079

Change-Id: If90eb524a2ae5eb2fbb132c67fbbab05dd531503

scilab/CHANGES.md
scilab/modules/string/help/en_US/part.xml
scilab/modules/string/help/pt_BR/part.xml
scilab/modules/string/help/ru_RU/part.xml
scilab/modules/string/macros/%ip_part.sci
scilab/modules/string/macros/%p_part.sci
scilab/modules/string/tests/unit_tests/part.dia.ref [deleted file]
scilab/modules/string/tests/unit_tests/part.tst

index c2b29e4..08c8ef4 100644 (file)
@@ -291,6 +291,7 @@ Bug Fixes
 * [#16071](http://bugzilla.scilab.org/show_bug.cgi?id=16071): `prettyprint(complex(1,%nan))` omitted the "+" in `1 + Nani`. It printed positive exponents with a useless "+". For any input nul polynomial, the string result never included the name of the variable. Default input arguments could not be skipped. ExportFormat was uselessly case-sensitive. For tex|latex: for text input, $ \ % & { } ~ and ^ special characters were not protected ; spaces were not protected, all words were concatenated ; for polynomials and rationals, the result string could be extremely long and not easily wrappable. For MathML: "<" was not protected ; <mi></mi> were missing for text input ; <mtable>, </mtable>, <mtr>, </mtr>, <mtd>, <mfenced> and </mfenced> tags were not wrapped and could not be indented. Delimiters: "" was not documented as possible value ; ")" was wrongly documented. Dynamical linear systems were not documented as possible input.
 * [#16072](http://bugzilla.scilab.org/show_bug.cgi?id=16072): `prettyprint` did not actually support input encoded integers.
 * [#16075](http://bugzilla.scilab.org/show_bug.cgi?id=16075): `prettyprint` was broken for cells.
+* [#16079](http://bugzilla.scilab.org/show_bug.cgi?id=16079): `part("",$)` and `part("",$-1:$+2)` yielded an error instead of returning "" and "  ".
 * [#16085](http://bugzilla.scilab.org/show_bug.cgi?id=16085): insertion in an empty struct was broken.
 * [#16087](http://bugzilla.scilab.org/show_bug.cgi?id=16087): Insertion of struct in a non-empty struct crashed Scilab.
 * [#16089](http://bugzilla.scilab.org/show_bug.cgi?id=16089): x=1:1e10 freezed Scilab.
index 87bc614..3b1fdb3 100644 (file)
  * 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: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">
+<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 characters from strings</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>Syntax</title>
-        <synopsis>[strings_out] = part(strings_in, v)</synopsis>
+        <synopsis>strings_out = part(strings_in, v)</synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Arguments</title>
@@ -29,7 +32,7 @@
             <varlistentry>
                 <term>strings_in</term>
                 <listitem>
-                    <para>a character string or matrix of character string.</para>
+                    <para>a character string or a matrix of character string.</para>
                 </listitem>
             </varlistentry>
             <varlistentry>
@@ -109,7 +112,7 @@ 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:
+// 4) Mixing scalar or unranging $ with ranging ones is not possible:
 part("Hello", [ 1 $-1:$ $ ])       // =>  error
     ]]></programlisting>
     </refsection>
index 786a2c0..5b569f0 100644 (file)
@@ -2,7 +2,7 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) INRIA -
- *
+ * Copyright (C) Samuel GOUGEON - 2013 : $ is now supported. More examples.
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
  * This file is hereby licensed under the terms of the GNU GPL v2.0,
  * 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:ns5="http://www.w3.org/1999/xhtml" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:id="part" xml:lang="pt">
+<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"
+          xmlns:scilab="http://www.scilab.org" xml:id="part" xml:lang="pt">
     <refnamediv>
         <refname>part</refname>
         <refpurpose>extração de strings</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>Seqüência de Chamamento</title>
-        <synopsis>[strings_out] = part(strings_in, v)</synopsis>
+        <synopsis>strings_out = part(strings_in, v)</synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Parâmetros</title>
@@ -34,7 +37,9 @@
             <varlistentry>
                 <term>v</term>
                 <listitem>
-                    <para>vetor linha de inteiros</para>
+                    <para>vetor linha de inteiros.
+                        <literal>$</literal> is accepted and means length(strings_in).
+                    </para>
                 </listitem>
             </varlistentry>
         </variablelist>
@@ -74,14 +79,29 @@ c = part(['abcdefg','hijklmn','opqrstu'],[4,1:7,4]);
 // retorna o caractere da posição 1, adiciona de novo o caractere da posição 1 e o caractere da posição 2
 c=part(['a','abc','abcd'],[1,1,2])
 
-// a a a
-part(['a','abc','abcd'],[1])
+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))            // => '----------'
+
+// Repeating a pattern N times:
+N = 6; pat = '- ';
+part(pat, ones(1:N).*.(1:length(pat))) // => '- - - - - - '
+
+// Using $ = implicit length of strings:
+// 1)
+part(['a string' 'another longer one'], $-2:$ ) // => [ 'ing' 'one']
 
-// aa aa aa
-part(['a','abc','abcd'],[1 1])
+// 2) Another implementation for strrev():
+part('Hello world', $:-1:1)        // => 'dlrow olleH'
 
-// "aa " aab aab
-part(['a','abc','abcd'],[1 1 2])
+// 3) With unranging $:
+part('Hello world', [ $ 4:5 ])     // => 'dlo'
+
+// 4) Mixing scalar or unranging $ with ranging ones is not possible:
+part("Hello", [ 1 $-1:$ $ ])       // =>  error
  ]]></programlisting>
     </refsection>
     <refsection>
@@ -98,4 +118,16 @@ part(['a','abc','abcd'],[1 1 2])
             </member>
         </simplelist>
     </refsection>
+    <refsection>
+        <title>Histórico</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>
index 4bf80d3..66ccb86 100644 (file)
@@ -2,7 +2,7 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) INRIA -
- *
+ * Copyright (C) Samuel GOUGEON - 2013 : $ is now supported. More examples.
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
  * This file is hereby licensed under the terms of the GNU GPL v2.0,
  * 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: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="ru">
+<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="ru">
     <refnamediv>
         <refname>part</refname>
         <refpurpose>выделение строк</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>Синтаксис</title>
-        <synopsis>[strings_out] = part(strings_in, v)</synopsis>
+        <synopsis>strings_out = part(strings_in, v)</synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Аргументы</title>
             <varlistentry>
                 <term>v</term>
                 <listitem>
-                    <para>вектор-строка целочисленных значений.</para>
+                    <para>
+                        вектор целых значений, содержащий индексы символов, которые требуется
+                        выделить. Символ <literal>$</literal> означает <literal>length(strings_in)</literal>.
+                    </para>
                 </listitem>
             </varlistentry>
         </variablelist>
@@ -76,14 +82,29 @@ c = part(['abcdefg','hijklmn','opqrstu'], [4,1:7,4]);
 // 2-й символ
 c=part(['a','abc','abcd'], [1,1,2])
 
-// a a a
-part(['a','abc','abcd'], [1])
+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']
+
+// Повторение смвола N раз:
+N = 10; part('-', ones(1:N))            // => '----------'
+
+// Повторение шаблона N раз:
+N = 6; pat = '- ';
+part(pat, ones(1:N).*.(1:length(pat))) // => '- - - - - - '
+
+// Истользование $ как неявной длины строк:
+// 1)
+part(['a string' 'another longer one'], $-2:$ ) // => [ 'ing' 'one']
 
-// aa aa aa
-part(['a','abc','abcd'], [1 1])
+// 2) Другая имплементация strrev():
+part('Hello world', $:-1:1)        // => 'dlrow olleH'
 
-// "aa " aab aab
-part(['a','abc','abcd'], [1 1 2])
+// 3) Без указания диапазона $:
+part('Hello world', [ $ 4:5 ])     // => 'dlo'
+
+// 4) Смесь скаляра и неуказа диапазона $ с указанием диапазона невозможно:
+part("Hello", [ 1 $-1:$ $ ])       // =>  error
     ]]></programlisting>
     </refsection>
     <refsection role="see also">
@@ -100,4 +121,16 @@ part(['a','abc','abcd'], [1 1 2])
             </member>
         </simplelist>
     </refsection>
+    <refsection>
+        <title>История</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.5.0</revnumber>
+                <revremark>
+                    Символ <literal>$</literal>, означающий length(input_strings), теперь принимается
+                    в индексах выбранных символов.
+                </revremark>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index 797eac4..06c875b 100644 (file)
@@ -1,7 +1,6 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) - 2013, 2015 - Samuel GOUGEON
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) - 2013, 2015, 2019 - Samuel GOUGEON
 //
 // 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,15 +24,17 @@ function r = %ip_part(txt, s)
     if length(L)>100 then
         U = unique(L)   // lengthy... So we factorize through unique() only for
         // big arrays of strings
-        for u = U'
-            j = 1:u
+        for u = U(:)'
             k = find(L==u)
-            r(k) = part(txt(k), j(s))
+            j = horner(s,u)
+            j = j(j>0)
+            r(k) = part(txt(k), j)
         end
     else                // Otherwise, a direct element-wise processing is faster.
         for i = 1:size(L, "*")
-            j = 1:L(i)
-            r(i) = part(txt(i), j(s))
+            j = horner(s, L(i))
+            j = j(j>0)
+            r(i) = part(txt(i), j)
         end
     end
 endfunction
index 451911b..48aecd8 100644 (file)
@@ -1,7 +1,6 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) - 2013 - Samuel GOUGEON
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) - 2013, 2019 - Samuel GOUGEON
 //
 // 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,8 +24,9 @@ function r = %p_part(txt, s)
     U = unique(L)
     r = emptystr(txt)
     for u = U(:)'
-        j = 1:u
         k = find(L==u)
-        r(k) = part(txt(k), horner(s(:)',u))
+        j = horner(s(:)',u)
+        j = j(j>0)
+        r(k) = part(txt(k), j)
     end
 endfunction
diff --git a/scilab/modules/string/tests/unit_tests/part.dia.ref b/scilab/modules/string/tests/unit_tests/part.dia.ref
deleted file mode 100644 (file)
index 64aad91..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2007-2008 - INRIA
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-// <-- CLI SHELL MODE -->
-//===============================
-// unit tests part
-//===============================
-EMPTY_STR = "";
-BLANK = " ";
-//===============================
-s = part(EMPTY_STR ,[]);
-if (s <> EMPTY_STR ) then bugmes();quit;end
-//===============================
-// compatibility 4.x
-N = 50;
-s = part(EMPTY_STR ,N);
-if (s <> BLANK) then bugmes();quit;end
-//===============================
-s = part(["a","abc","abcd"],[1,1,2]);
-if (s <> ["aa","aab","aab"]) then bugmes();quit;end
-//===============================
-s1 = part(["a","abc","abcd"],[2,4,6]);
-s2 = part(["a","abc","abcd"],[2,4,5]);
-if (s1 <> s2)  then bugmes();quit;end
-if (s1 <> ["   ","b","bd"]) then bugmes();quit;end
-//===============================
-N = 20;
-s = part(" ",ones(1,N));
-if (blanks(N) <> s) then bugmes();quit;end
-//===============================
-if part("abc",1)<>"a" then bugmes();quit;end
-if part("abc",[1 1])<>"aa" then bugmes();quit;end
-if part("abc",[1;1])<>"aa" then bugmes();quit;end
-if part("abc",[])<>emptystr() then bugmes();quit;end
-if part("abc",5)<>BLANK then bugmes();quit;end
-if part("abc",5:6)<>"  " then bugmes();quit;end
-if or(part(["abc";"x"],1)<>["a";"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
-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 211ca93..fdda250 100644 (file)
@@ -1,25 +1,22 @@
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2007-2008 - INRIA
+// Copyright (C) 2013, 2019 - Samuel GOUGEON
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
 
 // <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
 
 //===============================
 // unit tests part
 //===============================
-EMPTY_STR = "";
-BLANK = " ";
-//===============================
-s = part(EMPTY_STR ,[]);
-if (s <> EMPTY_STR ) then pause,end
-//===============================
+
+assert_checkequal(part("",[]), "");
+
 // compatibility 4.x
-N = 50;
-s = part(EMPTY_STR ,N);
-if (s <> BLANK) then pause,end
+assert_checkequal(part("", 50), " ");
 //===============================
 s = part(["a","abc","abcd"],[1,1,2]);
 if (s <> ["aa","aab","aab"]) then pause,end
@@ -37,7 +34,7 @@ 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)<>" " 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
@@ -47,15 +44,11 @@ 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"]);
+t = ["a","abc","abcd"];
+assert_checkequal(part(t,[]),   ["" "" ""]);
+assert_checkequal(part(t, 1),   ["a","a","a"]);
+assert_checkequal(part(t,[1 1]),["aa","aa","aa"]);
+assert_checkequal(part(t,[1 1 2]),["aa ","aab","aab"]);
 
 N = 10; a=part("-",ones(1:N));
 assert_checkequal(a,"----------");
@@ -64,11 +57,18 @@ N = 6; pat = "- ";
 a=part(pat, ones(1:N).*.(1:length(pat)));
 assert_checkequal(a,"- - - - - - ");
 
-a=part(["a string"  "another longer one"], $-2:$ );
+// With $ indices
+// --------------
+assert_checkequal(part("", $), "");
+assert_checkequal(part("", $-1), "");
+assert_checkequal(part("", $-1:$), "");
+assert_checkequal(part("", $-1:$+1), " ");
+assert_checkequal(part("", $-1:$+2), "  ");
+
+a = part(["a string"  "another longer one"], $-2:$ );
 assert_checkequal(a,["ing","one"]);
 
-a=part("Hello world", $:-1:1);
+a = part("Hello world", $:-1:1);
 assert_checkequal(a,"dlrow olleH");
-a=part("Hello world", [ $ 5:6 ]);
+a = part("Hello world", [ $ 5:6 ]);
 assert_checkequal(a,"do ");
-