subroutine where c extrait l'arbre d'appel de l'instruction courante c cette routine est issue de la fin du sous programme error c Copyright INRIA c Revised and corrected by Francois VOGEL, July/August 2004 c (bugs 908, 922 and 911 are fixed by this version) include '../stack.h' integer iadr,sadr integer p,lpts(6),lcts,r,vol,rios logical first iadr(l)=l+l-1 sadr(l)=(l/2)+1 if (rhs .ge. 0) then call error(39) return endif if (lhs .ne. 2) then call error(41) return endif c preserve datas call icopy(6,lpt,1,lpts,1) lcts=lct(8) p=pt rios=rio c initialize top=top+1 il=iadr(lstk(top)) first=.true. il0=il nn=0 ll=0 c depilement de l'environnement p=p+1 1001 p=p-1 if(p.eq.0) goto 1010 r=rstk(p) goto(1002,1002,1004) r-500 goto 1001 c c on depile une macro 1002 k=lpt(1)-(13+nsiz) lpt(1)=lin(k+1) lpt(2)=lin(k+2) lpt(6)=k c c recherche du nom de la macro correspondant a ce niveau lk=sadr(lin(k+6)) if(lk.le.lstk(top+1)) then km=0 else km=lin(k+5)-1 endif 1003 km=km+1 if(km.gt.isiz)goto 1013 if(lstk(km).ne.lk) goto 1003 c 1013 continue ilk=lin(k+6) if(istk(ilk).ne.10) then if(first) then first=.false. nlc=0 else call whatln(lpt(1),lpt(2),lpt(6),nlc,l1,ifin) endif err=sadr(il+2+nlgh)-lstk(bot) if(err.gt.0) then call error(17) return endif istk(il)=lct(8)-nlc il=il+1 if (km.le.isiz) then call namstr(idstk(1,km),istk(il+1),istk(il),1) ll=ll+istk(il) il=il+1+istk(il) else istk(il)=0 il=il+1 endif nn=nn+1 else istk(il)=0 istk(il+1)=7 call cvstr(7,istk(il+2),'execstr',0) ll=ll+7 il=il+9 nn=nn+1 endif lct(8)=lin(k+12+nsiz) c goto 1001 c c on depile un exec ou une pause 1004 if(rio.ne.rte) then c exec k=lpt(1)-(13+nsiz) lpt(1)=lin(k+1) lpt(2)=lin(k+4) lpt(6)=k c if(first) then first=.false. nlc=0 endif err=sadr(il+2+nlgh)-lstk(bot) if(err.gt.0) then call error(17) return endif istk(il)=lct(8)-nlc istk(il+1)=4 call cvstr(4,istk(il+2),'exec',0) ll=ll+4 il=il+6 nn=nn+1 lct(8)=lin(k+12+nsiz) c 1005 p=p-1 if(rstk(p).ne.902) goto 1005 rio=pstk(p) goto 1001 else c pause k = lpt(1) - (13+nsiz) lpt(1) = lin(k+1) lpt(2) = lin(k+2) lpt(3) = lin(k+3) lpt(4) = lin(k+4) lpt(6) = k if(first) first=.false. err=sadr(il+2+nlgh)-lstk(bot) if(err.gt.0) then call error(17) return endif istk(il)=0 istk(il+1)=5 call cvstr(5,istk(il+2),'pause',0) ll=ll+5 il=il+7 nn=nn+1 lct(8)=lin(k+12+nsiz) goto 1001 endif c restaure datas 1010 call icopy(6,lpts,1,lpt,1) lct(8)=lcts rio=rios c create return variables ill=il0 ll=sadr(ill+4) ilm=iadr(ll+nn) if(nn.eq.0) then err=sadr(ill+8)-lstk(bot) if(err.gt.0) then call error(17) return endif istk(ill)=1 istk(ill+1)=0 istk(ill+2)=0 istk(ill+3)=0 lstk(top+1)=ll top=top+1 istk(ilm)=1 istk(ilm+1)=0 istk(ilm+2)=0 istk(ilm+3)=0 lstk(top+1)=sadr(ilm+4) return endif c compute total size of names strings vol=0 il1=il0 do 05 i=1,nn n1=istk(il1+1) vol=vol+n1 il1=il1+2+n1 05 continue c check memory ilw=ilm+4+nn+1+vol err=sadr(ilw+il-il0)-lstk(bot) if(err.gt.0) then call error(17) return endif call icopy(il-il0,istk(il0),-1,istk(ilw),-1) istk(ill)=1 istk(ill+1)=nn istk(ill+2)=1 istk(ill+3)=0 c istk(ilm)=10 istk(ilm+1)=nn istk(ilm+2)=1 istk(ilm+3)=0 istk(ilm+4)=1 c il=ilw ln=1 do 10 i=1,nn stk(ll-1+i)=istk(il) n=istk(il+1) istk(ilm+4+i)=ln+n il=il+2 if(n.gt.0) then call icopy(n,istk(il),1,istk(ilm+4+nn+ln),1) il=il+n endif ln=ln+n 10 continue lstk(top+1)=ll+nn top=top+1 lstk(top+1)=sadr(ilm+4+nn+ln) return end