476 lines
		
	
	
	
		
			18 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
			
		
		
	
	
			476 lines
		
	
	
	
		
			18 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
83300 #include "rundecs.h"
 | 
						|
83310     (*  COPYRIGHT 1983 C.H.LINDSEY, UNIVERSITY OF MANCHESTER  *)
 | 
						|
83320  (**)
 | 
						|
83330 PROCEDURE CL68(PB: ASNAKED; RF: OBJECTP); EXTERN ;
 | 
						|
83340 PROCEDURE GARBAGE (ANOBJECT: OBJECTP); EXTERN ;
 | 
						|
83350 PROCEDURE FORMPDESC(OLDESC: OBJECTP; VAR PDESC1: PDESC); EXTERN ;
 | 
						|
83360 FUNCTION NEXTEL(I: INTEGER; VAR PDESC1: PDESC): BOOLEAN; EXTERN ;
 | 
						|
83370 PROCEDURE ERRORR(N :INTEGER); EXTERN ;
 | 
						|
83380 FUNCTION CRSTRING(LENGTH: OFFSETRANGE): OBJECTP; EXTERN ;
 | 
						|
83390 FUNCTION GETPROC(RN: OBJECTP): ASNAKED; EXTERN ;
 | 
						|
83400 PROCEDURE TESTF(RF:OBJECTP;VAR F:OBJECTP); EXTERN;
 | 
						|
83410 FUNCTION ENSLINE(RF:OBJECTP;VAR F:OBJECTP):BOOLEAN; EXTERN;
 | 
						|
83420 PROCEDURE ENSSTATE(RF:OBJECTP;VAR F:OBJECTP;READING:STATUSSET); EXTERN;
 | 
						|
83430 FUNCTION ENSPAGE(RF:OBJECTP;VAR F:OBJECTP):BOOLEAN; EXTERN;
 | 
						|
83440 (**)
 | 
						|
83450 PROCEDURE CLPASC1(P1: IPOINT; PROC: ASPROC); EXTERN;
 | 
						|
83460 PROCEDURE CLPASC5(P1,P2 :IPOINT; P3,P4 :INTEGER; P5 :IPOINT; PROC: ASPROC); EXTERN;
 | 
						|
83470 FUNCTION NXTBIT(VAR N: INTEGER): INTEGER; EXTERN;
 | 
						|
83480 (**)
 | 
						|
83490 (**)
 | 
						|
83500 (*+01() (*$X6*) ()+01*) (*ONLY USED WITH PROC*)
 | 
						|
83510 (*+01() FUNCTION TIMESTEN(T, E: INTEGER): REAL ; EXTERN ; ()+01*)
 | 
						|
83520 (*+05() FUNCTION TIMESTEN( T: REAL; E: INTEGER ): REAL ; EXTERN ; ()+05*)
 | 
						|
83530 (*+01() (*$X4*) ()+01*)
 | 
						|
83540 (**)
 | 
						|
83550 (**)
 | 
						|
83560 FUNCTION SUBFIXED(SIGN,   (*0 OR 1 OR -1 FOR SPACE TO BE PROVIDED FOR SIGN*)
 | 
						|
83570                   BEFORE, (*DIGITS (POSSIBLY SUPPRESSED) REQUIRED BEFORE DECIMAL POINT;
 | 
						|
83580                             -VE MEANS AS MANY AS NECESSARY*)
 | 
						|
83590                   POINT,  (*0 OR 1 FOR SPACE TO BE PROVIDED FOR DECIMAL POINT*)
 | 
						|
83600                   AFTER  (*DIGITS AFTER DECIMAL POINT*)
 | 
						|
83610                         : INTEGER;
 | 
						|
83620               VAR EXP: INTEGER; (*TO RECEIVE DECIMAL EXPONENT IF EXPNEEDED*)
 | 
						|
83630                   EXPNEEDED: BOOLEAN;
 | 
						|
83640                   X: REALTEGER;
 | 
						|
83650                   R: BOOLEAN; (*TRUE IF X IS REALLY .REAL*)
 | 
						|
83660               VAR S: OBJECTP; (*NIL IF A NEW STRING IS TO BE CREATED;
 | 
						|
83670                                 OTHERWISE, A STRING WHOSE CHARVEC IS TO RECEIVE THE RESULT
 | 
						|
83680                                 (AND WHICH MUST BE LONG ENOUGH)*)
 | 
						|
83690                   START: INTEGER (*FIRST INDEX OF S TO BE USED*)
 | 
						|
83700                  ): BOOLEAN;
 | 
						|
83710   LABEL 999;
 | 
						|
83720   CONST POWOF2 = (*+01() 2000000000000000000B; (* 2^55 = 36028797018963968.0 *) ()+01*)
 | 
						|
83730                          (*TWO TO THE POWER (NO. OF DIGITS IN MANTISSA)+7*)
 | 
						|
83740                  (*+02() 1.0; ()+02*)
 | 
						|
83750                  (*+05() 1.0; ()+05*)
 | 
						|
83760         POWOF2OVER10 = (*+01() 146314631463146315B; (* ROUND( 2^55 / 10 ) = 3602879701896397.0 *) ()+01*)
 | 
						|
83770                                (*CAREFULLY ROUNDED UP*)
 | 
						|
83780                        (*+02() 0.1; ()+02*)
 | 
						|
83790                        (*+05() 0.1; ()+05*)
 | 
						|
83800 (*+44()  TYPE MINT = INTEGER; ()+44*)
 | 
						|
83810   VAR L, M, BLANKS, PT, FIRSTDIG, INDEX: INTEGER;
 | 
						|
83820   A, B, ROUNDD: MINT;
 | 
						|
83830   PROCEDURE CONVR(Y(*>=0.0*): REAL; VAR L: INTEGER; VAR A: MINT);
 | 
						|
83840   (*COMPUTES L = THE LARGEST NUMBER OF DIGITS BEFORE THE DECIMAL POINT (POSSIBLY NEGATIVE) WHICH MIGHT BE NEEDED;
 | 
						|
83850              A = (Y*POWOF2)/10**L (ROUNDED TO NEAREST INTEGER?) *)
 | 
						|
83860     (*+01() EXTERN; ()+01*)
 | 
						|
83870 (*+05()
 | 
						|
83880     CONST LOG10E = 0.43429; (*DELIBERATELY UNDERESTIMATED*)
 | 
						|
83890     VAR LL: REAL;
 | 
						|
83900       BEGIN
 | 
						|
83910       LL :=LN(Y)*LOG10E;
 | 
						|
83920       IF LL>0.0 THEN L := 1+TRUNC(LL)
 | 
						|
83930       ELSE           L := TRUNC(LL);
 | 
						|
83940       A := TIMESTEN(Y (* *POWOF2 *), -L);
 | 
						|
83950       IF A >= 1.0 THEN
 | 
						|
83960         BEGIN L := L+1; A := TIMESTEN(Y (* *POWOF2 *), -L) END;
 | 
						|
83970       END ;
 | 
						|
83980 ()+05*)
 | 
						|
83990 (*+02()
 | 
						|
84000     CONST LOG10E = 0.43429; (*DELIBERATELY UNDERESTIMATED*)
 | 
						|
84010     VAR LL: REAL;
 | 
						|
84020       BEGIN
 | 
						|
84030       LL :=LN(Y)*LOG10E;
 | 
						|
84040       IF LL>0.0 THEN L := 1+TRUNC(LL)
 | 
						|
84050       ELSE           L := TRUNC(LL);
 | 
						|
84060       A := (*-44() TIMESTE(Y (* *POWOF2 *), -L) ()-44*) (*+44() L ()+44*);
 | 
						|
84070       IF A >= 1.0 THEN
 | 
						|
84080         BEGIN L := L+1; A := (*-44() TIMESTE(Y (* *POWOF2 *), -L) ()-44*) (*+44() L ()+44*) END;
 | 
						|
84090       END ;
 | 
						|
84100 ()+02*)
 | 
						|
84110   PROCEDURE CONVI(Y(*>=0*): INTEGER; VAR L: INTEGER; VAR A: MINT);
 | 
						|
84120   (*AS CONVR, BUT FOR INTEGERS*)
 | 
						|
84130     (*+01() EXTERN; ()+01*)
 | 
						|
84140 (*+05()
 | 
						|
84150     VAR I: INTEGER ; YY: INTEGER ;
 | 
						|
84160       BEGIN
 | 
						|
84170       YY := Y ;
 | 
						|
84180       L := 0 ;
 | 
						|
84190       WHILE YY >= 1 DO
 | 
						|
84200         BEGIN L := L + 1 ; YY := YY DIV 10 END ;
 | 
						|
84210       A := TIMESTEN(Y (* *POWOF2 *), -L)
 | 
						|
84220       END ;
 | 
						|
84230 ()+05*)
 | 
						|
84240 (*+02()
 | 
						|
84250     VAR I: INTEGER ; YY: INTEGER ;
 | 
						|
84260       BEGIN
 | 
						|
84270       YY := Y ;
 | 
						|
84280       L := 0 ;
 | 
						|
84290       WHILE YY >= 1 DO
 | 
						|
84300         BEGIN L := L + 1 ; YY := YY DIV 10 END ;
 | 
						|
84310 (*-44()      A := TIMESTE(Y (* *POWOF2 *), -L) ()-44*)
 | 
						|
84320 (*+44()      A := Y; ()+44*)
 | 
						|
84330       END ;
 | 
						|
84340 ()+02*)
 | 
						|
84350 (*-44()
 | 
						|
84360   PROCEDURE ROUNDER(DIGITS: INTEGER; VAR ROUNDD: MINT);
 | 
						|
84370   (* COMPUTES ROUNDD = 0.5 X ( 10 TO THE POWER OF - DIGITS ) X POWOF2 *)
 | 
						|
84380     (*+01() EXTERN; ()+01*)
 | 
						|
84390 (*+05()
 | 
						|
84400     VAR I : INTEGER ;
 | 
						|
84410       BEGIN
 | 
						|
84420       IF DIGITS < 0 THEN DIGITS := 0 ELSE IF DIGITS > REALWIDTH THEN DIGITS := REALWIDTH ;
 | 
						|
84430       ROUNDD := 1 ;
 | 
						|
84440       FOR I := 1 TO DIGITS DO
 | 
						|
84450         ROUNDD := ROUNDD / 10 ;
 | 
						|
84460       (* ROUNDD = 10 TO THE POWER OF - DIGITS *)
 | 
						|
84470       ROUNDD := 0.5 * ROUNDD (* *POWOF2 *);
 | 
						|
84480       END ;
 | 
						|
84490 ()+05*)
 | 
						|
84500 (*+02()
 | 
						|
84510     VAR I : INTEGER ;
 | 
						|
84520       BEGIN
 | 
						|
84530       IF DIGITS < 0 THEN DIGITS := 0 ELSE IF DIGITS > REALWIDTH THEN DIGITS := REALWIDTH ;
 | 
						|
84540       ROUNDD := 1 ;
 | 
						|
84550        FOR I := 1 TO DIGITS DO
 | 
						|
84560          ROUNDD := ROUNDD / 10 ;
 | 
						|
84570       (* ROUNDD = 10 TO THE POWER OF - DIGITS *)
 | 
						|
84580       ROUNDD := 0.5 * ROUNDD (* *POWOF2 *);
 | 
						|
84590       END ;
 | 
						|
84600 ()+02*)
 | 
						|
84610 ()-44*)
 | 
						|
84620     BEGIN (* OF SUBFIXED *)
 | 
						|
84630     WITH X DO
 | 
						|
84640       BEGIN
 | 
						|
84650        IF R THEN IF REA <> 0.0 THEN CONVR(ABS(REA), L, A) ELSE CONVI(ABS(INT), L, A)
 | 
						|
84660        ELSE CONVI(ABS(INT), L, A);
 | 
						|
84670 (*-44()
 | 
						|
84680       IF EXPNEEDED THEN
 | 
						|
84690         IF REA<>0.0 THEN
 | 
						|
84700           BEGIN
 | 
						|
84710             ROUNDER(BEFORE+AFTER, ROUNDD);
 | 
						|
84720             B := A; A := A*10;
 | 
						|
84730             IF A+ROUNDD<POWOF2 THEN
 | 
						|
84740               BEGIN B := A; L := L-1 END;
 | 
						|
84750             A := B+ROUNDD;
 | 
						|
84760             EXP := L-BEFORE; L := BEFORE
 | 
						|
84770             END
 | 
						|
84780           ELSE
 | 
						|
84790             BEGIN A := 0; EXP := 0 END 
 | 
						|
84800         ELSE
 | 
						|
84810           BEGIN
 | 
						|
84820           ROUNDER(L+AFTER, ROUNDD);
 | 
						|
84830           A := A+ROUNDD (*+01()+ORD(ROUNDD=0)()+01*);
 | 
						|
84840           IF A<POWOF2OVER10 THEN
 | 
						|
84850             BEGIN A := A*10; L := L-1 END
 | 
						|
84860           END
 | 
						|
84870 ()-44*)
 | 
						|
84880       END ;
 | 
						|
84890     IF L>0 THEN
 | 
						|
84900       BEGIN IF BEFORE<0 THEN BEFORE := L; M := L END
 | 
						|
84910     ELSE
 | 
						|
84920       IF BEFORE<=0 THEN BEGIN BEFORE := ORD(POINT=0); M := BEFORE END ELSE M := 1;
 | 
						|
84930     IF (L>BEFORE) OR (AFTER<0) THEN BEGIN SUBFIXED := FALSE; GOTO 999 END;
 | 
						|
84940     IF S=NIL THEN S := CRSTRING(SIGN+BEFORE+POINT+AFTER);
 | 
						|
84950     BLANKS := START-1+BEFORE-M+ORD(SIGN<0);
 | 
						|
84960     WITH S^ DO
 | 
						|
84970       BEGIN
 | 
						|
84980       FOR INDEX := START TO BLANKS DO
 | 
						|
84990         CHARVEC[INDEX] := ' ';
 | 
						|
85000       IF SIGN=1 THEN
 | 
						|
85010         BEGIN BLANKS := BLANKS+SIGN;
 | 
						|
85020         IF (*-44() ( R AND ( X.REA < 0.0 ) ) OR ()-44*) 
 | 
						|
85030            ( NOT R AND ( X.INT < 0 ) ) THEN
 | 
						|
85040           CHARVEC[BLANKS] := '-' ELSE CHARVEC[BLANKS] := '+'
 | 
						|
85050         END;
 | 
						|
85060       PT := BLANKS+M+1; FIRSTDIG := START+BEFORE+SIGN-L+ORD(L<0);
 | 
						|
85070 (*-44()
 | 
						|
85080       FOR INDEX := BLANKS+1 TO BLANKS+M+POINT+AFTER DO
 | 
						|
85090         IF INDEX=PT THEN CHARVEC[INDEX] := '.'
 | 
						|
85100         ELSE IF INDEX<FIRSTDIG THEN CHARVEC[INDEX] := '0'
 | 
						|
85110         ELSE
 | 
						|
85120           BEGIN
 | 
						|
85130           A := A*10;
 | 
						|
85140 (*+01()
 | 
						|
85150           CHARVEC[INDEX] := CHR( ORD( '0' ) + A DIV POWOF2 ) ;
 | 
						|
85160           A := A MOD POWOF2
 | 
						|
85170 ()+01*)
 | 
						|
85180 (*-01()
 | 
						|
85190           L := TRUNC( A (* / POWOF2 *));
 | 
						|
85200           CHARVEC[INDEX] := CHR( ORD( '0' ) + L );
 | 
						|
85210           A := A - L (* *POWOF2 *);
 | 
						|
85220 ()-01*)
 | 
						|
85230           END
 | 
						|
85240 ()-44*)
 | 
						|
85250 (*+44()
 | 
						|
85260       FOR INDEX := BLANKS+M+POINT+AFTER DOWNTO BLANKS+1 DO
 | 
						|
85270         IF INDEX=PT THEN CHARVEC[INDEX] := '.'
 | 
						|
85280         ELSE IF INDEX<FIRSTDIG THEN CHARVEC[INDEX] := '0'
 | 
						|
85290         ELSE
 | 
						|
85300           BEGIN
 | 
						|
85310           B := A MOD 10;
 | 
						|
85320           A := A DIV 10;
 | 
						|
85330           CHARVEC[INDEX] := CHR( ORD( '0' ) + B );
 | 
						|
85340           END;
 | 
						|
85350 ()+44*)
 | 
						|
85360       END;
 | 
						|
85370     SUBFIXED := TRUE;
 | 
						|
85380 999:
 | 
						|
85390     END;
 | 
						|
85400 (**)
 | 
						|
85410 (**)
 | 
						|
85420 PROCEDURE ERRORFILL(VAR S: OBJECTP; LENGTH: INTEGER);
 | 
						|
85430   VAR I: INTEGER;
 | 
						|
85440     BEGIN
 | 
						|
85450     IF S=NIL THEN S := CRSTRING(LENGTH);
 | 
						|
85460     WITH S^ DO
 | 
						|
85470       FOR I := 1 TO STRLENGTH DO CHARVEC[I] := ERRORCHAR
 | 
						|
85480     END;
 | 
						|
85490 (**)
 | 
						|
85500 (**)
 | 
						|
85510 PROCEDURE PUTT(RF: OBJECTP);
 | 
						|
85520 (*+02() LABEL 1; ()+02*)
 | 
						|
85530   VAR P: ^REALTEGER;
 | 
						|
85540       TEMP: REALTEGER;
 | 
						|
85550       PDESC1:PDESC;
 | 
						|
85560       TEMPLATE:DPOINT;
 | 
						|
85570       COUNT, XMODE, XSIZE, SIZE, I, J: INTEGER;
 | 
						|
85580       F,PVAL:OBJECTP;
 | 
						|
85590 (**)
 | 
						|
85600 (*+02() PROCEDURE DUMMYP; (*JUST HERE TO MAKE 1 GLOBAL, NOT CALLED*)
 | 
						|
85610         BEGIN GOTO 1 END;     ()+02*)
 | 
						|
85620 (**)
 | 
						|
85630   PROCEDURE ENSROOM(RF:OBJECTP;VAR F:OBJECTP;UPB:INTEGER);
 | 
						|
85640     BEGIN IF [LINEOVERFLOW]<=F^.PCOVER^.STATUS
 | 
						|
85650       THEN IF NOT ENSLINE(RF,F) THEN ERRORR(NOLOGICAL);
 | 
						|
85660       WITH F^.PCOVER^ DO
 | 
						|
85670         BEGIN IF COFCPOS+UPB-ORD(COFCPOS<=1)>CHARBOUND
 | 
						|
85680           THEN BEGIN IF UPB>=CHARBOUND THEN ERRORR(SMALLLINE);
 | 
						|
85690             STATUS:=STATUS+[LINEOVERFLOW];
 | 
						|
85700             ENSROOM(RF,F,UPB)
 | 
						|
85710             END
 | 
						|
85720           ELSE IF COFCPOS<>1 THEN
 | 
						|
85730             CLPASC5(ORD(F^.PCOVER), ORD(F), -1, ORD(' '), ORD(BOOK), DOPUTS);
 | 
						|
85740         END    (*WITH*);
 | 
						|
85750     END;  (*ENSROOM*)
 | 
						|
85760   (**)
 | 
						|
85770   PROCEDURE CRREALSTR(R:REAL;VAR S:OBJECTP;START:INTEGER);
 | 
						|
85780     VAR E, F: REALTEGER;
 | 
						|
85790         NOOK: BOOLEAN;
 | 
						|
85800     BEGIN
 | 
						|
85810       F.REA := R ;
 | 
						|
85820       NOOK:=SUBFIXED(1,1,1,REALWIDTH-1,E.INT,TRUE,F,TRUE,S,START);
 | 
						|
85830       S^.CHARVEC[START+REALWIDTH+2]:='E';
 | 
						|
85840       NOOK:=SUBFIXED(1,EXPWIDTH,0,0,E.INT,FALSE,E,FALSE,S,START+REALWIDTH+3)
 | 
						|
85850     END;
 | 
						|
85860 (**)
 | 
						|
85870   PROCEDURE VALUEPRINT(RF:OBJECTP;VAR F:OBJECTP);
 | 
						|
85880     VAR D,I,J,EXP,UPB,LWB:INTEGER;
 | 
						|
85890         S,STR :OBJECTP;
 | 
						|
85900         NOOK:BOOLEAN;
 | 
						|
85910     BEGIN WITH TEMP DO
 | 
						|
85920       BEGIN
 | 
						|
85930       UPB:=1;
 | 
						|
85940       IF NOT([OPENED,WRITEMOOD,CHARMOOD]<=F^.PCOVER^.STATUS) THEN
 | 
						|
85950         ENSSTATE(RF, F, [OPENED,WRITEMOOD,CHARMOOD]);
 | 
						|
85960       XSIZE := SZINT;
 | 
						|
85970       CASE XMODE OF
 | 
						|
85980     -1:  (*FILLER*) XSIZE := 0;
 | 
						|
85990 (*+61() 1,3,5: (*LONG MODES*)
 | 
						|
86000           BEGIN XSIZE := SZLONG; DUMMY END; ()+61*)
 | 
						|
86010      0:   (*INTEGER*)
 | 
						|
86020           BEGIN UPB:=INTSPACE;
 | 
						|
86030           ENSROOM(RF,F,UPB);
 | 
						|
86040           NOOK:=SUBFIXED(1,INTWIDTH,0,0,EXP,FALSE,TEMP,FALSE,PUTSTRING,1);
 | 
						|
86050         WITH F^.PCOVER^ DO CLPASC5(ORD(F^.PCOVER), ORD(PUTSTRING), 1, INTSPACE, ORD(BOOK), DOPUTS)
 | 
						|
86060           END;
 | 
						|
86070      2:   (*REAL*)
 | 
						|
86080           BEGIN XSIZE := SZREAL; UPB:=REALSPACE;
 | 
						|
86090           ENSROOM(RF,F,UPB);
 | 
						|
86100           CRREALSTR(REA,PUTSTRING,1);
 | 
						|
86110           WITH F^.PCOVER^ DO CLPASC5(ORD(F^.PCOVER), ORD(PUTSTRING), 1, UPB, ORD(BOOK), DOPUTS);
 | 
						|
86120           END;
 | 
						|
86130      4:   (*COMPL*)
 | 
						|
86140           BEGIN UPB:=COMPLSPACE;
 | 
						|
86150           ENSROOM(RF,F,UPB);
 | 
						|
86160           REA := P^.REA;
 | 
						|
86170           CRREALSTR(REA,PUTSTRING,1);
 | 
						|
86180           PUTSTRING^.CHARVEC[REALSPACE+1]:=' ';
 | 
						|
86190           PUTSTRING^.CHARVEC[REALSPACE+2]:='I';
 | 
						|
86200           P:=INCPTR(P, SZREAL);  REA := P^.REA;
 | 
						|
86210           CRREALSTR(REA,PUTSTRING,REALSPACE+3);
 | 
						|
86220           WITH F^.PCOVER^ DO CLPASC5(ORD(F^.PCOVER), ORD(PUTSTRING), 1, UPB, ORD(BOOK), DOPUTS);
 | 
						|
86230           END;
 | 
						|
86240 7,9,10:   BEGIN LWB:=1;   (*STRING,BITS,BYTES*)
 | 
						|
86250           IF XMODE=7 THEN
 | 
						|
86260             BEGIN XSIZE := SZADDR; STR:=PTR; D:=STR^.STRLENGTH;
 | 
						|
86270             IF [PAGEOVERFLOW]<=F^.PCOVER^.STATUS
 | 
						|
86280             THEN IF NOT ENSPAGE(RF,F) THEN ERRORR(9999)
 | 
						|
86290             END
 | 
						|
86300           ELSE IF XMODE=9 THEN
 | 
						|
86310             BEGIN J:=INT; (*BITS*)
 | 
						|
86320             STR := CRSTRING(BITSWIDTH);
 | 
						|
86330             WITH STR^ DO
 | 
						|
86340             FOR I:=1 TO BITSWIDTH DO
 | 
						|
86350               IF NXTBIT(J)=1 THEN CHARVEC[I]:='T' ELSE CHARVEC[I]:='F';
 | 
						|
86360             D:=BITSWIDTH
 | 
						|
86370             END
 | 
						|
86380           ELSE IF XMODE=10     THEN  (*BYTES*)
 | 
						|
86390             BEGIN STR := CRSTRING(BYTESWIDTH);
 | 
						|
86400             WITH STR^ DO
 | 
						|
86410             FOR I:=1 TO BYTESWIDTH DO CHARVEC[I]:=ALF[I];
 | 
						|
86420             D:=BYTESWIDTH
 | 
						|
86430             END;
 | 
						|
86440           WHILE LWB<=D DO
 | 
						|
86450             BEGIN IF [LINEOVERFLOW]<=F^.PCOVER^.STATUS
 | 
						|
86460               THEN IF NOT ENSLINE(RF,F) THEN ERRORR(9999);
 | 
						|
86470             WITH F^.PCOVER^ DO
 | 
						|
86480               BEGIN UPB:=LWB+CHARBOUND-COFCPOS;  (*ROOM LEFT ON LINE*)
 | 
						|
86490               IF UPB>D THEN UPB:=D;
 | 
						|
86500               WITH F^.PCOVER^ DO CLPASC5(ORD(F^.PCOVER), ORD(STR), LWB, UPB, ORD(BOOK), DOPUTS);
 | 
						|
86510               LWB:=UPB+1;
 | 
						|
86520               END     (*WITH*)
 | 
						|
86530             END;  (*OD*)
 | 
						|
86540           IF XMODE IN [9,10] THEN GARBAGE(STR)
 | 
						|
86550           END;    (*STRING*)
 | 
						|
86560      6,8: (*CHAR, BOOL*)
 | 
						|
86570           BEGIN
 | 
						|
86580           IF LINEOVERFLOW IN F^.PCOVER^.STATUS THEN
 | 
						|
86590             IF NOT ENSLINE(RF, F) THEN ERRORR(9999);
 | 
						|
86600           IF XMODE=8 THEN (*BOOL*)
 | 
						|
86610           IF (*+01()INT<0()+01*) (*-01()INT<>0()-01*) THEN
 | 
						|
86620             INT := ORD('T') ELSE INT := ORD('F');
 | 
						|
86630           IF (INT>=0) AND (INT<=MAXABSCHAR) THEN
 | 
						|
86640             WITH F^.PCOVER^ DO CLPASC5(ORD(F^.PCOVER), ORD(S), -1, INT, ORD(BOOK), DOPUTS)
 | 
						|
86650           ELSE ERRORR(RCHARERROR)
 | 
						|
86660           END;
 | 
						|
86670     11:   (*PROC*) CL68(GETPROC(PTR), RF);
 | 
						|
86680     12:   (*STRUCT*)
 | 
						|
86690           BEGIN J:=0;
 | 
						|
86700           REPEAT J:=J+1 UNTIL TEMPLATE^[J]<0;
 | 
						|
86710           I:=ORD(P);
 | 
						|
86720           WHILE ORD(P)-I<TEMPLATE^[0] DO
 | 
						|
86730             BEGIN J:=J+1;
 | 
						|
86740             XMODE:=TEMPLATE^[J]-1;
 | 
						|
86750             TEMP := P^ ;
 | 
						|
86760             VALUEPRINT(RF,F);
 | 
						|
86770             P:=INCPTR(P, XSIZE)
 | 
						|
86780             END;
 | 
						|
86790           XMODE:=12
 | 
						|
86800           END;
 | 
						|
86810     14:   (*CODE(REF FILE)VOID*)
 | 
						|
86820           BEGIN
 | 
						|
86830           XSIZE := SZPROC;
 | 
						|
86840           CLPASC1(ORD(RF), PROCC);
 | 
						|
86850           END;
 | 
						|
86860         END; (*CASE*)
 | 
						|
86870       END   (*WITH TEMP*);
 | 
						|
86880     END;   (*VALUEPRINT*)
 | 
						|
86890 (**)
 | 
						|
86900     BEGIN    (*PUT*)
 | 
						|
86910     (*PUTT IS CALLED FROM EITHER PUT OR PRINT, WHICH ARE WRITTEN
 | 
						|
86920       IN ASSEMBLER. AT THIS POINT, STKTOP(0) CONTAINS COUNT, THE
 | 
						|
86930       SPACE OCCUPIED BY DATA LIST ITEMS, BELOW THAT ARE PAIRS
 | 
						|
86940       ON THE STACK, EACH CONSISTING OF AN XMODE AND A VALUE
 | 
						|
86950     *)
 | 
						|
86960 (*+02() 1: ()+02*) COUNT := GETSTKTOP(SZWORD, 0);
 | 
						|
86970     FPINC(RF^);
 | 
						|
86980     J := COUNT+SZWORD;
 | 
						|
86990     WHILE J>SZWORD DO
 | 
						|
87000       BEGIN
 | 
						|
87010       J := J-SZWORD;
 | 
						|
87020       XMODE := GETSTKTOP(SZWORD, J);
 | 
						|
87030       CASE XMODE OF
 | 
						|
87040       4,7,11,12,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31:
 | 
						|
87050         BEGIN
 | 
						|
87060         J := J-SZADDR;
 | 
						|
87070         PVAL := ASPTR(GETSTKTOP(SZADDR, J));
 | 
						|
87080         FPINC(PVAL^);
 | 
						|
87090         END;
 | 
						|
87100 (*+61() 1,3,5: J := J-SZLONG; ()+61*)
 | 
						|
87110         14: J := J-SZPROC;
 | 
						|
87120         2: J := J-SZREAL;
 | 
						|
87130         0,6,8,9,10: J := J-SZINT;
 | 
						|
87140         -1: (*NO ACTION*);
 | 
						|
87150         END;
 | 
						|
87160       END;
 | 
						|
87170     TESTF(RF,F);
 | 
						|
87180     J := COUNT+SZWORD;
 | 
						|
87190     WHILE J>SZWORD DO
 | 
						|
87200       BEGIN
 | 
						|
87210       J := J-SZWORD;
 | 
						|
87220       XMODE := GETSTKTOP(SZWORD, J);
 | 
						|
87230       IF XMODE>=16 THEN (*ROW*)
 | 
						|
87240         BEGIN
 | 
						|
87250         J := J-SZADDR;
 | 
						|
87260         XMODE:=XMODE-16;
 | 
						|
87270         PVAL := ASPTR(GETSTKTOP(SZADDR, J));
 | 
						|
87280         WITH PVAL^ DO
 | 
						|
87290           BEGIN
 | 
						|
87300           FORMPDESC(PVAL,PDESC1);
 | 
						|
87310           TEMPLATE:=MDBLOCK;
 | 
						|
87320           IF ORD(TEMPLATE)=0 THEN SIZE := SZADDR
 | 
						|
87330           ELSE IF ORD(TEMPLATE)<=MAXSIZE THEN SIZE:=ORD(TEMPLATE)
 | 
						|
87340           ELSE SIZE:=TEMPLATE^[0];
 | 
						|
87350           WHILE NEXTEL(0,PDESC1) DO WITH PDESC1 DO WITH PDESCVEC[0] DO
 | 
						|
87360             BEGIN I:=PP;
 | 
						|
87370             WHILE I<PP+PSIZE DO
 | 
						|
87380               BEGIN P:=INCPTR(PVALUE, I);
 | 
						|
87390               TEMP := P^;
 | 
						|
87400               VALUEPRINT(RF,F);
 | 
						|
87410               I:=I+SIZE
 | 
						|
87420               END
 | 
						|
87430             END
 | 
						|
87440           END
 | 
						|
87450         END
 | 
						|
87460       ELSE
 | 
						|
87470         BEGIN
 | 
						|
87480         CASE XMODE OF
 | 
						|
87490           4,5,12: (*STRUCT, INCLUDING COMPL*)
 | 
						|
87500             BEGIN
 | 
						|
87510             J := J-SZADDR;
 | 
						|
87520             PVAL := ASPTR(GETSTKTOP(SZADDR, J));
 | 
						|
87530             TEMPLATE := PVAL^.DBLOCK;
 | 
						|
87540             P := INCPTR(PVAL, STRUCTCONST);
 | 
						|
87550             END;
 | 
						|
87560           0,6,8,9,10:
 | 
						|
87570             BEGIN J := J-SZINT; TEMP.INT := GETSTKTOP(SZINT, J) END;
 | 
						|
87580 (*+61()
 | 
						|
87590           1,3:
 | 
						|
87600             BEGIN J := J-SZLONG; TEMP.LONG := GETSTKTOP(SZLONG, J) END;
 | 
						|
87610 ()+61*)
 | 
						|
87620           2:
 | 
						|
87630             BEGIN J := J-SZREAL; (*-01()TEMP.REA()-01*)(*+01()TEMP.INT()+01*) := GETSTKTOP(SZREAL, J) END;
 | 
						|
87640           7,11:
 | 
						|
87650             BEGIN J := J-SZADDR; TEMP.PTR := ASPTR(GETSTKTOP(SZADDR, J)) END;
 | 
						|
87660           14:
 | 
						|
87670             BEGIN J := J-SZPROC; TEMP.PROCC := GETSTKTOP(SZPROC, J) END;
 | 
						|
87680           -1: (*NO ACTION*);
 | 
						|
87690           END;
 | 
						|
87700         VALUEPRINT(RF, F);
 | 
						|
87710         END;
 | 
						|
87720       END;      (*OD*)
 | 
						|
87730     J := COUNT+SZWORD;
 | 
						|
87740     WHILE J>SZWORD DO
 | 
						|
87750       BEGIN
 | 
						|
87760       J := J-SZWORD;
 | 
						|
87770       XMODE := GETSTKTOP(SZWORD, J);
 | 
						|
87780       CASE XMODE OF
 | 
						|
87790         4,7,11,12,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31:
 | 
						|
87800           BEGIN
 | 
						|
87810           J := J-SZADDR;
 | 
						|
87820           PVAL := ASPTR(GETSTKTOP(SZADDR, J));
 | 
						|
87830           WITH PVAL^ DO
 | 
						|
87840             BEGIN FDEC; IF FTST THEN GARBAGE(PVAL) END;
 | 
						|
87850           END;
 | 
						|
87860 (*+61() 1,3,5: J := J-SZLONG; ()+61*)
 | 
						|
87870         14: J := J-SZPROC;
 | 
						|
87880         2: J := J-SZREAL;
 | 
						|
87890         0,6,8,9,10: J := J-SZINT;
 | 
						|
87900         -1: (*NO ACTION*);
 | 
						|
87910         END;
 | 
						|
87920       END;
 | 
						|
87930     WITH RF^ DO
 | 
						|
87940       BEGIN FDEC; IF FTST THEN GARBAGE(RF) END;
 | 
						|
87950     END;    (* PUT *)
 | 
						|
87960 (**)
 | 
						|
87970 (**)
 | 
						|
87980 (*-02()
 | 
						|
87990 BEGIN (*OF A68*)
 | 
						|
88000 END; (*OF A68*)
 | 
						|
88010 ()-02*)
 | 
						|
88020 (*+01()
 | 
						|
88030 BEGIN (*OF MAIN PROGRAM*)
 | 
						|
88040 END (* OF EVERYTHING *).
 | 
						|
88050 ()+01*)
 |