1
subroutine expsum(isg,chaine,n,iptr,np,maxnp,ierr)
3
c Etant donnee une expression cette subroutine la decompose
4
c en somme et differences de sous-expressions et en change
5
c eventuellement le signe
7
c subroutine expsum(isg,chaine,n,iptr,np,maxnp,ierr)
8
c integer isg,chaine(*),n,iptr(*),np,maxnp,ierr
10
c isg : flag de changement de signe de l'expression
11
c isg>0 pas de changement de signe
12
c isg<0 changement de signe
13
c chaine:vecteur d'entiers contenant les codes des
14
c caracteres de l'expression.
15
c en retour chaine contient les codes de l'expression
16
c la longueur peut etre modifiee (voir augmentee de 1)
17
c n: longueur de "chaine"
18
c iptr : vecteur des pointeurs sur le debut de chaque sous
19
c expressions (signe initial compris) dans chaine.
20
c np : nombre de sous expressions
21
c maxnp : taille maxi de iptr (limite du nombre de sous
23
c ierr : retour d'erreur si np>maxnp (ierr=1)
28
integer chaine(*),iptr(*)
30
integer plus,minus,sign,lparen,rparen
31
data plus/45/,minus/46/,lparen/41/,rparen/42/
34
c on elimine des parentheses superflues
38
if(chaine(l1).eq.plus.or.chaine(l1).eq.minus) l1=l1+1
39
if(chaine(l1).eq.lparen) then
44
if(chaine(l1).eq.lparen) icount=icount+1
45
if(chaine(l1).eq.rparen) icount=icount-1
46
if(icount.ne.0) goto 03
48
if(chaine(1).eq.minus) sign=-sign
49
call icopy(n-3,chaine(3),1,chaine(1),1)
52
04 if(chaine(1).eq.lparen) then
57
if(chaine(l1).eq.lparen) icount=icount+1
58
if(chaine(l1).eq.rparen) icount=icount-1
59
if(icount.ne.0) goto 05
61
if(chaine(1).eq.minus) sign=-sign
62
call icopy(n-2,chaine(2),1,chaine(1),1)
65
06 if(n.lt.n0) goto 01
66
c on rajoute eventuellement le premier signe
67
if(chaine(1).ne.plus.and.chaine(1).ne.minus) then
68
call icopy(n,chaine(1),-1,chaine(2),-1)
75
c on recherche chacun des termes et l'on change eventuellement les signes
80
if(chaine(l1).eq.lparen) icount=icount+1
81
if(chaine(l1).eq.rparen) icount=icount-1
83
if(chaine(l1).eq.minus) then
84
if(sign.eq.-1) chaine(l1)=plus
86
if(np.gt.maxnp) goto 100
88
elseif(chaine(l1).eq.plus) then
89
if(sign.eq.-1) chaine(l1)=minus
91
if(np.gt.maxnp) goto 100
97
30 if(np+1.gt.maxnp) goto 100