690 lines
		
	
	
	
		
			26 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
			
		
		
	
	
			690 lines
		
	
	
	
		
			26 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
63000     (*  COPYRIGHT 1983 C.H.LINDSEY, UNIVERSITY OF MANCHESTER  *)
 | 
						|
63010 (**)
 | 
						|
63020 (*+84()
 | 
						|
63030 (**)
 | 
						|
63040 (**)
 | 
						|
63050                 (*MODE HANDLING*)
 | 
						|
63060                 (***************)
 | 
						|
63070 (**)
 | 
						|
63080 FUNCTION LENGTHEN(M: MODE; COUNT: INTEGER): MODE;
 | 
						|
63090 (*FUNCTION: RETURNS A LONG OR SHORT MODE DERIVED FROM M*)
 | 
						|
63100     BEGIN
 | 
						|
63110     LENGTHEN := M; (*DEFAULT*)
 | 
						|
63120     IF COUNT<0 THEN
 | 
						|
63130       SEMERR(ESE+06)  (*NO SHORT MODES IMPLEMENTED*)
 | 
						|
63140     ELSE BEGIN
 | 
						|
63150       (*WHEN LONG MODES ARE IMPLEMENTED, SPECIFIC TESTS MUST BE MADE HERE
 | 
						|
63160         FOR MDINT, MDREAL AND MDCOMPL, AND THE APPROPRIATE LONG VERSIONS RETURNED*)
 | 
						|
63170       IF COUNT>0 THEN
 | 
						|
63180 (*+61() IF (COUNT=1) AND (M=MDREAL) THEN LENGTHEN := MDLREAL
 | 
						|
63190         ELSE IF (COUNT=1) AND (M=MDCOMPL) THEN LENGTHEN := MDLCOMPL
 | 
						|
63200         ELSE ()+61*)
 | 
						|
63210         SEMERR(ESE+19)
 | 
						|
63220       END;
 | 
						|
63230     END;
 | 
						|
63240 (**)
 | 
						|
63250 (**)
 | 
						|
63260 FUNCTION TX (*-01() (M: MODE): XTYPE ()-01*);
 | 
						|
63270     BEGIN
 | 
						|
63280     IF M=MDCOMPL THEN TX := 4
 | 
						|
63290 (*+61() ELSE IF M=MDLCOMPL THEN TX := 5 ()+61*)
 | 
						|
63300     ELSE TX := MODEID[M^.MDV.MDID]
 | 
						|
63310     END;
 | 
						|
63320 (**)
 | 
						|
63330 (**)
 | 
						|
63340 PROCEDURE THIPMD(HIP, M: MODE);
 | 
						|
63350 (*FUNCTION: ENSURES THAT THE MODE M IS SUITABLE FOR HIPPING LIKE HIP*)
 | 
						|
63360     BEGIN WITH HIP^.MDV DO
 | 
						|
63370       IF MDID IN [MDIDSKIP,MDIDJUMP,MDIDNIL] THEN
 | 
						|
63380         BEGIN
 | 
						|
63390         IF MDID=MDIDJUMP THEN
 | 
						|
63400           IF M^.MDV.MDID=MDIDPROC THEN SEMERR(ESE+40) ELSE (*NO ACTION*)
 | 
						|
63410         ELSE IF MDID=MDIDNIL THEN
 | 
						|
63420           IF M^.MDV.MDID<>MDIDREF THEN SEMERR(ESE+21);
 | 
						|
63430         IF M^.MDV.MDID IN [MDIDCOVER,MDIDBNDS,MDIDABSENT] THEN SEMERR(ESE+33)
 | 
						|
63440             (*TO CATCH NOSEY PARKERS WHO TRY TO MANUFACTURE .FILES*)
 | 
						|
63450         END
 | 
						|
63460     END;
 | 
						|
63470 (**)
 | 
						|
63480 (**)
 | 
						|
63490 FUNCTION TUNITED(M: MODE): BOOLEAN;
 | 
						|
63500 (*FUNCTION: TESTS WHETHER M IS A UNITED MODE*)
 | 
						|
63510     BEGIN WITH M^ DO
 | 
						|
63520       IF MDV.MDID=MDIDROW THEN
 | 
						|
63530         TUNITED := TUNITED(MDPRRMD)
 | 
						|
63540       ELSE
 | 
						|
63550         TUNITED := (MDV.MDID>=MDIDOUT) AND (MDV.MDID<=MDIDROWS)
 | 
						|
63560     END;
 | 
						|
63570 (**)
 | 
						|
63580 (**)
 | 
						|
63590 PROCEDURE TCOLL;
 | 
						|
63600 (*FUNCTION: ENSURES THAT NO UNIT ON THE SUBSTACK IS A COLLATERAL*)
 | 
						|
63610   VAR SEMP: -1..SRSTKSIZE;
 | 
						|
63620     BEGIN
 | 
						|
63630     IF BALFLAG THEN SEMP := SRSUBP+1 ELSE SEMP := SRSEMP;
 | 
						|
63640     WHILE SEMP<=SRSEMP DO
 | 
						|
63650       BEGIN
 | 
						|
63660       IF SBCOLL IN SRSTK[SEMP].SB^.SBINF THEN SEMERR(ESE+18);
 | 
						|
63670       SEMP := SEMP+1
 | 
						|
63680       END
 | 
						|
63690     END;
 | 
						|
63700 (**)
 | 
						|
63710 (**)
 | 
						|
63720 FUNCTION DEPASCAL(PASC: MODE): MODE;
 | 
						|
63730  VAR TEMPM: MODE;
 | 
						|
63740      I: INTEGER;
 | 
						|
63750   BEGIN  WITH PASC^ DO BEGIN
 | 
						|
63760   ENEW(TEMPM, MDV.MDCNT*SZADDR + MODE1SIZE);
 | 
						|
63770   FOR I := 1 TO (MDV.MDCNT*SZADDR+MODE1SIZE) DIV SZWORD DO
 | 
						|
63780    TEMPM^.MDWORDS[I] := MDWORDS[I];
 | 
						|
63790   WITH TEMPM^ DO
 | 
						|
63800     BEGIN
 | 
						|
63810     MDV := MDVPROC;
 | 
						|
63820     MDV.MDCNT := PASC^.MDV.MDCNT;
 | 
						|
63830     MDLINK := PROCL
 | 
						|
63840     END;
 | 
						|
63850   PROCL := TEMPM;
 | 
						|
63860   FIND(PROCL, FALSE, MDV.MDCNT*SZADDR);
 | 
						|
63870   DEPASCAL := PROCL;
 | 
						|
63880   END
 | 
						|
63890   END;
 | 
						|
63900 (**)
 | 
						|
63910 (**)
 | 
						|
63920 PROCEDURE CGCSUPP(SB: PSB; M: MODE; ROWCOUNT: INTEGER);
 | 
						|
63930 (*FUNCTION: GENERATES CODE TO COERCE THE UNIT REPRESENTED BY SB TO THE MODE M ROWED ROWCOUNT TIMES.*)
 | 
						|
63940   VAR ROWM, NEWM: MODE;
 | 
						|
63950       WIDTYP: STATE;
 | 
						|
63960       OPCOD : POP;
 | 
						|
63970       I, PSPACE: INTEGER;
 | 
						|
63980     BEGIN WITH SB^ DO
 | 
						|
63990       BEGIN
 | 
						|
64000       WHILE SBMODE<>M DO WITH SBMODE^ DO
 | 
						|
64010         BEGIN
 | 
						|
64020         IF MDV.MDID=MDIDREF THEN
 | 
						|
64030           BEGIN
 | 
						|
64040           IF SBTYP=SBTVAR THEN SBTYP := SBTID
 | 
						|
64050           ELSE IF SBWEAKREF IN SBINF THEN SBINF := SBINF-[SBWEAKREF]
 | 
						|
64060           ELSE
 | 
						|
64070             BEGIN
 | 
						|
64080             GETTOTAL(SB); OPCOD := PDEREF;
 | 
						|
64090             GENOP(OPCOD,MDPRRMD,OLIST3,NIL);
 | 
						|
64100             IF GENDPOCV=OCVNONE THEN
 | 
						|
64110               EMITX2(OPCOD,OCVSB,ORD(SB),OCVRES,ORD(SB))
 | 
						|
64120             ELSE EMITX3(OPCOD,OCVSB,ORD(SB),GENDPOCV,GENDPVAL,OCVRES,ORD(SB))
 | 
						|
64130             END;
 | 
						|
64140           SBMODE := MDPRRMD;
 | 
						|
64150           END
 | 
						|
64160         ELSE IF MDV.MDDEPROC THEN
 | 
						|
64170           BEGIN
 | 
						|
64180           GETTOTAL(SB);
 | 
						|
64190           IF MDV.MDID=MDIDPROC THEN
 | 
						|
64200             CGDEPROC(SB)
 | 
						|
64210           ELSE (*MDV.MDID=MDIDPASC*)
 | 
						|
64220             CGPASC(SB, SB);
 | 
						|
64230           SBMODE := MDPRRMD;
 | 
						|
64240           END
 | 
						|
64250         ELSE BEGIN
 | 
						|
64260           GETTOTAL(SB);
 | 
						|
64270           IF MDV.MDID<=MDIDSTRNG THEN
 | 
						|
64280             BEGIN CASE MDV.MDID OF
 | 
						|
64290             MDIDINT  :  BEGIN WIDTYP := 0; NEWM := MDREAL END;
 | 
						|
64300 (*+61()     MDIDLINT :  BEGIN WIDTYP := 1; NEWM := MDLREAL END;   ()+61*)
 | 
						|
64310             MDIDREAL :  BEGIN WIDTYP := 2; NEWM := MDCOMPL END;
 | 
						|
64320 (*+61()     MDIDLREAL:  BEGIN WIDTYP := 3; NEWM := MDLCOMPL END;  ()+61*)
 | 
						|
64330             MDIDCHAR :  BEGIN WIDTYP := 4; NEWM := MDSTRNG END;
 | 
						|
64340             MDIDBITS :  BEGIN WIDTYP := 5; NEWM := ROWBOOL END;
 | 
						|
64350             MDIDBYTES:  BEGIN WIDTYP := 6; NEWM := ROWCHAR END;
 | 
						|
64360             MDIDSTRNG:  BEGIN WIDTYP := 7; NEWM := ROWCHAR END;
 | 
						|
64370             END;
 | 
						|
64380             EMITX2(PWIDEN+WIDTYP,OCVSB,ORD(SB),OCVRES,ORD(SB));
 | 
						|
64382             SBMODE := NEWM;
 | 
						|
64390             IF (SBMODE^.MDV.MDID=MDIDROW) AND (SBMODE^.MDPRRMD=M) AND (ROWCOUNT>0) THEN
 | 
						|
64400               BEGIN ROWCOUNT := ROWCOUNT-1; M := SBMODE END
 | 
						|
64410             END
 | 
						|
64420           ELSE IF MDV.MDID=MDIDPASC THEN
 | 
						|
64430             BEGIN
 | 
						|
64432             PSPACE := 0;
 | 
						|
64434             FOR I := 0 TO MDV.MDCNT-1 DO WITH MDPRCPRMS[I]^ DO
 | 
						|
64436               IF MDV.MDPILE THEN PSPACE := PSPACE+SZADDR ELSE PSPACE := PSPACE+MDV.MDLEN;
 | 
						|
64440             EMITX3(PLOADRTP, OCVSB, ORD(SB), OCVIMMED, PSPACE, OCVRES,ORD(SB));
 | 
						|
64450             SBMODE := DEPASCAL(SBMODE)
 | 
						|
64460             END
 | 
						|
64470           ELSE BEGIN
 | 
						|
64480             IF M<>MDERROR THEN MODERR(SBMODE, ESE+33);
 | 
						|
64490             SBMODE := M; SBTYP := SBTVOID;
 | 
						|
64500             END;
 | 
						|
64510           END;
 | 
						|
64520         END;
 | 
						|
64530       IF ROWCOUNT>0 THEN
 | 
						|
64540         BEGIN
 | 
						|
64550         GETTOTAL(SB);
 | 
						|
64560         IF SBMODE^.MDV.MDID=MDIDROW THEN
 | 
						|
64570           BEGIN
 | 
						|
64580           WITH SBMODE^ DO ROWM := FINDROW(MDPRRMD, MDV.MDCNT+ROWCOUNT);
 | 
						|
64590           EMITX3(PROWMULT, OCVSB, ORD(SB), OCVIMMED, ROWM^.MDV.MDCNT, OCVRES, ORD(SB))
 | 
						|
64600           END
 | 
						|
64610         ELSE
 | 
						|
64620           BEGIN
 | 
						|
64630           ROWM := FINDROW(SBMODE, ROWCOUNT);
 | 
						|
64640           GENDP(ROWM);
 | 
						|
64650           EMITX4(PROWNONMULT, OCVSB, ORD(SB), OCVIMMED, ROWM^.MDV.MDCNT, GENDPOCV, GENDPVAL, OCVRES, ORD(SB))
 | 
						|
64660           END;
 | 
						|
64670         SBMODE := ROWM;
 | 
						|
64680         END
 | 
						|
64690       END
 | 
						|
64700     END;
 | 
						|
64710 (**)
 | 
						|
64720 (**)
 | 
						|
64730 FUNCTION COSOFT(M: MODE): MODE;
 | 
						|
64740 (*FUNCTION: FINDS SOFTEST COERCION OF M*)
 | 
						|
64750     BEGIN
 | 
						|
64760     WHILE M^.MDV.MDDEPROC DO
 | 
						|
64770       M := M^.MDPRRMD;
 | 
						|
64780     COSOFT := M
 | 
						|
64790     END;
 | 
						|
64800 (**)
 | 
						|
64810 (**)
 | 
						|
64820 FUNCTION COMEEK(SRCM: MODE): MODE;
 | 
						|
64830 (*FUNCTION: MEEKLY COERCES SRCM AS FAR AS POSSIBLE
 | 
						|
64840     YIELDS THE MODE  REACHED.
 | 
						|
64850 *)
 | 
						|
64860   LABEL 9;
 | 
						|
64870     BEGIN
 | 
						|
64880     LASTPREF := MDVOID; LASTPROC := NIL; COERCLEN := 0;
 | 
						|
64890     WHILE SRCM<>NIL DO WITH SRCM^ DO
 | 
						|
64900       IF MDV.MDDEPROC THEN
 | 
						|
64910         BEGIN LASTPROC := SRCM; LASTPREF := SRCM; COERCLEN := COERCLEN+1; SRCM := MDPRRMD END
 | 
						|
64920       ELSE IF MDV.MDID=MDIDREF THEN
 | 
						|
64930         BEGIN LASTPREF := SRCM; COERCLEN := COERCLEN+1; SRCM := MDPRRMD END
 | 
						|
64940       ELSE GOTO 9;
 | 
						|
64950   9:COMEEK := SRCM
 | 
						|
64960     END;
 | 
						|
64970 (**)
 | 
						|
64980 (**)
 | 
						|
64990 FUNCTION COFIRM(SRCM, DSTM: MODE): MODE;
 | 
						|
65000 (*FUNCTION: FIRMLY COERCES SRCM AS FAR AS POSSIBLE IN THE DIRECTION OF DSTM.
 | 
						|
65010     YIELDS THE MODE (POSSIBLY DSTM) REACHED.
 | 
						|
65020 *)
 | 
						|
65030   LABEL 9;
 | 
						|
65040     BEGIN
 | 
						|
65050     LASTPREF := MDVOID; LASTPROC := NIL; COERCLEN := 0;
 | 
						|
65060     WHILE SRCM<>DSTM DO WITH SRCM^ DO
 | 
						|
65070       IF MDV.MDDEPROC THEN
 | 
						|
65080         BEGIN LASTPROC := SRCM; LASTPREF := SRCM; COERCLEN := COERCLEN+1; SRCM := MDPRRMD END
 | 
						|
65090       ELSE IF MDV.MDID=MDIDREF THEN
 | 
						|
65100         BEGIN LASTPREF := SRCM; COERCLEN := COERCLEN+1; SRCM := MDPRRMD END
 | 
						|
65110       ELSE IF MDV.MDID=MDIDPASC THEN
 | 
						|
65120         SRCM := DEPASCAL(SRCM)
 | 
						|
65130       ELSE GOTO 9;
 | 
						|
65140   9:COFIRM := SRCM
 | 
						|
65150     END;
 | 
						|
65160 (**)
 | 
						|
65170 (**)
 | 
						|
65180 FUNCTION COWEAK(M: MODE): MODE;
 | 
						|
65190 (*FUNCTION: FINDS WEAKEST COERCION OF M*)
 | 
						|
65200     BEGIN
 | 
						|
65210     M := COMEEK(M);
 | 
						|
65220     IF LASTPREF^.MDV.MDID=MDIDREF THEN
 | 
						|
65230       M := LASTPREF;
 | 
						|
65240     COWEAK := M
 | 
						|
65250     END;
 | 
						|
65260 (**)
 | 
						|
65270 (**)
 | 
						|
65280 FUNCTION TSTRENGTH(SRCM, DSTM: MODE): STRTYP;
 | 
						|
65290 (*FUNCTION: DETERMINES THE STRENGTH OF COERCION NECESSARY TO GET FROM SRCM TO DSTM*)
 | 
						|
65300     BEGIN
 | 
						|
65310     IF DSTM=SRCM THEN TSTRENGTH := STREMPTY
 | 
						|
65320     ELSE IF COSOFT(DSTM)=COSOFT(SRCM) THEN TSTRENGTH := STRSOFT
 | 
						|
65330     ELSE IF COWEAK(DSTM)=COWEAK(SRCM) THEN TSTRENGTH := STRWEAK
 | 
						|
65340     ELSE IF COMEEK(DSTM)=COMEEK(SRCM) THEN TSTRENGTH := STRMEEK
 | 
						|
65350     ELSE TSTRENGTH := STRFIRM
 | 
						|
65360     END;
 | 
						|
65370 (**)
 | 
						|
65380 (**)
 | 
						|
65390 FUNCTION BALMOIDS(M1, M2: MODE): MODE;
 | 
						|
65400 (*FUNCTION: RETURNS THE PIVOTAL MODE OF THE BALANCE M1/M2.
 | 
						|
65410     ON EXIT, M1COERC AND M2COERC CONTAIN THE NECESSARY STRENGTHS.
 | 
						|
65420 *)
 | 
						|
65430   VAR FIRMM1, FIRMM2: MODE;
 | 
						|
65440       LEN1, LEN2, DIFF, I: INTEGER;
 | 
						|
65450     BEGIN
 | 
						|
65460     M1COERC := STREMPTY; M2COERC := STREMPTY;
 | 
						|
65470     IF (M1^.MDV.MDID>=MDIDSKIP) AND (M1^.MDV.MDID<=MDIDNIL) THEN
 | 
						|
65480       BEGIN M1COERC := STRSTRONG; BALMOIDS := M2 END;
 | 
						|
65490     IF (M2^.MDV.MDID>=MDIDSKIP) AND (M2^.MDV.MDID<=MDIDNIL) THEN
 | 
						|
65500       BEGIN M2COERC := STRSTRONG; BALMOIDS := M1 END;
 | 
						|
65510     IF (M1COERC=STREMPTY) AND (M2COERC=STREMPTY) THEN
 | 
						|
65520     IF M1=M2 THEN BALMOIDS := M1
 | 
						|
65530     ELSE BEGIN
 | 
						|
65540       FIRMM1 := COFIRM(M1, NIL); LEN1 := COERCLEN;
 | 
						|
65550       FIRMM2 := COFIRM(M2, NIL); LEN2 := COERCLEN;
 | 
						|
65560       IF FIRMM1=FIRMM2 THEN
 | 
						|
65570         BEGIN
 | 
						|
65580         DIFF := LEN2-LEN1;
 | 
						|
65590         IF DIFF>=0 THEN
 | 
						|
65600           BEGIN FIRMM1 := M1; FIRMM2 := M2 END
 | 
						|
65610         ELSE
 | 
						|
65620           BEGIN FIRMM1 := M2; FIRMM2 := M1; DIFF := -DIFF END;
 | 
						|
65630         FOR I := DIFF-1 DOWNTO 0 DO
 | 
						|
65640           FIRMM2 := FIRMM2^.MDPRRMD;
 | 
						|
65650         WHILE FIRMM1<>FIRMM2 DO
 | 
						|
65660           IF FIRMM1^.MDV.MDID=MDIDPASC THEN
 | 
						|
65670             BEGIN
 | 
						|
65680             FIRMM1 := DEPASCAL(FIRMM1);
 | 
						|
65690             FIRMM2 := DEPASCAL(FIRMM2)
 | 
						|
65700             END
 | 
						|
65710           ELSE
 | 
						|
65720             BEGIN
 | 
						|
65730             FIRMM1 := FIRMM1^.MDPRRMD;
 | 
						|
65740             FIRMM2 := FIRMM2^.MDPRRMD
 | 
						|
65750             END;
 | 
						|
65760         M1COERC := TSTRENGTH(M1, FIRMM1);
 | 
						|
65770         M2COERC := TSTRENGTH(M2, FIRMM1);
 | 
						|
65780         BALMOIDS := FIRMM1
 | 
						|
65790         END
 | 
						|
65800       ELSE BEGIN
 | 
						|
65810         WITH FIRMM1^.MDV DO
 | 
						|
65820           IF MDID=MDIDROW THEN LEN1 := 100+MDCNT ELSE LEN1 := MODEID[MDID];
 | 
						|
65830         WITH FIRMM2^.MDV DO
 | 
						|
65840           IF MDID=MDIDROW THEN LEN2 := 100+MDCNT ELSE LEN2 := MODEID[MDID];
 | 
						|
65850         IF LEN1<LEN2 THEN (*STRONG COERCION, IF ANY, IS FROM M1 TO FIRMM2*)
 | 
						|
65860           BEGIN
 | 
						|
65870           M1COERC := STRSTRONG; M2COERC := TSTRENGTH(M2, FIRMM2);
 | 
						|
65880           BALMOIDS := FIRMM2;
 | 
						|
65890           END
 | 
						|
65900         ELSE
 | 
						|
65910           BEGIN
 | 
						|
65920           M1COERC := TSTRENGTH(M1, FIRMM1); M2COERC := STRSTRONG;
 | 
						|
65930           BALMOIDS := FIRMM1;
 | 
						|
65940           END;
 | 
						|
65950         END;
 | 
						|
65960       END
 | 
						|
65970     END;
 | 
						|
65980 (**)
 | 
						|
65990 (**)
 | 
						|
66000 PROCEDURE CGCOERCE(SB: PSB (*CONTAINING SOURCE MODE*); M: MODE (*DESTINATION MODE*));
 | 
						|
66010   VAR FIRMM, MM: MODE;
 | 
						|
66020       SB1, SB2: PSB;
 | 
						|
66030       MODENO: -1..31;
 | 
						|
66040       SPACE: 0..MAXSIZE;
 | 
						|
66050       I:0..MAXINT;
 | 
						|
66052       OPCOD: POP;
 | 
						|
66060     BEGIN WITH SB^ DO
 | 
						|
66070       IF SBMODE<>M THEN
 | 
						|
66080         BEGIN
 | 
						|
66090         FIRMM := COFIRM(SBMODE,M);
 | 
						|
66100         IF M=MDVOID THEN (*VOIDING COERCION NEEDED*)
 | 
						|
66110           BEGIN
 | 
						|
66120           IF (SBMORF IN SBINF) AND (LASTPROC<>NIL) THEN
 | 
						|
66130             CGCSUPP(SB, LASTPROC^.MDPRRMD, 0);
 | 
						|
66140           IF SBTYP>SBTDEN THEN (*THE VALUE IS ALREADY STORED SOMEWHERE*)
 | 
						|
66150             BEGIN
 | 
						|
66160             IF SBNAKED IN SBINF THEN BEGIN EMITX1(PVOIDNAKED,OCVSB,ORD(SB)); STACKSB(SB) END
 | 
						|
66180             ELSE IF SBMODE^.MDV.MDPILE THEN BEGIN EMITX1(PVOIDNORMAL,OCVSB,ORD(SB)); STACKSB(SB) END
 | 
						|
66182             ELSE IF SBTYP IN [SBTSTK..SBTSTKN] THEN EMITX1(PASP, OCVIMMED, SBMODE^.MDV.MDLEN);
 | 
						|
66190             END;
 | 
						|
66200           IF (SBVOIDWARN IN SBINF) AND (SBMODE<>MDVOID) THEN
 | 
						|
66210             OUTERR(ESE+10, WARNING, NIL);
 | 
						|
66220           SBINF := SBINF-[SBNAKED]; FILL(SBTVOID,SB);
 | 
						|
66230           END
 | 
						|
66240         ELSE IF TUNITED(M) THEN  (*TRANSPUT COERCION*)
 | 
						|
66250           BEGIN
 | 
						|
66260           FIRMM := COMEEK(SBMODE);
 | 
						|
66270           IF (FIRMM<>PRCVF) AND (FIRMM<>PASCVF) AND
 | 
						|
66280                 ((M=MDIN) OR (M=MDINB) OR (M=ROWIN) OR (M=ROWINB) OR (M=MDROWS)) THEN
 | 
						|
66290             MM := COWEAK(SBMODE)
 | 
						|
66300           ELSE IF FIRMM=MDSKIP THEN
 | 
						|
66310             BEGIN MM := MDCHAR; FIRMM := MM END (*TO FORCE A RUN-TIME ERROR*)
 | 
						|
66320           ELSE MM := FIRMM;
 | 
						|
66330           CGCOERCE(SB, MM);
 | 
						|
66340           IF M<>MDROWS THEN
 | 
						|
66350             BEGIN
 | 
						|
66360             IF FIRMM^.MDV.MDID=MDIDROW THEN
 | 
						|
66370               MODENO := TX(FIRMM^.MDPRRMD)+16
 | 
						|
66380             ELSE MODENO := TX(FIRMM);
 | 
						|
66390             SB1 := PUSHSB(MDINT); SB1^.SBTYP := SBTLIT; SB1^.SBVALUE := MODENO; TWIST; LOADSTK(SB1);
 | 
						|
66400 (*-01()     IF (M^.MDV.MDID=MDIDNUMBER) AND (MODENO=0(*INT*)) THEN
 | 
						|
66410               BEGIN
 | 
						|
66420               SB2 := PUSHSB(MDINT); SB2^.SBLEN := SZREAL-SZINT; SB2^.SBINF := SB2^.SBINF+[SBUNION]; SB2^.SBTYP := SBTLIT; SB1^.SBVALUE := 0; TWIST; LOADSTK(SB2);
 | 
						|
66430               GETTOTAL(SB); LOADSTK(SB);
 | 
						|
66440               COMBINE; SBTYP := SBTSTKN;
 | 
						|
66450               END;
 | 
						|
66460 ()-01*)
 | 
						|
66470             GETTOTAL(SB);
 | 
						|
66480             FOR I:= SBDELAYS-1 DOWNTO 0 DO CGRGXB(SB);(*DEAL WITH DELAYS*)
 | 
						|
66490             SBDELAYS:=0;LOADSTK(SB);
 | 
						|
66500             COMBINE; SBTYP := SBTSTKN; SBINF := SBINF+[SBUNION];
 | 
						|
66530             IF M^.MDV.MDID=MDIDROW THEN (*SINGLE UNIT TO BE ROWED TO A DATA LIST*)
 | 
						|
66540               BEGIN
 | 
						|
66550 (*+05()       IF (RTSTKDEPTH MOD 4)<>0 THEN
 | 
						|
66560                 BEGIN SB1 := PUSHSB(MDINT); SB1^.SBTYP := SBTLIT; SB1^.SBVALUE := TX(MDVOID);
 | 
						|
66570                 LOADSTK(SB1); COMBINE; SB^.SBTYP := SBTSTKN END;
 | 
						|
66580 ()+05*)
 | 
						|
66590               SPACE := SBLEN;
 | 
						|
66600               SB1 := PUSHSB(MDVOID); UNSTACKSB; SB1^.SBLEN := SPACE+SZDL;
 | 
						|
66610               EMITX3(PDATALIST, OCVSB, ORD(SB), OCVIMMED, SPACE, OCVRES, ORD(SB1));
 | 
						|
66620               SBLEN := SB1^.SBLEN; SBINF := SBINF-[SBUNION]; SBTYP := SB1^.SBTYP;
 | 
						|
66630               UNSTACKSB; DISPOSE(SRSTK[SRSEMP].SB); SRSEMP := SRSEMP-1; STACKSB(SB);
 | 
						|
66640               END
 | 
						|
66650             ELSE M := MM; (*SBMODE WILL BE MM, FOR BENEFIT OF STKMAP*)
 | 
						|
66660             END
 | 
						|
66670           ELSE GETTOTAL(SB)
 | 
						|
66680           END
 | 
						|
66690         ELSE WITH SBMODE^ DO
 | 
						|
66700           IF (MDV.MDID<MDIDSKIP) OR (MDV.MDID>MDIDNIL) THEN (*NOT HIP*)
 | 
						|
66710             WITH M^ DO
 | 
						|
66720               IF MDV.MDID<>MDIDROW THEN
 | 
						|
66730                 CGCSUPP(SB, M, 0)
 | 
						|
66740               ELSE IF COFIRM(SBMODE, MDPRRMD)=MDPRRMD THEN
 | 
						|
66750                 CGCSUPP(SB, MDPRRMD, MDV.MDCNT)
 | 
						|
66760               ELSE IF FIRMM^.MDV.MDID=MDIDROW THEN
 | 
						|
66770                 CGCSUPP(SB, FIRMM, MDV.MDCNT-FIRMM^.MDV.MDCNT)
 | 
						|
66780               ELSE
 | 
						|
66790                 CGCSUPP(SB, MDPRRMD, MDV.MDCNT)
 | 
						|
66800           ELSE CASE MDV.MDID OF
 | 
						|
66810             MDIDSKIP:
 | 
						|
66820               BEGIN UNSTACKSB;
 | 
						|
66830               IF M^.MDV.MDID=MDIDSTRUCT THEN
 | 
						|
66840                 BEGIN GENDP(M); EMITX2(PSKIPSTRUCT, GENDPOCV, GENDPVAL,OCVRES,ORD(SB)) END
 | 
						|
66850               ELSE
 | 
						|
66852                 BEGIN
 | 
						|
66854                 IF M^.MDV.MDPILE THEN OPCOD := PSKIP+1
 | 
						|
66856                 ELSE IF M^.MDV.MDLEN>SZINT THEN OPCOD := PSKIP+2
 | 
						|
66857                 ELSE OPCOD := PSKIP;
 | 
						|
66858                 EMITX1(OPCOD, OCVRES, ORD(SB));
 | 
						|
66859                 END;
 | 
						|
66860               END;
 | 
						|
66870             MDIDJUMP: (*NO ACTION*);
 | 
						|
66880             MDIDNIL: BEGIN UNSTACKSB; EMITX1(PNIL, OCVRES, ORD(SB)) END
 | 
						|
66890             END;
 | 
						|
66900         SBMODE := M
 | 
						|
66910         END
 | 
						|
66920     END;
 | 
						|
66930 (**)
 | 
						|
66940 (**)
 | 
						|
66950 PROCEDURE CGBALB(SB: PSB; M: MODE);
 | 
						|
66960 (*EACH UNIT TO BE BALANCED*)
 | 
						|
66970   VAR I:  INTEGER;
 | 
						|
66980       SB1: PSB;
 | 
						|
66990     BEGIN WITH SB^ DO
 | 
						|
67000       IF SBMODE<>MDJUMP THEN
 | 
						|
67010         BEGIN
 | 
						|
67012 (*+42() SETTEXTSTATE; ()+42*)
 | 
						|
67020         FIXUPF(SBXPTR);  (*SBXPTR WAS SET IN CGIBAL*)
 | 
						|
67030         STACKSB(SB);
 | 
						|
67040         CGCOERCE(SB, M);
 | 
						|
67050         FOR I := SBDELAYS-1 DOWNTO 0 DO CGRGXB(SB);
 | 
						|
67060         SBDELAYS := 0;
 | 
						|
67070         LOADTOTAL(SB);
 | 
						|
67080         IF SBUNION IN SBINF THEN
 | 
						|
67090           WHILE SBLEN<BALANLEN+SZWORD DO (*TO MAKE STKMAP HAPPY*)
 | 
						|
67100             BEGIN SB1 := PUSHSB(MDVOID); CGCOERCE(RTSTACK, M); COMBINE END;
 | 
						|
67110         IF (SBTYP=SBTDL) AND (SBLEN<BALANLEN) THEN
 | 
						|
67120           BEGIN
 | 
						|
67130           EMITX1(PHOIST, OCVIMMED, BALANLEN-SBLEN);
 | 
						|
67140           RTSTKDEPTH := RTSTKDEPTH+BALANLEN-SBLEN;
 | 
						|
67150           SBLEN := BALANLEN;
 | 
						|
67160           END;
 | 
						|
67170         UNSTACKSB;
 | 
						|
67180         IF SB<>SRSTK[SRSEMP].SB THEN
 | 
						|
67190           GENFLAD
 | 
						|
67200         END
 | 
						|
67210     END;
 | 
						|
67220 (**)
 | 
						|
67230 (**)
 | 
						|
67240 FUNCTION COERCE (*-01() (M: MODE): MODE ()-01*);
 | 
						|
67250 (*FUNCTION: GENERATE CODE TO PERFORM THE APPROPRIATE COERCIONS FOR THE UNIT ON THE STACK.
 | 
						|
67260     REDUCES THE STACK TO CONTAIN A SINGLE BLOCK REPRESENTING THE RESULTING UNIT.
 | 
						|
67270     RETURNS M UNALTERED ???
 | 
						|
67280 *)
 | 
						|
67290   VAR SEMP: -1..SRSTKSIZE;
 | 
						|
67300       NOTJUMP: BOOLEAN;
 | 
						|
67310       I: INTEGER;
 | 
						|
67320     BEGIN
 | 
						|
67330     IF BALFLAG THEN
 | 
						|
67340       BEGIN
 | 
						|
67350       STARTCHAIN;
 | 
						|
67360       SEMP := SRSUBP+1;
 | 
						|
67370       WHILE SEMP<=SRSEMP DO WITH SRSTK[SEMP] DO
 | 
						|
67380         BEGIN
 | 
						|
67390         THIPMD(SB^.SBMODE, M);
 | 
						|
67400         CGBALB(SB, M);
 | 
						|
67410         IF SEMP<>SRSEMP THEN DISPOSE(SB);
 | 
						|
67420         SEMP := SEMP+1
 | 
						|
67430         END;
 | 
						|
67440       SUBREST;
 | 
						|
67450       SRSEMP := SRSEMP+1; SRSTK[SRSEMP] := SRSTK[SEMP-1]; (*AS KEPT*)
 | 
						|
67460       STACKSB(SRSTK[SRSEMP].SB);
 | 
						|
67470       CGBALC;
 | 
						|
67480       BALFLAG := FALSE;
 | 
						|
67490       END
 | 
						|
67500     ELSE WITH SRSTK[SRSEMP] DO WITH SB^ DO
 | 
						|
67510       BEGIN
 | 
						|
67520       THIPMD(SBMODE, M);
 | 
						|
67530       NOTJUMP := SBMODE<>MDJUMP;
 | 
						|
67540       CGCOERCE(SB, M);
 | 
						|
67550       IF NOTJUMP THEN WITH SB^ DO
 | 
						|
67560         FOR I := SBDELAYS-1 DOWNTO 0 DO CGRGXB(SB);
 | 
						|
67570       SBDELAYS := 0
 | 
						|
67580       END;
 | 
						|
67590     WITH SRSTK[SRSEMP].SB^ DO SBINF := SBINF-[SBMORF];
 | 
						|
67600     COERCE := M
 | 
						|
67610     END;
 | 
						|
67620 (**)
 | 
						|
67630 (**)
 | 
						|
67640 FUNCTION BALANCE(STRENGTH: STRTYP): MODE;
 | 
						|
67650 (*FUNCTION: DEDUCES THE MODE OF THE BALANCE ON THE SUBSTACK.
 | 
						|
67660     COMPLAINS IF STRENGTH IS INSUFFICIENT.
 | 
						|
67670     RETURNS THE MODE OF THE BALANCE.
 | 
						|
67680 *)
 | 
						|
67690   VAR COMM, M: MODE;
 | 
						|
67700       SEMP: -1..SRSTKSIZE;
 | 
						|
67710     BEGIN
 | 
						|
67720     IF BALFLAG THEN SEMP := SRSUBP+1 ELSE SEMP := SRSEMP;
 | 
						|
67730     COMM := SRSTK[SEMP].SB^.SBMODE;
 | 
						|
67740     WITH COMM^.MDV DO
 | 
						|
67750       IF (MDID<MDIDSKIP) OR (MDID>MDIDNIL) (*NOT HIPMODE*) THEN BALSTR := STREMPTY
 | 
						|
67760       ELSE BALSTR := STRSTRONG;
 | 
						|
67770     WHILE SEMP<SRSEMP DO
 | 
						|
67780       BEGIN
 | 
						|
67790       SEMP := SEMP+1;
 | 
						|
67800       COMM := BALMOIDS(COMM, SRSTK[SEMP].SB^.SBMODE);
 | 
						|
67810       IF BALSTR<M1COERC THEN BALSTR := M1COERC;
 | 
						|
67820       IF BALSTR>M2COERC THEN BALSTR := M2COERC;
 | 
						|
67830       END;
 | 
						|
67840     IF BALSTR>STRENGTH THEN
 | 
						|
67850       IF (STRENGTH=STRFIRM) AND (COMM^.MDV.MDID=MDIDROW) THEN
 | 
						|
67860         COMM := MDROWS
 | 
						|
67870       ELSE BEGIN
 | 
						|
67880         CASE STRENGTH OF
 | 
						|
67890           STRSOFT:  SEMERR(ESE+26);
 | 
						|
67900           STRWEAK:  SEMERR(ESE+27);
 | 
						|
67910           STRMEEK:  SEMERR(ESE+28);
 | 
						|
67920           STRFIRM:  SEMERR(ESE+29);
 | 
						|
67930           END;
 | 
						|
67940         COMM := MDERROR;
 | 
						|
67950         END;
 | 
						|
67960     BALANCE := COMM
 | 
						|
67970     END;
 | 
						|
67980 (**)
 | 
						|
67990 (**)
 | 
						|
68000 FUNCTION SOFT: MODE;
 | 
						|
68010 (*FUNCTION: PERFORMS SOFTEST COERCION ON UNIT OR BALANCE ON THE STACK*)
 | 
						|
68020     BEGIN
 | 
						|
68030     TCOLL;
 | 
						|
68040     SOFT := COERCE(COSOFT(BALANCE(STRSOFT)))
 | 
						|
68050     END;
 | 
						|
68060 (**)
 | 
						|
68070 (**)
 | 
						|
68080 FUNCTION WEAK: MODE;
 | 
						|
68090 (*FUNCTION: PERFORMS WEAKEST COERCION ON UNIT OR BALANCE ON THE STACK*)
 | 
						|
68100     BEGIN
 | 
						|
68110     TCOLL;
 | 
						|
68120     WEAK := COERCE(COWEAK(BALANCE(STRWEAK)))
 | 
						|
68130     END;
 | 
						|
68140 (**)
 | 
						|
68150 (**)
 | 
						|
68160 FUNCTION FIRMBAL: MODE;
 | 
						|
68170 (*FUNCTION: PERFORMS FIRM BALANCE (BUT DOES NOT COERCE)*)
 | 
						|
68180     BEGIN
 | 
						|
68190     TCOLL;
 | 
						|
68200     FIRMBAL := COFIRM(BALANCE(STRFIRM), NIL);
 | 
						|
68210     END;
 | 
						|
68220 (**)
 | 
						|
68230 (**)
 | 
						|
68240 FUNCTION MEEK: MODE;
 | 
						|
68250 (*FUNCTION: PERFORMS FIRMEST COERCION ON UNIT OR BALANCE ON THE STACK*)
 | 
						|
68260     BEGIN
 | 
						|
68270     TCOLL;
 | 
						|
68280     MEEK := COERCE(COMEEK(BALANCE(STRMEEK)));
 | 
						|
68290     END;
 | 
						|
68300 (**)
 | 
						|
68310 (**)
 | 
						|
68320 FUNCTION UNITESTO(SRCM, DSTM: MODE): BOOLEAN;
 | 
						|
68330 (*DSTM MUST BE ONE OF THE TRANSPUT MODES OUT, IN, OUT, INB OR NUMBER.
 | 
						|
68340   FUNCTION: DETERMINES WHETHER SRCM CAN BE UNITED TO DSTM.
 | 
						|
68350 *)
 | 
						|
68360   LABEL 9;
 | 
						|
68370   VAR WEAKM, MEEKM: MODE;
 | 
						|
68380     BEGIN
 | 
						|
68390     IF SRCM=MDERROR THEN
 | 
						|
68400       BEGIN UNITESTO := TRUE; GOTO 9 END;
 | 
						|
68410     IF DSTM^.MDV.MDID=MDIDROW THEN
 | 
						|
68420       IF SRCM=DSTM THEN
 | 
						|
68430         BEGIN UNITESTO := TRUE; GOTO 9 END
 | 
						|
68440       ELSE DSTM := DSTM^.MDPRRMD;
 | 
						|
68450     WEAKM := COWEAK(SRCM); MEEKM := COMEEK(WEAKM);
 | 
						|
68460     UNITESTO := FALSE;
 | 
						|
68470     WITH DSTM^.MDV DO
 | 
						|
68480       IF (MDID>=MDIDOUT) AND (MDID<=MDIDNUMBER) (*A UNITED MODE*) THEN
 | 
						|
68490         CASE MDID OF
 | 
						|
68500           MDIDOUT:
 | 
						|
68510             IF (MEEKM=PRCVF) OR (MEEKM=PASCVF) OR (MEEKM^.MDV.MDIO) THEN UNITESTO := TRUE;
 | 
						|
68520           MDIDIN:
 | 
						|
68530             IF (MEEKM=PRCVF) OR (MEEKM=PASCVF) THEN UNITESTO := TRUE
 | 
						|
68540             ELSE IF WEAKM^.MDV.MDID=MDIDREF THEN
 | 
						|
68550               UNITESTO := MEEKM^.MDV.MDIO;
 | 
						|
68560           MDIDOUTB:
 | 
						|
68570             UNITESTO := MEEKM^.MDV.MDIO;
 | 
						|
68580           MDIDINB:
 | 
						|
68590             IF WEAKM^.MDV.MDID=MDIDREF THEN
 | 
						|
68600               UNITESTO := MEEKM^.MDV.MDIO;
 | 
						|
68610           MDIDNUMBER:
 | 
						|
68620             IF MEEKM^.MDV.MDID<=MDIDLREAL THEN UNITESTO := TRUE
 | 
						|
68630           END;
 | 
						|
68640  9: END;
 | 
						|
68650 (**)
 | 
						|
68660 (**)
 | 
						|
68670 FUNCTION UNITEDBAL(M: MODE): BOOLEAN;
 | 
						|
68680 (*FUNCTION: DETERMINES WHETHER THE UNIT OR BALANCE ON THE STACK CAN BE
 | 
						|
68690     UNITED TO THE TRANSPUT MODE M.
 | 
						|
68700 *)
 | 
						|
68710   VAR SEMP: -1..SRSTKSIZE;
 | 
						|
68720       BALCOUNT: INTEGER;
 | 
						|
68730     BEGIN
 | 
						|
68740     BALCOUNT := 0;
 | 
						|
68750     BALANLEN := 0;
 | 
						|
68760     IF BALFLAG THEN SEMP := SRSUBP+1 ELSE SEMP := SRSEMP;
 | 
						|
68770     WHILE SEMP<=SRSEMP DO WITH SRSTK[SEMP] DO WITH SB^ DO
 | 
						|
68780       BEGIN
 | 
						|
68790       IF UNITESTO(SBMODE, M) THEN BALCOUNT := BALCOUNT+1
 | 
						|
68800       ELSE IF (SBMODE^.MDV.MDID<MDIDSKIP) OR (SBMODE^.MDV.MDID>MDIDNIL) THEN BALCOUNT := -MAXINT;
 | 
						|
68810       IF SBLEN>BALANLEN THEN BALANLEN := SBLEN;
 | 
						|
68820       SEMP := SEMP+1
 | 
						|
68830       END;
 | 
						|
68840     UNITEDBAL := BALCOUNT>0
 | 
						|
68850     END;
 | 
						|
68860 (**)
 | 
						|
68870 (**)
 | 
						|
68880 PROCEDURE STRONG;
 | 
						|
68890 (*FUNCTION: STRONGLY COERCES THE UNIT OR BALANCE ON THE STACK AS FAR AS  THE
 | 
						|
68900     MODE ON THE SC CHAIN.
 | 
						|
68910     WHEN THE A POSTERIORI MODE IS VOID IT IS POSSIBLE TO GENERATE DIRECTLY THE COERCION CODE
 | 
						|
68920     WITHOUT CALLING A BALANCING ROUTINE. THIS IS DUE TO THE FACT THAT ALL MODES CAN BE STRONGLY
 | 
						|
68930     COERCED TO VOID. HOWEVER, COLLATERAL-CLAUSES MAY NOT APPEAR IN STRONG VOID CONTEXTS.
 | 
						|
68940 *)
 | 
						|
68950   VAR M, M1: MODE;
 | 
						|
68960     BEGIN
 | 
						|
68970     M := SCPOP;
 | 
						|
68980     IF M=MDVOID THEN
 | 
						|
68990       TCOLL
 | 
						|
69000     ELSE WITH M^ DO
 | 
						|
69010       BEGIN
 | 
						|
69020       IF MDV.MDID=MDIDROW THEN M1 := MDPRRMD ELSE M1 := M;
 | 
						|
69030       WITH M1^.MDV DO IF (MDID>=MDIDOUT) AND (MDID<=MDIDNUMBER) (*UNITEDMODE*) THEN
 | 
						|
69040         IF NOT UNITEDBAL(M) THEN
 | 
						|
69050           BEGIN
 | 
						|
69060           SEMERR(ESE+31);
 | 
						|
69070           M := MDERROR
 | 
						|
69080           END
 | 
						|
69090       END;
 | 
						|
69100     M := COERCE(M)
 | 
						|
69110     END;
 | 
						|
69120 (**)
 | 
						|
69130 (**)
 | 
						|
69140 PROCEDURE SETBALFLAG;
 | 
						|
69150 (*FUNCTION: SETS THE BALANCE FLAG (BALFLAG) FOR THE VALUE OF A RANGE.
 | 
						|
69160     IF THE RANGE VALUE MAY BE ANY OF A NUMBER (>1) UNITS THEN THE FLAG IS SET AND THE STACK HOLDS
 | 
						|
69170     A MARK PLUS THE BLOCKS FOR THE UNITS. F THE RANGE VALUE IS A SINGLE UNIT,
 | 
						|
69180     THE FLAG IS CLEARED AND THE STACK HOLDS ONLY THE SINGLE BLOCK.
 | 
						|
69190 *)
 | 
						|
69200   VAR T: PSB;
 | 
						|
69210     BEGIN
 | 
						|
69220     IF SRSEMP<>SRSUBP+1 (*NOT ONE UNIT*) THEN
 | 
						|
69230       BALFLAG := TRUE
 | 
						|
69240     ELSE BEGIN
 | 
						|
69250       T := SRSTK[SRSEMP].SB; SRSEMP := SRSEMP-1;
 | 
						|
69260       SUBREST;
 | 
						|
69270       SRSEMP := SRSEMP+1; SRSTK[SRSEMP].SB := T
 | 
						|
69280       END
 | 
						|
69290     END;
 | 
						|
69300 (**)
 | 
						|
69310 (**)
 | 
						|
69320 PROCEDURE INNERBAL;
 | 
						|
69330 (*FUNCTION: EXECUTED AFTER PROCESSING AN "INNER UNIT" OF A BALANCE.
 | 
						|
69340     EVERY BALANCE CONSISTS OF ONE OR MORE UNITS WHICH ARE EVENTUALLY BALANCED.
 | 
						|
69350     EACH UNIT EXCEPT THE LAST IS CALLED AN INNER UNIT. NOTE THAT EACH UNIT IN A BALANCE MAY IN FACT
 | 
						|
69360     BE A SINGLE BASIC (NON-BALANCE) UNIT OR A SEQUENCE OF BASIC UNITS WHICH RESULTED FROM SOME BALANCE.
 | 
						|
69370 *)
 | 
						|
69380   VAR I: INTEGER; T: -1..SRSTKSIZE;
 | 
						|
69390     BEGIN
 | 
						|
69400     IF NOT BALFLAG THEN CGIBAL
 | 
						|
69410     ELSE BEGIN
 | 
						|
69420       BALFLAG := FALSE;
 | 
						|
69430       T := SRSTK[SRSUBP].SUBP;
 | 
						|
69440       FOR I := SRSUBP TO SRSEMP-1 DO
 | 
						|
69450         SRSTK[I] := SRSTK[I+1];
 | 
						|
69460       SRSEMP := SRSEMP-1;
 | 
						|
69470       SRSUBP := T
 | 
						|
69480       END
 | 
						|
69490     END;
 | 
						|
69500 (**)
 | 
						|
69510 (**)
 | 
						|
69520 PROCEDURE LASTIBAL;
 | 
						|
69530 (*FUNCTION: CALLS INNERBAL IF NECESSARY*)
 | 
						|
69540     BEGIN
 | 
						|
69550     IF (BALFLAG) OR (SRSEMP<>SRSUBP+1) THEN INNERBAL
 | 
						|
69560     END;
 | 
						|
69570 (**)
 | 
						|
69580 (**)
 | 
						|
69590 PROCEDURE MEEKLOAD(M: MODE; ERR: INTEGER);
 | 
						|
69600 (*EXPECTS THE MAXIMUM COERCION OF THE STACKED UNIT OR BALANCE TO BE M*)
 | 
						|
69610   VAR M1: MODE;
 | 
						|
69620     BEGIN
 | 
						|
69630     M1 := MEEK;
 | 
						|
69640     IF M1<>M THEN MODERR(M1, ERR);
 | 
						|
69650     CGFIRM
 | 
						|
69660     END;
 | 
						|
69670 (**)
 | 
						|
69680 (**)
 | 
						|
69690 PROCEDURE GETOPDM(PROCM: MODE);
 | 
						|
69700 (*FUNCTION: PROCM IS THE MODE OF SOME OPERATOR.
 | 
						|
69710       SETS LHMODE AND RHMODE.*)
 | 
						|
69720     BEGIN WITH PROCM^ DO
 | 
						|
69730       IF MDV.MDCNT=1 THEN
 | 
						|
69740         BEGIN LHMODE := MDABSENT; RHMODE := MDPRCPRMS[0] END
 | 
						|
69750       ELSE
 | 
						|
69760         BEGIN LHMODE := MDPRCPRMS[0]; RHMODE := MDPRCPRMS[1] END
 | 
						|
69770     END;
 | 
						|
69780 (**)
 | 
						|
69790 ()+84*)
 |