181 lines
		
	
	
	
		
			7.4 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
	
		
			7.4 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
| 31800 #include "rundecs.h"
 | |
| 31810     (*  COPYRIGHT 1983 C.H.LINDSEY, UNIVERSITY OF MANCHESTER  *)
 | |
| 31820 (**)
 | |
| 31830 (**)
 | |
| 31840 PROCEDURE GARBAGE (ANOBJECT: OBJECTP); EXTERN;
 | |
| 31850 PROCEDURE RANGEXT; EXTERN;
 | |
| 31860 (**)
 | |
| 31870 (**)
 | |
| 31880 PROCEDURE DORECGEN;
 | |
| 31890   VAR RECGEN, RECPOINT: OBJECTP;
 | |
| 31900     BEGIN
 | |
| 31910     RECGEN := FIRSTRG.RIBOFFSET^.FIRSTW.RECGEN;
 | |
| 31920     WHILE RECGEN<>NIL DO WITH RECGEN^ DO
 | |
| 31930         BEGIN
 | |
| 31940         FINC;
 | |
| 31950         WITH PVALUE^ DO FDEC;
 | |
| 31960         IF FPTST(PVALUE^) THEN GARBAGE(PVALUE);
 | |
| 31970         PVALUE := UNDEFIN;
 | |
| 31980         RECPOINT := RECGEN; RECGEN := NEXT;
 | |
| 31990         WITH RECPOINT^ DO BEGIN FDEC; IF FTST THEN GARBAGE(RECPOINT) END
 | |
| 32000         END
 | |
| 32010     END;
 | |
| 32020 (**)
 | |
| 32030 (**)
 | |
| 32040 FUNCTION GETOUT(TARGETRN: DEPTHRANGE; TARGETLEB: OFFSETRANGE; MAP: BITMAP; LOOPS: INTEGER): ASNAKED;
 | |
| 32050 (*PGETOUT - EXIT FROM ROUTINES UNTIL TARGET IS REACHED.
 | |
| 32060   MAP IS THE STACK TO BE LEFT STANDING*)
 | |
| 32070   VAR CURR, NECLEV, IB: IPOINT;
 | |
| 32080       BITP: BITMAP;
 | |
| 32090       PTR: OBJECTPP;
 | |
| 32100       I: INTEGER;
 | |
| 32110       XMODE: INTEGER; IBTYPE: (A68, PUT, GET, OTHER);
 | |
| 32120       PVAL: OBJECTP;
 | |
| 32130       TEMPOINT: RECORD CASE SEVERAL OF
 | |
| 32140         0: (POINT: INTPOINT);
 | |
| 32150         1: (PPOINT: OBJECTPP);
 | |
| 32160         2,3,4,5,6,7,8,9,10: ();
 | |
| 32170         END;
 | |
| 32180       TEMP: NAKEGER;
 | |
| 32190     BEGIN
 | |
| 32200     CURR := STATIC(ME);
 | |
| 32210     REPEAT
 | |
| 32220       NECLEV := (*-05()STATIC( CURR )()-05*)(*+05()STATICP+192()+05*) ;
 | |
| 32230       WHILE (*-41()(NECLEV>CURR) AND (NECLEV<ME)()-41*)(*+41()(NECLEV<CURR) AND (NECLEV>ME)()+41*) DO
 | |
| 32240         (*BYPASS ANY STATIC LEVELS CREATED BY SETNSTATIC*)
 | |
| 32250         (*-05() NECLEV:=STATIC(NECLEV) ; ()-05*)
 | |
| 32260         (*+05() BEGIN SETMYSTATIC( NECLEV ) ; NECLEV := STATICP+192 END ; ()+05*)
 | |
| 32270       REPEAT
 | |
| 32280         REPEAT
 | |
| 32290           IF ISA68(CURR) THEN
 | |
| 32300             BEGIN
 | |
| 32310             IBTYPE := A68;
 | |
| 32320             BITP := BITPATTERN;
 | |
| 32330             END
 | |
| 32340           ELSE
 | |
| 32350             BEGIN BITP.COUNT := 0; BITP.MASK := 0;
 | |
| 32360             IF ISPUT(CURR) THEN IBTYPE := PUT
 | |
| 32370             ELSE IF ISGET(CURR) THEN IBTYPE := GET
 | |
| 32380             ELSE IBTYPE := OTHER;
 | |
| 32390             END;
 | |
| 32400 (*-02()   IB := CURR; ()-02*)
 | |
| 32410 (*+02()   IB := ARGBASE(CURR); ()+02*)
 | |
| 32420           PTR := ASPTR(IB);
 | |
| 32430           CURR := DYNAMIC(CURR);
 | |
| 32440           SETMYSTATIC(CURR);
 | |
| 32450           WITH BITP DO
 | |
| 32460             BEGIN
 | |
| 32470             IF (CURR=NECLEV) AND (LEVEL=TARGETRN) THEN (*THIS IS TARGET ROUTINE*)
 | |
| 32480               BEGIN
 | |
| 32490               COUNT := COUNT-MAP.COUNT;
 | |
| 32500               FOR I := 1 TO MAP.COUNT DIV SZWORD DO MASK := MASK*2
 | |
| 32510               END;
 | |
| 32520             IF MASK<>0 THEN
 | |
| 32530               BEGIN
 | |
| 32540               PTR := INCPTR( PTR, (*-41()- ()-41*)COUNT - PARAMOFFSET ) ;
 | |
| 32550               FOR I := 1 TO COUNT DIV SZWORD DO
 | |
| 32560                 BEGIN
 | |
| 32570 (*+41()         PTR := INCPTR(PTR, -SZWORD); ()+41*)
 | |
| 32580                 IF MASK<0 THEN IF FPTST(PTR^^) THEN GARBAGE(PTR^);
 | |
| 32590 (*-41()         PTR := INCPTR(PTR, SZWORD); ()-41*)
 | |
| 32600                 MASK := MASK*2
 | |
| 32610                 END
 | |
| 32620               END
 | |
| 32630             ELSE IF IBTYPE IN [PUT, GET] THEN WITH TEMPOINT DO (*DESTROY DATA LIST OF PUT OR GET*)
 | |
| 32640               BEGIN
 | |
| 32650               POINT := ASPTR(IB-DLOFFSET); BITP.COUNT := POINT^;
 | |
| 32660               POINT := INCPTR(POINT, (*-41()-()-41*) BITP.COUNT);
 | |
| 32670               WHILE ORD(POINT) (*-41()<()-41*)(*+41()>()+41*) IB-DLOFFSET DO
 | |
| 32680                 BEGIN
 | |
| 32690                 XMODE := POINT^;
 | |
| 32700 (*-41()         POINT := INCPTR(POINT, SZWORD); ()-41*)
 | |
| 32710                 IF IBTYPE=PUT THEN
 | |
| 32720                   BEGIN
 | |
| 32730                   CASE XMODE OF
 | |
| 32740                     4,7,11,12,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31:
 | |
| 32750                       BEGIN
 | |
| 32760 (*+41()               POINT := INCPTR(POINT, -SZADDR); ()+41*)
 | |
| 32770                       PVAL := PPOINT^;
 | |
| 32780 (*-41()               POINT := INCPTR(POINT, SZADDR); ()-41*)
 | |
| 32790                       WITH PVAL^ DO
 | |
| 32800                         BEGIN FDEC; IF FTST THEN GARBAGE(PVAL) END;
 | |
| 32810                       END;
 | |
| 32820 (*+61()             1,3,5: POINT := INCPTR(POINT, (*+41()-()+41*) SZLONG); ()+61*)
 | |
| 32830                     14: POINT := INCPTR(POINT, (*+41()-()+41*) SZPROC);
 | |
| 32840                     2: POINT := INCPTR(POINT, (*+41()-()+41*) SZREAL);
 | |
| 32850                     0,6,8,9,10: POINT := INCPTR(POINT, (*+41()-()+41*) SZINT);
 | |
| 32860                     -1: (*NO ACTION*);
 | |
| 32870                     END;
 | |
| 32880                   END
 | |
| 32890                 ELSE
 | |
| 32900                   IF XMODE IN [0..13,15..31] THEN
 | |
| 32910                     BEGIN
 | |
| 32920 (*+41()             POINT := INCPTR(POINT, -SZADDR); ()+41*)
 | |
| 32930                     PVAL := PPOINT^;
 | |
| 32940 (*-41()             POINT := INCPTR(POINT, SZADDR); ()-41*)
 | |
| 32950                     WITH PVAL^ DO
 | |
| 32960                       BEGIN FDEC; IF FTST THEN GARBAGE(PVAL) END;
 | |
| 32970                     END
 | |
| 32980                   ELSE IF XMODE=14 THEN POINT := INCPTR(POINT, (*+41()-()+41*) SZPROC);
 | |
| 32990 (*+41()         POINT := INCPTR(POINT, -SZWORD); ()+41*)
 | |
| 33000                 END;
 | |
| 33010 (*-01()
 | |
| 33020               POINT := INCPTR(POINT, (*-41()+SZWORD()-41*)(*+41()-SZADDR()+41*));
 | |
| 33030               PVAL := PPOINT^; (*PVAL = THE .REF.FILE PARAMETER OF PUT/GET*)
 | |
| 33040               WITH PVAL^ DO
 | |
| 33050                 BEGIN FDEC; IF FTST THEN GARBAGE(PVAL) END;
 | |
| 33060 ()-01*)
 | |
| 33070               END
 | |
| 33080             END
 | |
| 33090           UNTIL ISA68(CURR);
 | |
| 33100           IF (CURR=NECLEV) AND (LEVEL=TARGETRN) THEN (*THIS IS TARGET ROUTINE*)
 | |
| 33110             WHILE ORD(FIRSTRG.RIBOFFSET)-CURR (*-41()>()-41*)(*+41()< -()+41*) TARGETLEB DO
 | |
| 33120               BEGIN RANGEXT; IF FIRSTRG.RIBOFFSET^.FIRSTW.RECGEN<>NIL THEN DORECGEN END
 | |
| 33130           ELSE BEGIN
 | |
| 33140             WHILE FIRSTRG.RIBOFFSET^.RIBOFFSET<>FIRSTRG.RIBOFFSET DO
 | |
| 33150               BEGIN RANGEXT; IF FIRSTRG.RIBOFFSET^.FIRSTW.RECGEN<>NIL THEN DORECGEN END;
 | |
| 33160             RANGEXT; (*FOR PARAMETERS RANGE*)
 | |
| 33170             END;
 | |
| 33180       UNTIL CURR=NECLEV
 | |
| 33190     UNTIL LEVEL=TARGETRN;
 | |
| 33200     FIRSTRG.RIBOFFSET^.FIRSTW.LOOPCOUNT := LOOPS;
 | |
| 33210 (*+01() TEMP.ASNAK := 0; ()+01*)
 | |
| 33220     IF IBTYPE IN [PUT, GET] THEN
 | |
| 33230       TEMP.NAK.STOWEDVAL :=
 | |
| 33240         ASPTR(IB (*-41()(*-01()-SZADDR()-01*)-()-41*)(*+41()+SZWORD+SZADDR+()+41*) BITP.COUNT-DLOFFSET)
 | |
| 33250     ELSE
 | |
| 33260       TEMP.NAK.STOWEDVAL := ASPTR(IB (*-41()-()-41*)(*+41()+()+41*) BITP.COUNT-PARAMOFFSET);
 | |
| 33270     TEMP.NAK.POINTER := ASPTR(CURR);
 | |
| 33280     GETOUT := TEMP.ASNAK;
 | |
| 33290     END;
 | |
| 33300 (**)
 | |
| 33310 (**)
 | |
| 33320 PROCEDURE GBSTK(BITP: BITMAP);
 | |
| 33330 (*PGBSTK*)
 | |
| 33340   VAR PTR: OBJECTP;
 | |
| 33350       I: INTEGER;
 | |
| 33360     BEGIN WITH BITP DO
 | |
| 33370       BEGIN
 | |
| 33380       IF MASK<>0 THEN
 | |
| 33390         BEGIN
 | |
| 33400         I := COUNT;
 | |
| 33410         WHILE I>0 DO
 | |
| 33420           BEGIN
 | |
| 33430           I := I-SZWORD;
 | |
| 33440           IF MASK<0 THEN 
 | |
| 33450             BEGIN PTR := ASPTR(GETSTKTOP(SZADDR, I)); IF FPTST(PTR^) THEN GARBAGE(PTR) END;
 | |
| 33460           MASK := MASK*2
 | |
| 33470           END
 | |
| 33480         END;
 | |
| 33490       END
 | |
| 33500     END;
 | |
| 33510 (**)
 | |
| 33520 (**)
 | |
| 33530 (*-02()
 | |
| 33540   BEGIN
 | |
| 33550   END ;
 | |
| 33560 ()-02*)
 | |
| 33570 (*+01()
 | |
| 33580 BEGIN (*OF MAIN PROGRAM*)
 | |
| 33590 END (*OF EVERYTHING*).
 | |
| 33600 ()+01*)
 |