bug 5588 fix 41/441/5
Serge Steer [Wed, 5 May 2010 13:14:10 +0000 (15:14 +0200)]
Change-Id: I485e19f2e091384523350bff481db63ffc0c4c2b

scilab/CHANGES_5.3.X
scilab/modules/data_structures/help/en_US/tlist.xml
scilab/modules/data_structures/help/fr_FR/tlist.xml
scilab/modules/data_structures/src/fortran/followpath.f
scilab/modules/data_structures/src/fortran/insertfield.f
scilab/modules/data_structures/src/fortran/intl_e.f
scilab/modules/data_structures/src/fortran/intl_i.f
scilab/modules/data_structures/src/fortran/udptr.f
scilab/modules/data_structures/tests/nonreg_tests/bug_5588.dia.ref [new file with mode: 0644]
scilab/modules/data_structures/tests/nonreg_tests/bug_5588.tst [new file with mode: 0644]

index 577a524..e16a405 100644 (file)
@@ -366,6 +366,9 @@ Bug fixes:
 * bug 5583 fixed - exec() did not manage correctly UTF-8 and ANSI/ASCII files 
                    encoded.
 
+* bug 5588 fixed - Assigning null() in a tlist or mlist field shifted all remaining
+                   values with respect to  field names.
+
 * bug 5609 fixed - documentation stated incorrectly fieldnames works on cells
 
 * bug 5629 fixed - export_to_hdf5 to a file overwrote a directory 
index 30e1199..d54e0ee 100644 (file)
       insertion
     : <literal>l(i)=a</literal></para>
     <para>
-     deletion
-    : <literal>l(i)=null()</literal> removes the i-th element of the <literal>tlist l</literal>.</para>
+     deletion : <literal>l(i)=null()</literal> removes the i-th
+     element of the <literal>tlist l</literal>. Note that the
+     semantics of <literal>l.x=null()</literal> is undefined, but a
+     definition can be given through the <link
+     linkend="overloading">overloading</link> mechanism.</para>
     <para>
      display</para>
     <para>
@@ -87,7 +90,7 @@
   </refsection>
   <refsection>
     <title>Examples</title>
-    <programlisting role="example"><![CDATA[ 
+    <programlisting role="example"><![CDATA[
 // tlist creation
 t = tlist(["listtype","field1","field2"], [], []);
 t.field1(1) = 10;
@@ -129,9 +132,6 @@ disp(t)
     <title>See Also</title>
     <simplelist type="inline">
       <member>
-        <link linkend="null">null</link>
-      </member>
-      <member>
         <link linkend="percent">percent</link>
       </member>
       <member>
index 905a82e..85e9410 100644 (file)
     S'il est spécifié, <literal>typ(i)</literal> donne le nom formel de l'élément <literal>i+1</literal> (voir plus bas dans les exemples).
   </para>
     <para>
-    Les opérations standard sur les listes fonctionnent similairement pour les listes typées (tlist). 
+    Les opérations standard sur les listes fonctionnent similairement pour les listes typées (tlist).
   </para>
     <para>
-     extraction 
-    : <literal>[x,y,z...]=l(v)</literal> ou <literal>v</literal> est un vecteur d'indices; 
+     extraction
+    : <literal>[x,y,z...]=l(v)</literal> ou <literal>v</literal> est un vecteur d'indices;
     <literal>[x,y,z]=l(:)</literal> extrait tous les éléments.
   </para>
     <para>
     : <literal>l(i)=a</literal>
   </para>
     <para>
-     suppression
-    : <literal>l(i)=null()</literal> supprime le i-ème élément de la <literal>tlist l</literal>.
+     suppression : <literal>l(i)=null()</literal> supprime le i-ème
+     élément de la <literal>tlist l</literal>. A noter que la
+     sémantique de <literal>l.x=null()</literal> n'est pas définie,
+     mais qu'il est possible de lui donner un sens par surcharge (voir
+     <link linkend="overloading">overloading</link>).
   </para>
     <para>
      affichage
   </para>
     <para>
-    De plus si les composantes <literal>typ(2:n+1)</literal> sont spécifiées, les éléments peuvent être désignés par leur noms formels.
+    De plus si les composantes <literal>typ(2:n+1)</literal> sont
+    spécifiées, les éléments peuvent être désignés par leur noms
+    formels.
   </para>
     <para>
     Voici quelques exemples d'utilisation des liste typées :
@@ -71,7 +76,7 @@
     <para>
     Dans Scilab, les systèmes dynamiques linéaires sont définis par une liste typée :
     le quadruplet <literal>[A,B,C,D]</literal> est représenté par la tlist
-    <literal>Sys=tlist(['lss';'A';'B';'C';'D';'X0';'dt'],A,B,C,D,x0,'c')</literal> 
+    <literal>Sys=tlist(['lss';'A';'B';'C';'D';'X0';'dt'],A,B,C,D,x0,'c')</literal>
     et cette tlist spécifique est créée par la fonction <literal>syslin</literal>.
   </para>
     <para>
@@ -89,7 +94,7 @@
   </refsection>
   <refsection>
     <title>Exemples</title>
-    <programlisting role="example"><![CDATA[ 
+    <programlisting role="example"><![CDATA[
 // tlist creation
 t = tlist(["listtype","field1","field2"], [], []);
 t.field1(1) = 10;
index 8dea9fb..06bad1f 100644 (file)
@@ -7,7 +7,7 @@ c you should have received as part of this distribution.  The terms
 c are also available at
 c http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
       subroutine followpath(indtop,listtop,ilindi,voli,ilp,voll,ind,
-     $     count,info,lwork)
+     $     count,info,lwork,job)
 c =============================================================
 c     given
 c     - a path stored in a "linear" index list ind stored in the
@@ -35,11 +35,19 @@ c         2 : current index is a matrix index of an mlist
 c         3 : current index is not a single number
 c         4 : current index points to a leaf of the  L list
 c         5 : end of index list reached
-c         6 : current index is 0 or greater than current sublist # of fields
+c         6 : current index is 0 or greater than current sublist # of
+c             fields
+c     job
+c     if job is true and end of index list is reached, the last index is
+c     a name and the parent of the deapest object is a tlist or an mlist
+c     the procedure returns the pointer and path of the parent instead
+c     of the object itself (null insertion).
+
 c =============================================================
 c
       include 'stack.h'
 c
+      logical job
       integer indtop,listtop,ind(*)
       integer typi,count,oldcount,voll,voli
 
@@ -63,16 +71,12 @@ c
       endif
 c
       illist=iadr(lstk(listtop))
-c      if(istk(illist).lt.0) illist=iadr(istk(illist+1))
-c
       if(istk(ilind).ne.15) then
 c     .  special case if ind is not a list
          nlist=1
          count=1
          ilindi=ilind
          ilindir=ilindi
-c        voli=lstk(itop+1)-lstk(itop)
-
          illistir=illist
          if(istk(illist).lt.0) illist=iadr(istk(illist+1))
          illisti=illist
@@ -80,6 +84,7 @@ c        voli=lstk(itop+1)-lstk(itop)
 
       endif
 
+c     nlist is the size of the path index list
       nlist=istk(ilind+1)
       ll=sadr(ilind+3+nlist)
 
@@ -132,11 +137,14 @@ c     .     first field may contain the fields names
             lfn=ilptr+nn
 c     .     look for corresponding index if any
             n=strpos(istk(ilptr),nn-1,istk(lfn),istk(ilname),nname)
-
             if(n.le.0) then
 c     .        no such name in the field names
                info=1
                goto 50
+            elseif(job.and.count.eq.nlist) then
+c     .        null assignment into a named sublist of an tlist or mlist
+               info=1
+               goto 50
             endif
             n=n+1
          endif
index b7e3b8d..f6ae11e 100644 (file)
@@ -25,7 +25,7 @@ c
       integer volfrom,voltos,volto,dvol,ind(*)
       integer typfrom,typto
 
-      Integer subptr
+      integer subptr
       external subptr
 
       integer iadr,sadr
index f3adb5a..eebf3ad 100644 (file)
@@ -83,7 +83,7 @@ c
       endif
 c     go ahead along the path
       call followpath(top1,top2,il1ir,vol1,il2ir,vol2,istk(ilind),
-     $     icount,info,lw)
+     $     icount,info,lw,.false.)
       if(err.gt.0) return
       if(vol2.eq.0) then
 c     empty field found
@@ -231,7 +231,7 @@ c
 c     standard matrix extraction
       call createref(il2i,0,vol2)
 c
- 34   fin=3
+      fin=3
 c     back to allops for  standard extraction
       if (ptover(1,psiz)) return
       icall=4
index cec2d16..caebcb0 100644 (file)
@@ -77,6 +77,7 @@ c     get arg2
       else
          vol2=lstk(top+1)-lstk(top)
       endif
+      
 c
 c     get arg1
       top=top-1
@@ -99,7 +100,7 @@ c     protect index list
 c     go ahead along the path
       icount=0
       call followpath(top1,top3,il1ir,vol1,il3ir,vol3,
-     $     istk(ilind),icount,info,lw)
+     $     istk(ilind),icount,info,lw,istk(il2).eq.0)
       if(err.gt.0) return
       il1i=il1ir
       if(istk(il1i).lt.0) il1i=iadr(istk(il1i+1))
index 98f8392..dc8dcdd 100644 (file)
@@ -56,6 +56,7 @@ c
       sadr(l)=(l/2)+1
 c
       il=ilt
+      if(istk(il).lt.0) il=iadr(istk(il+1))
       if(nind.le.0) goto 30
 c
       do 20 k=1,nind
@@ -64,6 +65,6 @@ c     .  m : sub-list size
 c     .  il pointer to ind(k) sub-list entry
          il=iadr(sadr(il+3+m)+istk(il+1+ind(k))-1)
  20   continue
- 30     subptr=il
+ 30   subptr=il
       end
 
diff --git a/scilab/modules/data_structures/tests/nonreg_tests/bug_5588.dia.ref b/scilab/modules/data_structures/tests/nonreg_tests/bug_5588.dia.ref
new file mode 100644 (file)
index 0000000..6f2483c
--- /dev/null
@@ -0,0 +1,63 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2010 - INRIA - Serge Steer
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- JVM NOT MANDATORY -->
+// <-- Non-regression test for bug 5588 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=5588
+//
+// <-- Short Description -->
+// null() of a tlist() field shifts all remaining values with respect to
+// field names.
+// tlist null assignment indexed by a name
+clear  %0_i_a %0_i_A
+t=tlist(["a","b","c"],10,"foo");
+if execstr("t.b=null()","errcatch")==0 then bugmes();quit;end
+function t=%0_i_a(i,void,t)
+  f=getfield(1,t);
+  k=find(f==i);
+  if k<>[] then
+    f(k)=[];
+    setfield(k,null(),t);
+    setfield(1,f,t);
+  end
+endfunction
+if execstr("t.b=null()","errcatch")<>0 then bugmes();quit;end
+if or(t<>tlist(["a","c"],"foo"))  then bugmes();quit;end
+// tlist null assignment indexed by a number
+t=tlist(["a","b","c"],10,"foo");
+if execstr("t(2)=null()","errcatch")<>0 then bugmes();quit;end
+if or(t<>tlist(["a","b","c"],"foo"))  then bugmes();quit;end
+//struct null assignment indexed by a name
+T.x="foo";T.y=33;
+if execstr("T.dims=null()","errcatch")==0 then bugmes();quit;end
+if execstr("T(1,1)=null()","errcatch")==0 then bugmes();quit;end
+if execstr("T.x=null()","errcatch")<>0 then bugmes();quit;end
+T1.y=33;
+if or(T<>T1) then bugmes();quit;end
+T1.x="foo";
+if execstr("T(1)=null()","errcatch")==0 then bugmes();quit;end
+//cell null assignment
+c=makecell([1,2],1,"xyz");   
+if execstr("c(1,1)=null()","errcatch")==0 then bugmes();quit;end
+if execstr("c.dims=null()","errcatch")==0 then bugmes();quit;end
+//sublist null assigment indexed by a name
+L=tlist(["foo","x","y"],mlist(["A","b","c"],10,"zoo"),1:5);
+if execstr("L.x.b=null()","errcatch")==0 then bugmes();quit;end
+%0_i_A=%0_i_a;
+if execstr("L.x.b=null()","errcatch")<>0 then bugmes();quit;end
+if or(L<>tlist(["foo","x","y"],mlist(["A","c"],"zoo"),1:5)) then bugmes();quit;end
+//sublist null assigment indexed by a number
+clear %0_i_A
+L=mlist(["foo","x","y"],tlist(["A","b","c"],10,"zoo"),1:5);
+if execstr("L.x(2)=null()","errcatch")<>0 then bugmes();quit;end
+if or(L<>mlist(["foo","x","y"],tlist(["A","b","c"],"zoo"),1:5)) then bugmes();quit;end
+//try a more complex context
+L=tlist(["foo","x","y"],list(33,mlist(["A","b","c"],10,"zoo")),1:5);
+%0_i_A=%0_i_a;
+if execstr("L.x(2).b=null()","errcatch")<>0 then bugmes();quit;end
+if or(L<>tlist(["foo","x","y"],list(33,mlist(["A","c"],"zoo")),1:5)) then bugmes();quit;end
diff --git a/scilab/modules/data_structures/tests/nonreg_tests/bug_5588.tst b/scilab/modules/data_structures/tests/nonreg_tests/bug_5588.tst
new file mode 100644 (file)
index 0000000..2eee84d
--- /dev/null
@@ -0,0 +1,75 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2010 - INRIA - Serge Steer
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- JVM NOT MANDATORY -->
+
+// <-- Non-regression test for bug 5588 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=5588
+//
+// <-- Short Description -->
+// null() of a tlist() field shifts all remaining values with respect to
+// field names.
+
+// tlist null assignment indexed by a name
+clear  %0_i_a %0_i_A
+t=tlist(["a","b","c"],10,"foo");
+if execstr("t.b=null()","errcatch")==0 then pause,end
+function t=%0_i_a(i,void,t)
+  f=getfield(1,t);
+  k=find(f==i);
+  if k<>[] then
+    f(k)=[];
+    setfield(k,null(),t);
+    setfield(1,f,t);
+  end
+endfunction
+if execstr("t.b=null()","errcatch")<>0 then pause,end
+if or(t<>tlist(["a","c"],"foo"))  then pause,end
+
+// tlist null assignment indexed by a number
+t=tlist(["a","b","c"],10,"foo");
+if execstr("t(2)=null()","errcatch")<>0 then pause,end
+if or(t<>tlist(["a","b","c"],"foo"))  then pause,end
+
+//struct null assignment indexed by a name
+T.x="foo";T.y=33;
+if execstr("T.dims=null()","errcatch")==0 then pause,end
+if execstr("T(1,1)=null()","errcatch")==0 then pause,end
+
+if execstr("T.x=null()","errcatch")<>0 then pause,end
+T1.y=33;
+if or(T<>T1) then pause,end
+T1.x="foo";
+if execstr("T(1)=null()","errcatch")==0 then pause,end
+
+
+//cell null assignment
+c=makecell([1,2],1,"xyz");   
+if execstr("c(1,1)=null()","errcatch")==0 then pause,end
+if execstr("c.dims=null()","errcatch")==0 then pause,end
+
+//sublist null assigment indexed by a name
+L=tlist(["foo","x","y"],mlist(["A","b","c"],10,"zoo"),1:5);
+if execstr("L.x.b=null()","errcatch")==0 then pause,end
+%0_i_A=%0_i_a;
+if execstr("L.x.b=null()","errcatch")<>0 then pause,end
+if or(L<>tlist(["foo","x","y"],mlist(["A","c"],"zoo"),1:5)) then pause,end
+
+//sublist null assigment indexed by a number
+clear %0_i_A
+L=mlist(["foo","x","y"],tlist(["A","b","c"],10,"zoo"),1:5);
+if execstr("L.x(2)=null()","errcatch")<>0 then pause,end
+if or(L<>mlist(["foo","x","y"],tlist(["A","b","c"],"zoo"),1:5)) then pause,end
+
+//try a more complex context
+L=tlist(["foo","x","y"],list(33,mlist(["A","b","c"],10,"zoo")),1:5);
+%0_i_A=%0_i_a;
+if execstr("L.x(2).b=null()","errcatch")<>0 then pause,end
+
+if or(L<>tlist(["foo","x","y"],list(33,mlist(["A","c"],"zoo")),1:5)) then pause,end