1
subroutine tradsl(ilfun,funnam,illist,nlist)
4
c convert compiled macros to lst structure
6
c subroutine tradsl(ilfun,id,illist,nlist)
7
c kmac : variable number of the compiled macro in the scilab stack
14
integer nops,funnam(nsiz)
25
integer id(nsiz),iadr,sadr,cmplxt,pt0
27
integer for(3),while(5),iff(2),sel(6)
34
data while/32,17,18,21,14/
35
data sel/28,14,21,14,12,29/
36
c + - * .* *. .*. / ./ /. ./.
37
data (ops(i),i=1,10) /45,46,47,98,200,149,48,99,201,150/
38
c \ .\ \. .\. ** = < > <= >= <>
39
data (ops(i),i=11,21)/49,100,202,151,62,50,59,60,109,110,119/
40
c : [,] ins ext ' [;] | & ~ .^ .'
41
data (ops(i),i=22,nops)/44,01, 02 ,03,53,04, 57,58, 61,113,104/
49
write(buf(1:8),'(2i4)') pt,rstk(pt)
50
call basout(io,wte,' tradsl pt:'//buf(1:4)//' rstk(pt):'
68
c on scrute une premiere fois l'ensemble de la macro pour determiner
72
lc = lc + nsiz*istk(lc) + 1
73
lc = lc + nsiz*istk(lc) + 1
76
icount=cmplxt(istk(lc),long)
84
c premiers elements de la liste resultat
90
lr=sadr(ilr+3+icount+3)
95
call basnms(funnam,1,istk(il),ni)
97
istk(ilr)=istk(ilr-1)+l-lr
101
c nom des parametres de sortie
105
call basnms(istk(lc+1),nc,istk(il),ni)
107
istk(ilr)=istk(ilr-1)+l-lr
111
c nom des parametres d'entree
115
call basnms(istk(lc+1),nc,istk(il),ni)
117
istk(ilr)=istk(ilr-1)+l-lr
126
C pointeur sur le tableau de travail : pointe sur la premiere adresse libre
128
c debut du texte proprement dit de la macro
130
C lc : pointeur sur l'instruction de la macro en cours de traduction
131
c lr : pointeur dans stk sur l'element courant de la liste courante
132
c ilr: pointeur dans istk sur la position de l'element courant dans
138
c nouvelle 'operation'
141
goto(11,11,11,46,47,11,51,54,55,11,61,63,64,65),rstk(pt)
142
11 nlist=iadr(lr)-illist
148
if(ddt.lt.-1) write(6,'(i7)') op
149
goto(20,25,40,42,30,41,45,50,50,60,15,90,90,90,90,100,
150
& 12,101,102,90,103,104,105,106,107,108) ,op
154
if(op.ge.100) goto 80
181
istk(ilr)=istk(ilr-1)+l-lr
195
c affectation d'une valeur a une variable
196
c de par le fonctionnement de la pile , la valeur a affecter est
197
c en premiere position
212
call namstr(istk(lc+1),istk(l),ni,1)
213
istk(il+6)=istk(il+5)+ni
217
istk(ilr)=istk(ilr-1)+l-lr
239
call namstr(istk(lc+1),istk(l),ni,1)
240
istk(il+6)=istk(il+5)+ni
243
call intstr(istk(lc+nsiz+1),istk(l),ni,1)
244
istk(il+7)=istk(il+6)+ni
247
call intstr(istk(lc+nsiz+2),istk(l),ni,1)
248
istk(il+8)=istk(il+7)+ni
252
istk(ilr)=istk(ilr-1)+l-lr
259
c allops => operation sur les operandes de la pile
278
buf='Unmanaged operation'
282
if(ops(ii).ne.iop) goto 31
283
call intstr(ii,istk(l),ni,1)
284
c call intstr(istk(lc+1),istk(l),ni,1)
285
istk(il+6)=istk(il+5)+ni
288
call intstr(istk(lc+2),istk(l),ni,1)
289
istk(il+7)=istk(il+6)+ni
292
call intstr(istk(lc+3),istk(l),ni,1)
293
istk(il+8)=istk(il+7)+ni
297
istk(ilr)=istk(ilr-1)+l-lr
320
call icopy(ni,istk(lc+2),1,istk(l),1)
321
istk(il+6)=istk(il+5)+ni
325
istk(ilr)=istk(ilr-1)+l-lr
336
if(getendian().eq.1) then
348
call fmt(abs(x),maxc,ifmt,n1,n2)
353
elseif(ifmt.eq.-2) then
357
elseif(ifmt.eq.1) then
361
if(abs(x).ge.1.d100.or.abs(x).lt.1.d-99) then
362
ie=int(log10(abs(x)))
366
write(form,120) maxc,0
369
write(strg(ls+1:),'(''D'',i4)') ie
371
write(form,130) maxc,maxc-7
374
elseif(ifmt.ge.0) then
376
write(form,120) n1,n2
381
if(strg(i1:i1).eq.' ') goto 410
384
if(ifmt.ge.0.and.ifmt.ne.1) then
387
if(strg(i2:i2).eq.'0') goto 420
389
if(strg(i2:i2).eq.'.') i2=i2-1
406
call cvstr(ni,istk(l),strg(i1:i2),0)
407
istk(il+6)=istk(il+5)+ni
411
istk(ilr)=istk(ilr-1)+l-lr
434
istk(ilr)=istk(ilr-1)+l-lr
445
if(ddt.le.-1) write(6,'(a10,5i5)') 'for',pt,lcf,ilr,lr,l-lr
447
c on preserve les pointeurs de la liste courante
454
c on cree les premiers elements de la liste "for"
469
call icopy(3,for,1,istk(l),1)
470
istk(il+5)=istk(il+4)+3
475
call namstr(istk(li+1),istk(l),ni,1)
476
istk(il+6)=istk(il+5)+ni
480
istk(ilr)=istk(ilr-1)+l-lr
485
c expression de boucle
489
c ---- on preserve les pointeurs de la liste "for"
501
c ---- ---- ---- ---- ---- --
502
c on cree la liste "code boucle"
503
ni=cmplxt(istk(lc),long)
514
c on rappelle les pointeurs de la liste "for"
517
c on complete la liste for
518
istk(ilr)=istk(ilr-1)+l-lr
522
c ---- on preserve les pointeurs de la liste "for"
528
c on cree la liste "for code "
529
ni=cmplxt(istk(lc),long)
537
c on preserve les pointeurs de la liste "for code"
542
c on recharge les pointeurs de la liste "for"
547
c on complete la liste "for"
548
istk(ilr)=istk(ilr-1)+l-lr
551
c on recharge les pointeurs de la liste courante
555
c on complete la liste "courante"
556
istk(ilr)=istk(ilr-1)+l-lr
560
if(ddt.le.-1) write(6,'(a10,5i5)') 'fin for',pt,lcf,ilr,lr,l-lr
565
if(istk(lc+1).lt.0) goto 60
566
c ce qui suit (jusqu'a l'etiquette 60 correspond a la traduction
567
c des if/while de la version 3 et assure la compatibilite
568
if(ddt.le.-1) write(6,'(a10,5i5)') 'if',pt,lcf,ilr,lr,l-lr
570
c on preserve les pointeurs de la liste courante
578
c on cree les premiers elements de la liste "if" ou "while"
595
call icopy(2,iff,1,istk(l),1)
596
istk(il+5)=istk(il+4)+2
599
call icopy(5,while,1,istk(l),1)
600
istk(il+5)=istk(il+4)+5
605
istk(ilr)=istk(ilr-1)+l-lr
614
c ---- on preserve les pointeurs de la liste "if" ou "while"
627
c ---- ---- ---- ---- ---- --
628
c on cree la liste "code expression logique"
629
ni=cmplxt(istk(lc),long)+1
638
c fin "code expression logique"
639
c on ajoute le code de l'op de comparaison
655
buf='Unmanaged operation'
659
if(ops(ii).ne.istk(lc0+1)) goto 52
660
call intstr(ii,istk(l),ni,1)
661
istk(il+6)=istk(il+5)+ni
665
istk(il+7)=istk(il+6)+1
669
istk(il+8)=istk(il+7)+1
673
istk(ilr)=istk(ilr-1)+l-lr
677
c on rappelle les pointeurs de la liste "if" ou "while"
680
c on complete la liste "if" ou "while"
681
istk(ilr)=istk(ilr-1)+l-lr
685
c ---- on preserve les pointeurs de la liste "if" ou "while"
689
c on cree la liste "then"
691
ni=cmplxt(istk(lc),long)
702
c fin du code du then
703
c on rappele les pointeur de la liste "if" ou "while"
706
c on complete la liste "if" ou "while"
707
istk(ilr)=istk(ilr-1)+l-lr
711
c ---- on preserve les pointeurs de la liste "if" ou "while"
712
if(ddt.le.-1) write(6,'(a10,5i5)') 'else',pt,lcf,ilr,lr,l-lr
718
c on cree la liste "else"
719
ni=cmplxt(istk(lc),long)
731
c on recharge les pointeurs de la liste "if" ou "while"
735
c on complete la liste "if" ou "while"
736
istk(ilr)=istk(ilr-1)+l-lr
739
if(ddt.le.-1) write(6,'(a10,5i5)') 'fin else',pt,lcf,ilr,lr,l-lr
740
c on recharge les pointeurs de la liste courante
744
c on complete la liste "courante"
745
istk(ilr)=istk(ilr-1)+l-lr
749
if(ddt.le.-1) write(6,'(a10,5i5)') 'fin if',pt,lcf,ilr,lr,l-lr
754
if(ddt.le.-1) write(6,'(a10,5i5)') 'sel',pt,lcf,ilr,lr,l-lr
756
c on preserve les pointeurs de la liste courante
764
c on cree les premiers elements de la liste "select case"
767
if(istk(lc).eq.10) then
774
lr=sadr(ilr+istk(il+1))
783
if(istk(lc).eq.8) then
785
call icopy(2,iff,1,istk(l),1)
786
istk(il+5)=istk(il+4)+2
788
elseif(istk(lc).eq.9) then
790
call icopy(5,while,1,istk(l),1)
791
istk(il+5)=istk(il+4)+5
793
elseif(istk(lc).eq.10) then
795
call icopy(6,sel,1,istk(l),1)
796
istk(il+5)=istk(il+4)+6
801
istk(ilr)=istk(ilr-1)+l-lr
806
c premiere expression
810
c ---- on preserve les pointeurs de la liste "select case"
823
c ---- ---- ---- ---- ---- --
825
if(istk(lc0).ne.10) goto 62
827
c on cree la liste "code premiere expression"
828
ni=cmplxt(istk(lc),long)
837
c fin "code premiere expression"
838
c on rappelle les pointeurs de la liste "select case"
841
c on complete la liste "select case"
842
istk(ilr)=istk(ilr-1)+l-lr
849
if(ddt.le.-1) write(6,'(a10,5i5)') 'case',pt,lcf,ilr,lr,l-lr
853
c code de l'expression du case
854
c ---- on preserve les pointeurs de la liste "select case"
858
c on cree la liste "case"
861
ni=cmplxt(istk(lc),long)
872
c fin du code de l'expression du case
873
c on rappele les pointeur de la liste "select case"
876
c on complete la liste "select case"
877
istk(ilr)=istk(ilr-1)+l-lr
883
c ---- on preserve les pointeurs de la liste "select case"
889
c on cree la liste "then"
890
ni=cmplxt(istk(lc),long)
902
c on recharge les pointeurs de la liste "select case"
906
c on complete la liste "select case"
907
istk(ilr)=istk(ilr-1)+l-lr
910
if(ddt.le.-1) write(6,'(a10,5i5)') 'fin case',pt,lcf,ilr,lr,l-lr
912
if(icase.gt.1) goto 62
915
if(ddt.le.-1) write(6,'(a10,5i5)') 'else',pt,lcf,ilr,lr,l-lr
916
c ---- on preserve les pointeurs de la liste "select case"
922
c on cree la liste "else"
923
ni=cmplxt(istk(lc),long)
924
if(long.eq.0) lc=lc+1
936
c on recharge les pointeurs de la liste "select case"
940
c on complete la liste "select case"
941
istk(ilr)=istk(ilr-1)+l-lr
944
if(ddt.le.-1) write(6,'(a10,5i5)') 'fin else',pt,lcf,ilr,lr,l-lr
945
c on recharge les pointeurs de la liste courante
949
c on complete la liste "courante"
950
istk(ilr)=istk(ilr-1)+l-lr
954
if(ddt.le.-1) write(6,'(a10,5i5)') 'fin sel',pt,lcf,ilr,lr,l-lr
959
call funtab(id,fptr,2)
974
call namstr(id,istk(l),ni,1)
975
istk(il+6)=istk(il+5)+ni
978
call intstr(istk(lc+1),istk(l),ni,1)
979
istk(il+7)=istk(il+6)+ni
982
call intstr(istk(lc+2),istk(l),ni,1)
983
istk(il+8)=istk(il+7)+ni
987
istk(ilr)=istk(ilr-1)+l-lr
994
c pause,break,abort,eol
1004
call intstr(op,istk(l),nw,0)
1009
istk(ilr)=istk(ilr-1)+l-lr
1017
c info sur numero de lignes
1022
c mark named variable
1035
c nom de la variable
1036
call namstr(istk(lc+1),istk(l),ni,1)
1037
istk(il+6)=istk(il+5)+ni
1041
istk(ilr)=istk(ilr-1)+l-lr
1064
call intstr(istk(lc+1),istk(l),ni,1)
1065
istk(il+6)=istk(il+5)+ni
1068
call intstr(istk(lc+2),istk(l),ni,1)
1069
istk(il+7)=istk(il+6)+ni
1073
istk(ilr)=istk(ilr-1)+l-lr
1086
c printmode (ignored)
1104
c nom de la variable
1105
call namstr(istk(lc+1),istk(l),ni,1)
1106
istk(il+6)=istk(il+5)+ni
1110
istk(ilr)=istk(ilr-1)+l-lr
1132
istk(ilr)=istk(ilr-1)+l-lr
1155
call intstr(istk(lc+1),istk(l),ni,1)
1156
istk(il+6)=istk(il+5)+ni
1159
call intstr(istk(lc+2),istk(l),ni,1)
1160
istk(il+7)=istk(il+6)+ni
1164
istk(ilr)=istk(ilr-1)+l-lr
1173
n=istk(lc+1)*istk(lc+2)
1188
call intstr(istk(lc+1),istk(l),ni,1)
1189
istk(il+6)=istk(il+5)+ni
1192
call intstr(istk(lc+2),istk(l),ni,1)
1193
istk(il+7)=istk(il+6)+ni
1198
istk(il+7+ii)=istk(il+6+ii)+istk(lc+4+ii)-istk(lc+3+ii)
1200
call icopy(nc,istk(lc+5+n),1,istk(l),1)
1204
istk(ilr)=istk(ilr-1)+l-lr
1212
120 format('(f',i2,'.',i2,')')
1213
130 format('(1pd',i2,'.',i2,')')