294 lines
		
	
	
	
		
			9.3 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
			
		
		
	
	
			294 lines
		
	
	
	
		
			9.3 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
22300 #include "rundecs.h"
 | 
						|
22310    (*  COPYRIGHT 1983 C.H.LINDSEY, UNIVERSITY OF MANCHESTER  *)
 | 
						|
22320 (**)
 | 
						|
22330 PROCEDURE ERRORR(N: INTEGER);EXTERN;
 | 
						|
22340 PROCEDURE GARBAGE(ANOBJECT: OBJECTP);EXTERN;
 | 
						|
22350 FUNCTION SAFEACCESS(LOCATION: OBJECTP): UNDRESSP; EXTERN;
 | 
						|
22360 (**)
 | 
						|
22370 (**)
 | 
						|
22380 FUNCTION CRCOMPLEX(REPART,IMAGPART: REAL): OBJECTP;
 | 
						|
22390   VAR NEWCOMPLEX: OBJECTP;
 | 
						|
22400     BEGIN
 | 
						|
22410     ENEW(NEWCOMPLEX, STRUCTCONST+2*SZREAL);
 | 
						|
22420     WITH NEWCOMPLEX^ DO
 | 
						|
22430       BEGIN
 | 
						|
22440 (*-02() FIRSTWORD := SORTSHIFT * ORD(STRUCT); ()-02*)
 | 
						|
22450 (*+02() PCOUNT:=0; SORT:=STRUCT; ()+02*)
 | 
						|
22460       LENGTH := STRUCTCONST+2*SZREAL;
 | 
						|
22470       DBLOCK := COMPLEX;
 | 
						|
22480       RE := REPART;
 | 
						|
22490       IM := IMAGPART
 | 
						|
22500       END;
 | 
						|
22510     CRCOMPLEX := NEWCOMPLEX
 | 
						|
22520     END;
 | 
						|
22530 (**)
 | 
						|
22540 (**)
 | 
						|
22550 FUNCTION WIDREAL(REA: REAL): OBJECTP;
 | 
						|
22560 (*PWIDEN+2*)
 | 
						|
22570     BEGIN
 | 
						|
22580     WIDREAL := CRCOMPLEX(REA,0.0)
 | 
						|
22590     END;
 | 
						|
22600 (**)
 | 
						|
22610 (**)
 | 
						|
22620 FUNCTION CPLUS(LEFT,RIGHT: OBJECTP): OBJECTP;
 | 
						|
22630   VAR NEWOBJ: OBJECTP;
 | 
						|
22640     BEGIN
 | 
						|
22650     IF FPTST(LEFT^) THEN NEWOBJ := LEFT
 | 
						|
22660     ELSE IF FPTST(RIGHT^) THEN NEWOBJ := RIGHT
 | 
						|
22670       ELSE NEWOBJ := CRCOMPLEX(0.0,0.0);
 | 
						|
22680     WITH NEWOBJ^ DO
 | 
						|
22690       BEGIN
 | 
						|
22700       RE := LEFT^.RE+RIGHT^.RE;
 | 
						|
22710       IM := LEFT^.IM+RIGHT^.IM
 | 
						|
22720       END;
 | 
						|
22730     IF (FPTST(LEFT^)) AND (FPTST(RIGHT^)) THEN GARBAGE(RIGHT);
 | 
						|
22740     CPLUS := NEWOBJ
 | 
						|
22750     END;
 | 
						|
22760 (**)
 | 
						|
22770 (**)
 | 
						|
22780 FUNCTION CMINUS(LEFT,RIGHT: OBJECTP): OBJECTP;
 | 
						|
22790   VAR NEWOBJ: OBJECTP;
 | 
						|
22800     BEGIN
 | 
						|
22810     IF FPTST(LEFT^) THEN NEWOBJ := LEFT
 | 
						|
22820     ELSE IF FPTST(RIGHT^) THEN NEWOBJ := RIGHT
 | 
						|
22830       ELSE NEWOBJ := CRCOMPLEX(0.0,0.0);
 | 
						|
22840     WITH NEWOBJ^ DO
 | 
						|
22850       BEGIN
 | 
						|
22860       RE := LEFT^.RE-RIGHT^.RE;
 | 
						|
22870       IM := LEFT^.IM-RIGHT^.IM
 | 
						|
22880       END;
 | 
						|
22890     IF (FPTST(LEFT^)) AND (FPTST(RIGHT^)) THEN GARBAGE(RIGHT);
 | 
						|
22900     CMINUS := NEWOBJ
 | 
						|
22910     END;
 | 
						|
22920 (**)
 | 
						|
22930 (**)
 | 
						|
22940 FUNCTION CTIMS(LEFT,RIGHT: OBJECTP): OBJECTP;
 | 
						|
22950   VAR NEWOBJ: OBJECTP;
 | 
						|
22960       TEMPREAL: REAL;
 | 
						|
22970     BEGIN
 | 
						|
22980     IF FPTST(LEFT^) THEN NEWOBJ := LEFT
 | 
						|
22990     ELSE IF FPTST(RIGHT^) THEN NEWOBJ := RIGHT
 | 
						|
23000       ELSE NEWOBJ := CRCOMPLEX(0.0,0.0);
 | 
						|
23010     TEMPREAL := LEFT^.RE*RIGHT^.RE-LEFT^.IM*RIGHT^.IM;
 | 
						|
23020     WITH NEWOBJ^ DO
 | 
						|
23030       BEGIN
 | 
						|
23040       IM := LEFT^.RE*RIGHT^.IM+LEFT^.IM*RIGHT^.RE;
 | 
						|
23050       RE := TEMPREAL
 | 
						|
23060       END;
 | 
						|
23070     IF (FPTST(LEFT^)) AND (FPTST(RIGHT^)) THEN GARBAGE(RIGHT);
 | 
						|
23080     CTIMS := NEWOBJ
 | 
						|
23090     END;
 | 
						|
23100 (**)
 | 
						|
23110 (**)
 | 
						|
23120 FUNCTION CDIV(LEFT,RIGHT: OBJECTP): OBJECTP;
 | 
						|
23130   VAR NEWOBJ: OBJECTP;
 | 
						|
23140       TEMPREAL,RIGHTSQR: REAL;
 | 
						|
23150     BEGIN
 | 
						|
23160     IF FPTST(LEFT^) THEN NEWOBJ := LEFT
 | 
						|
23170     ELSE IF FPTST(RIGHT^) THEN NEWOBJ := RIGHT
 | 
						|
23180       ELSE NEWOBJ := CRCOMPLEX(0.0,0.0);
 | 
						|
23190     RIGHTSQR := SQR(RIGHT^.RE)+SQR(RIGHT^.IM);
 | 
						|
23200     TEMPREAL := (LEFT^.RE*RIGHT^.RE+LEFT^.IM*RIGHT^.IM)/RIGHTSQR;
 | 
						|
23210     WITH NEWOBJ^ DO
 | 
						|
23220       BEGIN
 | 
						|
23230       IM := (LEFT^.IM*RIGHT^.RE-LEFT^.RE*RIGHT^.IM)/RIGHTSQR;
 | 
						|
23240       RE := TEMPREAL
 | 
						|
23250       END;
 | 
						|
23260     IF (FPTST(LEFT^)) AND (FPTST(RIGHT^)) THEN GARBAGE(RIGHT);
 | 
						|
23270     CDIV := NEWOBJ
 | 
						|
23280     END;
 | 
						|
23290 (**)
 | 
						|
23300 (**)
 | 
						|
23310 FUNCTION CNEGI(CNUMB: OBJECTP): OBJECTP;
 | 
						|
23320   VAR NEWOBJ: OBJECTP;
 | 
						|
23330     BEGIN
 | 
						|
23340     IF FPTST(CNUMB^) THEN NEWOBJ := CNUMB
 | 
						|
23350     ELSE NEWOBJ := CRCOMPLEX(0.0,0.0);
 | 
						|
23360     WITH NEWOBJ^ DO
 | 
						|
23370       BEGIN
 | 
						|
23380       RE := -CNUMB^.RE;
 | 
						|
23390       IM := -CNUMB^.IM
 | 
						|
23400       END;
 | 
						|
23410     CNEGI := NEWOBJ
 | 
						|
23420     END;
 | 
						|
23430 (**)
 | 
						|
23440 (**)
 | 
						|
23450 FUNCTION CCONJ(CNUMB: OBJECTP): OBJECTP;
 | 
						|
23460   VAR NEWOBJ: OBJECTP;
 | 
						|
23470     BEGIN
 | 
						|
23480     IF FPTST(CNUMB^) THEN NEWOBJ := CNUMB
 | 
						|
23490     ELSE NEWOBJ := CRCOMPLEX(0.0,0.0);
 | 
						|
23500     WITH NEWOBJ^ DO
 | 
						|
23510       BEGIN
 | 
						|
23520       RE := CNUMB^.RE;
 | 
						|
23530       IM := -CNUMB^.IM
 | 
						|
23540       END;
 | 
						|
23550     CCONJ := NEWOBJ
 | 
						|
23560     END;
 | 
						|
23570 (**)
 | 
						|
23580 (**)
 | 
						|
23590 FUNCTION CRE(CNUMB: OBJECTP): REAL;
 | 
						|
23600     BEGIN
 | 
						|
23610     CRE := CNUMB^.RE;
 | 
						|
23620     IF FPTST(CNUMB^) THEN GARBAGE(CNUMB)
 | 
						|
23630     END;
 | 
						|
23640 (**)
 | 
						|
23650 (**)
 | 
						|
23660 FUNCTION CIM(CNUMB: OBJECTP): REAL;
 | 
						|
23670     BEGIN
 | 
						|
23680     CIM := CNUMB^.IM;
 | 
						|
23690     IF FPTST(CNUMB^) THEN GARBAGE(CNUMB)
 | 
						|
23700     END;
 | 
						|
23710 (**)
 | 
						|
23720 (**)
 | 
						|
23730 FUNCTION CABSI(CNUMB: OBJECTP): REAL;
 | 
						|
23740     BEGIN
 | 
						|
23750     WITH CNUMB^ DO
 | 
						|
23760       CABSI := SQRT(SQR(RE)+SQR(IM));
 | 
						|
23770     IF FPTST(CNUMB^) THEN GARBAGE(CNUMB)
 | 
						|
23780     END;
 | 
						|
23790 (**)
 | 
						|
23800 (**)
 | 
						|
23810 FUNCTION ARG(CNUMB: OBJECTP): REAL;
 | 
						|
23820   VAR RESULT: REAL;
 | 
						|
23830     BEGIN
 | 
						|
23840     WITH CNUMB^ DO
 | 
						|
23850       IF (RE<>0.0) OR (IM<>0.0) THEN
 | 
						|
23860         IF ABS(RE)>ABS(IM) THEN
 | 
						|
23870           RESULT := ARCTAN(IM/RE)+HALFPI.ACTUALPI*(1-ORD(RE>0.0))*2*(1-2*ORD(IM<0.0))
 | 
						|
23880           ELSE RESULT := -ARCTAN(RE/IM)+HALFPI.ACTUALPI*(ORD(IM>0.0)-ORD(IM<0.0))
 | 
						|
23890       ELSE ERRORR(RARG);
 | 
						|
23900     ARG := RESULT
 | 
						|
23910     END;
 | 
						|
23920 (**)
 | 
						|
23930 (**)
 | 
						|
23940 FUNCTION CARG(CNUMB: OBJECTP): REAL;
 | 
						|
23950     BEGIN
 | 
						|
23960     CARG := ARG(CNUMB);
 | 
						|
23970     IF FPTST(CNUMB^) THEN GARBAGE(CNUMB)
 | 
						|
23980     END;
 | 
						|
23990 (**)
 | 
						|
24000 (**)
 | 
						|
24010 FUNCTION CPOW(CNUMB: OBJECTP;POW: INTEGER): OBJECTP;
 | 
						|
24020   VAR NEWOBJ: OBJECTP;
 | 
						|
24030     CMOD,CMODPOW,NTHETA: REAL;
 | 
						|
24040     NEGPOW: BOOLEAN;
 | 
						|
24050     BEGIN
 | 
						|
24060     IF FPTST(CNUMB^) THEN NEWOBJ := CNUMB
 | 
						|
24070       ELSE NEWOBJ := CRCOMPLEX(0.0,0.0);
 | 
						|
24080     WITH CNUMB^ DO
 | 
						|
24090       CMOD := SQRT(SQR(RE)+SQR(IM));
 | 
						|
24100     IF CMOD<>0.0 THEN
 | 
						|
24110       BEGIN
 | 
						|
24120       NEGPOW := POW<0;
 | 
						|
24130       POW := ABS(POW);
 | 
						|
24140       NTHETA := POW*ARG(CNUMB);
 | 
						|
24150       CMODPOW := 1;
 | 
						|
24160       WHILE POW<>0 DO
 | 
						|
24170         BEGIN
 | 
						|
24180         IF POW MOD 2=1 THEN CMODPOW := CMODPOW*CMOD;
 | 
						|
24190         CMOD := SQR(CMOD);
 | 
						|
24200         POW := POW DIV 2
 | 
						|
24210         END;
 | 
						|
24220       WITH NEWOBJ^ DO
 | 
						|
24230         BEGIN
 | 
						|
24240         RE := COS(NTHETA)*CMODPOW;
 | 
						|
24250         IM := SIN(NTHETA)*CMODPOW;
 | 
						|
24260         IF NEGPOW THEN
 | 
						|
24270           BEGIN
 | 
						|
24280           CMOD := SQR(RE)+SQR(IM);
 | 
						|
24290           RE := RE/CMOD;
 | 
						|
24300           IM := -IM/CMOD
 | 
						|
24310           END
 | 
						|
24320         END
 | 
						|
24330       END
 | 
						|
24340       ELSE WITH NEWOBJ^ DO
 | 
						|
24350         BEGIN
 | 
						|
24360         RE := 0.0;
 | 
						|
24370         IM := 0.0
 | 
						|
24380         END;
 | 
						|
24390     CPOW := NEWOBJ;
 | 
						|
24400     END;
 | 
						|
24410 (**)
 | 
						|
24420 (**)
 | 
						|
24430 FUNCTION CEQ(LEFT,RIGHT: OBJECTP): INTEGER;
 | 
						|
24440   VAR EQUALS: BOOLEAN;
 | 
						|
24450     BEGIN
 | 
						|
24460     EQUALS := (LEFT^.RE=RIGHT^.RE) AND (LEFT^.IM=RIGHT^.IM);
 | 
						|
24470     IF FPTST(LEFT^) THEN GARBAGE(LEFT);
 | 
						|
24480     IF FPTST(RIGHT^) THEN GARBAGE(RIGHT);
 | 
						|
24490     IF EQUALS THEN CEQ := TRUEVAL ELSE CEQ := 0
 | 
						|
24500     END;
 | 
						|
24510 (**)
 | 
						|
24520 (**)
 | 
						|
24530 FUNCTION CNE(LEFT,RIGHT: OBJECTP): INTEGER;
 | 
						|
24540   VAR NOTEQUAL: BOOLEAN;
 | 
						|
24550     BEGIN
 | 
						|
24560     NOTEQUAL := (LEFT^.RE<>RIGHT^.RE) OR (LEFT^.IM<>RIGHT^.IM);
 | 
						|
24570     IF FPTST(LEFT^) THEN GARBAGE(LEFT);
 | 
						|
24580     IF FPTST(RIGHT^) THEN GARBAGE(RIGHT);
 | 
						|
24590     IF NOTEQUAL THEN CNE := TRUEVAL ELSE CNE := 0
 | 
						|
24600     END;
 | 
						|
24610 (**)
 | 
						|
24620 (**)
 | 
						|
24630 FUNCTION CPLUSAB(DESTINATION,INCREMENT: OBJECTP): OBJECTP;
 | 
						|
24640   VAR REALPTR: UNDRESSP;
 | 
						|
24650     BEGIN
 | 
						|
24660     REALPTR := SAFEACCESS(DESTINATION);
 | 
						|
24670     REALPTR^.FIRSTREAL := REALPTR^.FIRSTREAL+INCREMENT^.RE;
 | 
						|
24680     REALPTR := INCPTR(REALPTR,SZREAL);
 | 
						|
24690     REALPTR^.FIRSTREAL := REALPTR^.FIRSTREAL+INCREMENT^.IM;
 | 
						|
24700     IF FPTST(INCREMENT^) THEN GARBAGE(INCREMENT);
 | 
						|
24710     CPLUSAB := DESTINATION
 | 
						|
24720     END;
 | 
						|
24730 (**)
 | 
						|
24740 (**)
 | 
						|
24750 FUNCTION CMINAB(DESTINATION,DECREMENT: OBJECTP): OBJECTP;
 | 
						|
24760   VAR REALPTR: UNDRESSP;
 | 
						|
24770     BEGIN
 | 
						|
24780     REALPTR := SAFEACCESS(DESTINATION);
 | 
						|
24790     REALPTR^.FIRSTREAL := REALPTR^.FIRSTREAL-DECREMENT^.RE;
 | 
						|
24800     REALPTR := INCPTR(REALPTR,SZREAL);
 | 
						|
24810     REALPTR^.FIRSTREAL := REALPTR^.FIRSTREAL-DECREMENT^.IM;
 | 
						|
24820     IF FPTST(DECREMENT^) THEN GARBAGE(DECREMENT);
 | 
						|
24830     CMINAB := DESTINATION
 | 
						|
24840     END;
 | 
						|
24850 (**)
 | 
						|
24860 (**)
 | 
						|
24870 FUNCTION CTIMSAB(DESTINATION,FACTOR: OBJECTP): OBJECTP;
 | 
						|
24880   VAR REALPTR,IMAGPTR: UNDRESSP;
 | 
						|
24890       TEMPREAL: REAL;
 | 
						|
24900     BEGIN
 | 
						|
24910     REALPTR := SAFEACCESS(DESTINATION);
 | 
						|
24920     IMAGPTR := INCPTR(REALPTR,SZREAL);
 | 
						|
24930     TEMPREAL := REALPTR^.FIRSTREAL*FACTOR^.RE-IMAGPTR^.FIRSTREAL*FACTOR^.IM;
 | 
						|
24940     IMAGPTR^.FIRSTREAL := REALPTR^.FIRSTREAL*FACTOR^.IM+IMAGPTR^.FIRSTREAL*FACTOR^.RE;
 | 
						|
24950     REALPTR^.FIRSTREAL := TEMPREAL;
 | 
						|
24960     IF FPTST(FACTOR^) THEN GARBAGE(FACTOR);
 | 
						|
24970     CTIMSAB := DESTINATION
 | 
						|
24980     END;
 | 
						|
24990 (**)
 | 
						|
25000 (**)
 | 
						|
25010 FUNCTION CDIVAB(DESTINATION,DIVISOR: OBJECTP): OBJECTP;
 | 
						|
25020   VAR REALPTR,IMAGPTR: UNDRESSP;
 | 
						|
25030       TEMPREAL,DIVISORSQR: REAL;
 | 
						|
25040     BEGIN
 | 
						|
25050     REALPTR := SAFEACCESS(DESTINATION);
 | 
						|
25060     IMAGPTR := INCPTR(REALPTR,SZREAL);
 | 
						|
25070     DIVISORSQR := SQR(DIVISOR^.RE)+SQR(DIVISOR^.IM);
 | 
						|
25080     TEMPREAL := (REALPTR^.FIRSTREAL*DIVISOR^.RE+IMAGPTR^.FIRSTREAL*DIVISOR^.IM)/DIVISORSQR;
 | 
						|
25090     IMAGPTR^.FIRSTREAL := (IMAGPTR^.FIRSTREAL*DIVISOR^.RE-REALPTR^.FIRSTREAL*DIVISOR^.IM)/DIVISORSQR;
 | 
						|
25100     REALPTR^.FIRSTREAL := TEMPREAL;
 | 
						|
25110     IF FPTST(DIVISOR^) THEN GARBAGE(DIVISOR);
 | 
						|
25120     CDIVAB := DESTINATION
 | 
						|
25130     END;
 | 
						|
25140 (**)
 | 
						|
25150 (**)
 | 
						|
25160 (*-02()
 | 
						|
25170 BEGIN (* OF A68 *)
 | 
						|
25180 END (* OF A68 *);
 | 
						|
25190 ()-02*)
 | 
						|
25200 (*+01()
 | 
						|
25210 BEGIN (* OF MAIN PROGRAM  *)
 | 
						|
25220 END (* OF MAIN PROGRAM  *).
 | 
						|
25230 ()+01*)
 |