bug 5588 fix
[scilab.git] / scilab / modules / data_structures / src / fortran / udptr.f
1 c Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 c Copyright (C) ????-2008 - INRIA
3 c
4 c This file must be used under the terms of the CeCILL.
5 c This source file is licensed as described in the file COPYING, which
6 c you should have received as part of this distribution.  The terms
7 c are also available at
8 c http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
9
10       subroutine updptr(ilt,ind,nind,dvol)
11 c!purpose
12 c     update new data structure pointers recursively for nested lists
13 c!parameters
14 c     ilt : pointer to the beginning of the list
15 c     ind : vector of indexes giving modified entry path.
16 c     nind: size of the path
17 c     dvol: difference of the old and new sizes of the modified entry
18 c!
19       integer ind(*),dvol
20       integer iadr,sadr
21       include 'stack.h'
22
23 c
24       iadr(l)=l+l-1
25       sadr(l)=(l/2)+1
26 c
27       il=ilt
28       if(nind.le.0) return
29 c
30       do 20 k=1,nind
31 c     .  m : sub-list size
32          m=istk(il+1)
33          mi=ind(k)
34 c     .  update pointers to entries following the mi sub list entry
35          do 10 i=mi,m
36             istk(il+i+2)=istk(il+i+2)+dvol
37  10      continue
38 c     .  il pointer to ind(k) sub-list entry
39          il=iadr(sadr(il+3+m)+istk(il+1+mi)-1)
40  20   continue
41       end
42
43       integer function subptr(ilt,ind,nind)
44 c     !purpose
45 c     get pointer to an entry of a  nested list
46 c     !parameters
47 c     ilt : pointer to the beginning of the list
48 c     ind : vector of indexes giving modified entry path.
49 c     nind: size of the path
50 c     !
51       integer ind(nind)
52       integer iadr,sadr
53       include 'stack.h'
54 c
55       iadr(l)=l+l-1
56       sadr(l)=(l/2)+1
57 c
58       il=ilt
59       if(istk(il).lt.0) il=iadr(istk(il+1))
60       if(nind.le.0) goto 30
61 c
62       do 20 k=1,nind
63 c     .  m : sub-list size
64          m=istk(il+1)
65 c     .  il pointer to ind(k) sub-list entry
66          il=iadr(sadr(il+3+m)+istk(il+1+ind(k))-1)
67  20   continue
68  30   subptr=il
69       end
70