ack/lang/a68s/liba68s/ensure.p
1988-10-04 13:41:01 +00:00

232 lines
7.6 KiB
OpenEdge ABL

71800 #include "rundecs.h"
71810 (* COPYRIGHT 1983 C.H.LINDSEY, UNIVERSITY OF MANCHESTER *)
71820 (**)
71830 PROCEDURE GARBAGE(ANOBJECT: OBJECTP); EXTERN;
71840 PROCEDURE ERRORR(N :INTEGER); EXTERN ;
71850 PROCEDURE CLPASC2(P1,P2: IPOINT; PROC: ASPROC); EXTERN;
71860 (**)
71870 (**)
71880 (*+01() (*$X4*) ()+01*)
71890 FUNCTION FUNC68(PB: ASNAKED; RF: OBJECTP): BOOLEAN; EXTERN;
71900 (**)
71910 (**)
71920 PROCEDURE NEWLINE(RF:OBJECTP); EXTERN;
71930 PROCEDURE NEWPAGE(RF:OBJECTP); EXTERN;
71940 (**)
71950 (**)
71960 PROCEDURE TESTF(RF:OBJECTP;VAR F:OBJECTP);
71970 BEGIN WITH RF^ DO
71980 CASE SORT OF
71990 REFN: F:=PVALUE;
72000 REFSL1: F := INCPTR(ANCESTOR^.PVALUE, OFFSET-STRUCTCONST);
72010 UNDEF: ERRORR(RDEREF);
72020 NILL: ERRORR(RDEREFNIL)
72030 END (*CASE*)
72040 END;
72050 (**)
72060 (**)
72070 FUNCTION GETPROC(RN: OBJECTP): ASNAKED;
72080 VAR TEMP: NAKEGER;
72090 BEGIN
72100 (*+01() TEMP.ASNAK := 0; ()+01*)
72110 WITH RN^, TEMP.NAK DO
72120 IF SORT=ROUTINE THEN
72130 BEGIN
72140 STOWEDVAL := ASPTR(ENVCHAIN); POINTER := ASPTR(ORD(PROCBL));
72150 IF FTST THEN GARBAGE(RN);
72160 END
72170 ELSE IF SORT=PASCROUT THEN
72180 BEGIN
72190 (*-01() STOWEDVAL := NIL; ()-01*)
72200 PASCPARAMS := PPARAMS; PASCPROC := PPROCBL ;
72210 POINTER := ASPTR(ORD(PASCADDR));
72220 IF FTST THEN GARBAGE(RN);
72230 END
72240 ELSE ERRORR(RROUTIN);
72250 GETPROC := TEMP.ASNAK;
72260 END;
72270 (**)
72280 (**)
72290 PROCEDURE SETREADMOOD(PCOV:OBJECTP);
72300 BEGIN WITH PCOV^ DO
72310 IF NOT([READMOOD]<=STATUS) THEN
72320 BEGIN IF NOT([GETPOSS]<=POSSIBLES)
72330 THEN ERRORR(NOREAD)
72340 ELSE IF [OPENED,WRITEMOOD,BINMOOD,NOTSET]<=STATUS THEN
72350 ERRORR(NOALTER)
72360 ELSE BEGIN (* BOOK NOT INITIALISED *)
72370 STATUS:=STATUS+[READMOOD]-[WRITEMOOD];
72380 IF NOTRESET IN STATUS THEN
72390 CLPASC2(ORD(PCOV), ORD(BOOK), DORESET)
72400 END;
72410 IF PFE IN STATUS THEN STATUS := STATUS-[PFE]+[LFE]
72420 (*ONLY APPLIES TO ASSOCIATED FILES FOR NOW*)
72430 END (* WITH *)
72440 END;
72450 (**)
72460 (**)
72470 PROCEDURE SETWRITEMOOD(PCOV:OBJECTP);
72480 BEGIN
72490 WITH PCOV^ DO
72500 IF NOT([WRITEMOOD]<=STATUS) THEN
72510 BEGIN IF NOT([PUTPOSS]<=POSSIBLES)
72520 THEN ERRORR(NOWRITE)
72530 ELSE IF [OPENED,READMOOD,BINMOOD,NOTSET]<=STATUS THEN
72540 ERRORR(NOALTER)
72550 ELSE BEGIN STATUS:=STATUS+[WRITEMOOD]-[READMOOD,LFE];
72560 IF NOTRESET IN STATUS THEN
72570 CLPASC2(ORD(PCOV), ORD(BOOK), DORESET)
72580 END;
72590 IF POFCPOS>PAGEBOUND THEN STATUS := STATUS+[PFE];
72600 END (* WITH *)
72610 END;
72620 (**)
72630 (**)
72640 PROCEDURE SETCHARMOOD(PCOV:OBJECTP);
72650 BEGIN WITH PCOV^ DO
72660 IF NOT([CHARMOOD]<=STATUS) THEN
72670 IF [OPENED,BINMOOD,NOTSET]<=STATUS
72680 THEN ERRORR(NOSHIFT)
72690 ELSE STATUS:=STATUS+[CHARMOOD]-[BINMOOD]
72700 END;
72710 (**)
72720 (**)
72730 PROCEDURE SETBINMOOD(PCOV:OBJECTP);
72740 BEGIN WITH PCOV^ DO
72750 IF NOT([BINMOOD]<=STATUS) THEN
72760 IF NOT([BINPOSS]<=POSSIBLES)
72770 THEN ERRORR(NOBIN)
72780 ELSE IF [OPENED,CHARMOOD,NOTSET]<=STATUS
72790 THEN ERRORR(NOSHIFT)
72800 ELSE STATUS:=STATUS+[BINMOOD]-[CHARMOOD]
72810 END;
72820 (**)
72830 (**)
72840 (*******ENSURE ROUTINES*******)
72850 (**)
72860 (**)
72870 PROCEDURE ENSSTATE(RF:OBJECTP;VAR F:OBJECTP;READING:STATUSSET);
72880 BEGIN TESTF(RF,F);
72890 WITH F^ DO
72900 IF NOT (READING<=PCOVER^.STATUS) THEN
72910 IF [OPENED]<=PCOVER^.STATUS
72920 THEN BEGIN
72930 IF [READMOOD]<=READING
72940 THEN SETREADMOOD(PCOVER)
72950 ELSE SETWRITEMOOD(PCOVER);
72960 IF [CHARMOOD]<=READING
72970 THEN SETCHARMOOD(PCOVER)
72980 ELSE SETBINMOOD(PCOVER)
72990 END
73000 ELSE ERRORR(NOTOPEN)
73010 END;
73020 (**)
73030 (**)
73040 FUNCTION ENSLOGICALFILE(RF:OBJECTP;VAR F:OBJECTP):BOOLEAN;
73050 (*MOOD OK, LOG FILE GENERALLY NOT*)
73060 VAR OLD: STATUSSET; MENDED: BOOLEAN;
73070 COV: OBJECTP;
73080 BEGIN WITH F^ DO
73090 BEGIN
73100 COV := PCOVER; WITH COV^ DO
73110 BEGIN
73120 IF NOTINITIALIZED IN STATUS THEN
73130 BEGIN
73140 CLPASC2(ORD(COV), ORD(BOOK), DONEWLINE);
73150 LOFCPOS := LOFCPOS-1;
73160 END;
73170 OLD := STATUS;
73180 END;
73190 IF LFE IN OLD THEN
73200 BEGIN
73210 IF LOGICALFILEMENDED=UNDEFIN THEN MENDED := FALSE
73220 ELSE MENDED:=FUNC68(GETPROC(LOGICALFILEMENDED),RF);
73230 ENSSTATE(RF,F,OLD);
73240 IF MENDED THEN
73250 ENSLOGICALFILE:=ENSLOGICALFILE(RF,F)
73260 ELSE ENSLOGICALFILE := FALSE
73270 END
73280 ELSE ENSLOGICALFILE:=TRUE;
73290 END
73300 END;
73310 (**)
73320 (**)
73330 FUNCTION ENSPHYSICALFILE(RF:OBJECTP;VAR F:OBJECTP):BOOLEAN;
73340 (* MOOD OK, FILE GENERALLY NOT *)
73350 VAR OLD: STATUSSET; MENDED,LFOK: BOOLEAN;
73360 BEGIN WITH F^ DO
73370 IF [LFE]<=PCOVER^.STATUS
73380 THEN LFOK:=ENSLOGICALFILE(RF,F)
73390 ELSE LFOK:=TRUE;
73400 IF LFOK THEN WITH F^ DO
73410 BEGIN OLD:=PCOVER^.STATUS;
73420 IF [PFE]<=OLD THEN
73430 BEGIN
73440 IF PHYSICALFILEMENDED=UNDEFIN THEN MENDED := FALSE
73450 ELSE MENDED:=FUNC68(GETPROC(PHYSICALFILEMENDED),RF);
73460 ENSSTATE(RF,F,OLD);
73470 IF MENDED
73480 THEN ENSPHYSICALFILE:=ENSPHYSICALFILE(RF,F)
73490 ELSE ERRORR(NOPHYSICAL);
73500 END
73510 ELSE ENSPHYSICALFILE:=TRUE
73520 END
73530 ELSE ENSPHYSICALFILE:=FALSE;
73540 END;
73550 (**)
73560 (**)
73570 FUNCTION ENSPAGE(RF:OBJECTP;VAR F:OBJECTP):BOOLEAN;
73580 (* MOOD OK, PAGE GENERALLY NOT *)
73590 VAR OLD: STATUSSET; PFOK,MENDED: BOOLEAN;
73600 BEGIN WITH F^ DO
73610 IF([PFE]<=PCOVER^.STATUS) OR ([LFE]<=PCOVER^.STATUS)
73620 THEN PFOK:=ENSPHYSICALFILE(RF,F)
73630 ELSE PFOK:=TRUE;
73640 IF PFOK THEN WITH F^ DO
73650 BEGIN OLD:=PCOVER^.STATUS;
73660 IF [PAGEOVERFLOW]<=OLD THEN
73670 BEGIN
73680 IF PAGEMENDED=UNDEFIN THEN MENDED := FALSE
73690 ELSE MENDED:=FUNC68(GETPROC(PAGEMENDED),RF);
73700 ENSSTATE(RF,F,OLD);
73710 IF NOT MENDED THEN NEWPAGE(RF);
73720 ENSPAGE:=ENSPAGE(RF,F)
73730 END
73740 ELSE ENSPAGE:=TRUE
73750 END
73760 ELSE ENSPAGE:=FALSE;
73770 END;
73780 (**)
73790 (**)
73800 FUNCTION ENSLINE(RF:OBJECTP;VAR F:OBJECTP):BOOLEAN;
73810 (* MOOD OK, LINE GENERALLY NOT *)
73820 VAR PAGEOK,MENDED:BOOLEAN; OLD: STATUSSET;
73830 BEGIN WITH F^ DO
73840 IF [PAGEOVERFLOW]<=PCOVER^.STATUS
73850 THEN PAGEOK:=ENSPAGE(RF,F)
73860 ELSE PAGEOK:=TRUE;
73870 IF PAGEOK THEN WITH F^ DO
73880 BEGIN OLD:=PCOVER^.STATUS;
73890 IF [LINEOVERFLOW]<=OLD THEN
73900 BEGIN
73910 IF LINEMENDED=UNDEFIN THEN MENDED := FALSE
73920 ELSE MENDED:=FUNC68(GETPROC(LINEMENDED),RF);
73930 ENSSTATE(RF,F,OLD);
73940 IF NOT MENDED THEN NEWLINE(RF);
73950 ENSLINE:=ENSLINE(RF,F)
73960 END
73970 ELSE ENSLINE:=TRUE
73980 END
73990 ELSE ENSLINE:=FALSE;
74000 END;
74010 (**)
74020 (**)
74030 (*-02()
74040 BEGIN (*OF A68*)
74050 END; (*OF A68*)
74060 ()-02*)
74070 (*+01()
74080 BEGIN (*OF MAIN PROGRAM*)
74090 END (* OF EVERYTHING *).
74100 ()+01*)