55100 #include "rundecs.h" 55110 (* COPYRIGHT 1983 C.H.LINDSEY, UNIVERSITY OF MANCHESTER *) 55120 (**) 55130 (**) 55140 PROCEDURE GARBAGE (ANOBJECT: OBJECTP); EXTERN ; 55150 PROCEDURE SLCMN(STOWEDVAL: OBJECTP; INDEX, SLICDEX: INTEGER); EXTERN; 55160 (**) 55170 (**) 55180 FUNCTION GETSLN(NEWREFSLN:OBJECTP): OBJECTP; 55190 VAR OLDREF:OBJECTP; 55200 BEGIN 55210 WITH NEWREFSLN^ DO 55220 BEGIN 55230 OLDREF := PVALUE; 55240 ANCESTOR := OLDREF^.ANCESTOR; 55250 WITH ANCESTOR^ DO FINC; 55260 OSCOPE := OLDREF^.OSCOPE; 55270 CCOUNT := 1; 55280 END; 55290 IF FPTST(OLDREF^) THEN GARBAGE(OLDREF); 55300 GETSLN := NEWREFSLN; 55310 END; 55320 (**) 55330 (**) 55340 (*THE FOLLOWING PROCEDURES ARE USUALLY WRITTEN IN ASSEMBLER*) 55350 (**) 55360 (*-01() 55370 PROCEDURE STARTSL(NOROWS, DEPTH: INTEGER); 55380 (*PSTARTSLICE*) 55390 (* SOURDESC, SLICDESC, SOURDEX, SLICDEX, ADJACC *) 55400 BEGIN 55410 SOURDEX:= 0; 55420 SLICDEX:= 0; 55430 SOURDESC := ASPTR(GETSTKTOP(SZADDR, DEPTH)); 55440 ENEW(SLICDESC, REFSLNCONST+NOROWS*SZPDS); 55450 ADJACC := SOURDESC^.LBADJ; 55460 WITH SLICDESC^ DO 55470 BEGIN 55480 (*-02() FIRSTWORD := SORTSHIFT * ORD(REFSLN); ()-02*) 55490 (*+02() PCOUNT:=0; SORT:=REFSLN; ()+02*) 55500 ROWS := NOROWS-1; 55510 MDBLOCK := SOURDESC^.MDBLOCK; 55520 SIZE := SOURDESC^.SIZE 55530 END; 55540 END; 55550 (**) 55560 (**) 55570 PROCEDURE TRIMS (* SOURDESC, SLICDESC, SOURDEX, SLICDEX, ADJACC, 55580 REVISEDLB, SLICEPDS *); 55590 (* ALL PARAMETERS ARE GLOBAL SINCE THERE ARE TOO MANY TO BE PASSED IN *) 55600 (* THE X REGISTERS AND THE PROCEDURES ARE NON RECURSIVE *) 55610 BEGIN 55620 WITH SLICEPDS DO 55630 BEGIN 55640 ADJACC := ADJACC+(REVISEDLB-LI)*DI; 55650 UI:= UI+REVISEDLB-LI; 55660 LI := REVISEDLB; 55670 SLICDESC^.DESCVEC[SLICDEX] := SLICEPDS; 55680 END; 55690 SOURDEX:= SOURDEX+1; 55700 SLICDEX:= SLICDEX+1; 55710 END; 55720 (* *) 55730 PROCEDURE SLICEA(DEPTH: INTEGER) (* SOURDESC, SOURDEX, SLICEPDS*); 55740 (*PTRIM - [ ]*) 55750 BEGIN 55760 SLICEPDS := SOURDESC^.DESCVEC[SOURDEX]; 55770 SLICDESC^.DESCVEC[SLICDEX] := SLICEPDS; 55780 SOURDEX := SOURDEX+1; 55790 SLICDEX := SLICDEX+1; 55800 END; 55810 (* *) 55820 PROCEDURE SLICEB(DEPTH: INTEGER) (*SOURDESC, SLICDESC, SOURDEX, SLICDEX, STACKPOS *); 55830 (*PTRIM+1 - [@N]*) 55840 BEGIN 55850 SLICEPDS := SOURDESC^.DESCVEC[SOURDEX]; 55860 REVISEDLB := GETSTKTOP(SZINT, DEPTH); 55870 TRIMS; 55880 END; 55890 (* *) 55900 PROCEDURE SLICEC(DEPTH: INTEGER) (* ARGUEMENTS AS ABOVE *); 55910 (*PTRIM+2 - [ :U]*) 55920 BEGIN 55930 SLICEPDS := SOURDESC^.DESCVEC[SOURDEX]; 55940 REVISEDLB := 1; 55950 IF GETSTKTOP(SZINT, DEPTH)>SLICEPDS.UI THEN SLCMN(SOURDESC, GETSTKTOP(SZINT, DEPTH), SOURDEX); 55960 SLICEPDS.UI := GETSTKTOP(SZINT, DEPTH); 55970 TRIMS; 55980 END; 55990 (* *) 56000 PROCEDURE SLICED(DEPTH: INTEGER) (* AS ABOVE *); 56010 (*PTRIM+3 - [:U@N]*) 56020 BEGIN 56030 SLICEPDS := SOURDESC^.DESCVEC[SOURDEX]; 56040 REVISEDLB := GETSTKTOP(SZINT, DEPTH); 56050 IF GETSTKTOP(SZINT, DEPTH+SZINT)>SLICEPDS.UI THEN SLCMN(SOURDESC, GETSTKTOP(SZINT, SZINT), SOURDEX); 56060 SLICEPDS.UI := GETSTKTOP(SZINT, DEPTH+SZINT); 56070 TRIMS; 56080 END; 56090 (* *) 56100 PROCEDURE SLICEE(DEPTH: INTEGER) (* AS ABOVE *); 56110 (*PTRIM+4 - [L: ]*) 56120 BEGIN 56130 SLICEPDS := SOURDESC^.DESCVEC[SOURDEX]; 56140 REVISEDLB:= 1; 56150 IF GETSTKTOP(SZINT, DEPTH)SLICEPDS.UI THEN SLCMN(SOURDESC, GETSTKTOP(SZINT, DEPTH), SOURDEX); 56360 SLICEPDS.UI := GETSTKTOP(SZINT, DEPTH); 56370 IF GETSTKTOP(SZINT, DEPTH+SZINT)SLICEPDS.UI THEN SLCMN(SOURDESC, GETSTKTOP(SZINT, DEPTH+SZINT), SOURDEX); 56480 SLICEPDS.UI := GETSTKTOP(SZINT, DEPTH+SZINT); 56490 IF GETSTKTOP(SZINT, DEPTH+2*SZINT)UI) THEN 56690 SLCMN (SOURDESC , GETSTKTOP (SZINT , DEPTH) , SOURDEX ) ; 56700 ADJACC := ADJACC-GETSTKTOP(SZINT, DEPTH)*DI; 56710 END; 56720 SOURDEX:= SOURDEX+1; 56730 END; 56740 (**) 56750 (**) 56760 FUNCTION ENDSL(PRIMARY: OBJECTP) (* SLICDESC, ADJACC +) : OBJECTP; 56770 (*PENDSLICE*) 56780 BEGIN 56790 SLICDESC^.LBADJ := ADJACC; 56800 SLICDESC^.PVALUE := PRIMARY; 56810 ENDSL := SLICDESC 56820 END; 56830 ()-01*) 56840 (**) 56850 (**) 56860 (*-02() BEGIN END ; ()-02*) 56870 (*+01() 56880 BEGIN (*OF MAIN PROGRAM*) 56890 END (*OF EVERYTHING*). 56900 ()+01*)