74700 #include "rundecs.h" 74710 (* COPYRIGHT 1983 C.H.LINDSEY, UNIVERSITY OF MANCHESTER *) 74720 (**) 74730 (**) 74740 FUNCTION CRSTRING(LENGTH: OFFSETRANGE): OBJECTP; EXTERN ; 74750 FUNCTION SUBFIXED(SIGN, BEFORE, POINT, AFTER : INTEGER; VAR EXP: INTEGER; EXPNEEDED: BOOLEAN; 74760 X: REALTEGER; R: BOOLEAN; VAR S: OBJECTP; START: INTEGER): BOOLEAN; EXTERN; 74770 PROCEDURE ERRORFILL(VAR S: OBJECTP; LENGTH: INTEGER); EXTERN; 74780 (**) 74790 (**) 74800 FUNCTION FLOAT(XMODE: INTEGER; VAL: REALTEGER; WIDTH, AFTER, EXP: INTEGER): OBJECTP; 74810 VAR E: REALTEGER; 74820 S: OBJECTP; 74830 ABSWIDTH, BEFORE, POINT, ABSEXP, EXPSIGN: INTEGER; 74840 OK, OK1: BOOLEAN; 74850 BEGIN 74860 ABSWIDTH := ABS(WIDTH)+ORD(WIDTH=0); 74870 ABSEXP := ABS(EXP)+ORD(EXP=0); 74880 S := CRSTRING(ABSWIDTH); 74890 REPEAT 74900 POINT := ORD(AFTER>0); 74910 BEFORE := ABSWIDTH-1-POINT-AFTER-1-ABSEXP; 74920 IF BEFORE<0 THEN AFTER := -1; (*WILL CAUSE SUBFIXED TO FAIL*) 74930 OK := SUBFIXED(ORD((WIDTH>0) OR (VAL.INT<0))-ORD((WIDTH<0) AND (VAL.INT>=0)), 74940 BEFORE, POINT, AFTER, E.INT, TRUE, VAL, XMODE=2, S, 1) 74950 AND (BEFORE+AFTER>0); 74960 S^.CHARVEC[1+BEFORE+POINT+AFTER+1] := 'E'; 74970 EXPSIGN := ORD((EXP>0) OR (E.INT<0)); 74980 OK1 := SUBFIXED(EXPSIGN, ABSEXP-EXPSIGN, 0, 0, E.INT, FALSE, E, FALSE, 74990 S, 1+BEFORE+POINT+AFTER+2); 75000 AFTER := AFTER-ORD(AFTER<>0); ABSEXP := ABSEXP+1 75010 UNTIL NOT OK OR OK1; 75020 IF NOT OK THEN ERRORFILL(S, ABSWIDTH); 75030 FLOAT := S; 75040 END; 75050 (**) 75060 (**) 75070 (*+01() (*$X4*) ()+01*) 75080 (**) 75090 (**) 75100 (*-02() 75110 BEGIN (*OF A68*) 75120 END; (*OF A68*) 75130 ()-02*) 75140 (*+01() 75150 BEGIN (*OF MAIN PROGRAM*) 75160 END (* OF EVERYTHING *). 75170 ()+01*)