295 lines
9.3 KiB
OpenEdge ABL
295 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*)
|