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

112 lines
4 KiB
OpenEdge ABL

40800 #include "rundecs.h"
40810 (* COPYRIGHT 1983 C.H.LINDSEY, UNIVERSITY OF MANCHESTER *)
40820 (**)
40830 (**)
40840 PROCEDURE ERRORR(N :INTEGER); EXTERN ;
40850 (**)
40860 (**)
40870 (*+01() (*$X3*) ()+01*)
40880 FUNCTION PCCMN(NEWMULT: OBJECTP; TEMPLATE: DPOINT; ELSIZE: INTEGER): ASNAKED;
40890 VAR TEMP: NAKEGER;
40900 DESCDEX: INTEGER;
40910 NEWELS: OBJECTP;
40920 BEGIN WITH NEWMULT^, TEMP DO WITH NAK DO
40930 BEGIN
40940 MDBLOCK := TEMPLATE;
40950 ENEW(NEWELS, ELSCONST+ELSIZE);
40960 PVALUE := NEWELS;
40970 WITH PVALUE^ DO
40980 BEGIN IHEAD := NIL ;
40990 (*-02() FIRSTWORD := SORTSHIFT * ORD(IELS); PCOUNT := 1; ()-02*)
41000 (*+02() PCOUNT:=1; SORT:=IELS; ()+02*)
41010 OSCOPE := 0; DBLOCK := TEMPLATE; D0 := ELSIZE; CCOUNT := 1 END;
41020 IHEAD := NIL; FPTR := NIL; BPTR := NIL;
41030 (*+11() ASNAK := 0; ()+11*)
41040 STOWEDVAL := NEWMULT; POINTER := INCPTR(PVALUE, ELSCONST);
41050 PCCMN := ASNAK;
41060 END
41070 END;
41080 (**)
41090 (**)
41100 FUNCTION PCOLLR(NOROWS: INTEGER; TEMPLATE: DPOINT): ASNAKED;
41110 (*PPREPROWDISP*)
41120 VAR NEWMULT: OBJECTP;
41130 DESCDEX: INTEGER; ELSIZE, SUM: BOUNDSRANGE;
41140 BEGIN
41150 IF ORD(TEMPLATE)=0 THEN ELSIZE := 1 (*DRESSED*)
41160 ELSE IF ORD(TEMPLATE)<=MAXSIZE THEN ELSIZE := ORD(TEMPLATE) (*UNDRESSED*)
41170 ELSE ELSIZE := TEMPLATE^[0];
41180 ENEW(NEWMULT, MULTCONST+NOROWS*SZPDS);
41190 SUM := -ELSCONST;
41200 WITH NEWMULT^ DO
41210 BEGIN
41220 (*-02() FIRSTWORD := SORTSHIFT * ORD(MULT); ()-02*)
41230 (*+02() PCOUNT:=0; SORT:=MULT; ()+02*)
41240 (*+01() SECONDWORD := 0; ()+01*)
41250 SIZE := ELSIZE;
41260 FOR DESCDEX := 0 TO NOROWS-1 DO WITH DESCVEC[DESCDEX] DO
41270 BEGIN
41280 UI := GETSTKTOP(SZINT, DESCDEX*SZINT); LI := 1; DI := ELSIZE;
41290 SUM := SUM+ELSIZE; ELSIZE := UI*ELSIZE
41300 END;
41310 LBADJ := SUM;
41320 ROWS := NOROWS-1;
41330 END;
41340 PCOLLR := PCCMN(NEWMULT, TEMPLATE, ELSIZE);
41350 (*THIS WILL NOT WORK THUS ON 16-BITS*)
41360 END;
41370 (**)
41380 (**)
41390 FUNCTION PCOLLRM(NOROWS: INTEGER; TEMPLATE: DPOINT): ASNAKED;
41400 (*PPREPROWDISP+1*)
41410 VAR OLDMULT, NEWMULT: OBJECTP;
41420 DESCDEX, FIRSTROW: INTEGER; ELSIZE, SUM: BOUNDSRANGE;
41430 BEGIN
41440 OLDMULT := ASPTR(GETSTKTOP(SZADDR, NOROWS*SZINT));
41450 WITH OLDMULT^ DO
41460 BEGIN ELSIZE := SIZE;
41470 ENEW(NEWMULT, MULTCONST+(NOROWS+ROWS+1)*SZPDS);
41480 SUM := -ELSCONST;
41490 (*-02() NEWMULT^.FIRSTWORD := SORTSHIFT * ORD(MULT); ()-02*)
41500 (*+02() NEWMULT^.PCOUNT:=0; NEWMULT^.SORT:=MULT; ()+02*)
41510 (*+01() NEWMULT^.SECONDWORD := 0; ()+01*)
41520 NEWMULT^.SIZE := ELSIZE;
41530 FOR DESCDEX := 0 TO ROWS DO WITH DESCVEC[DESCDEX] DO
41540 BEGIN
41550 NEWMULT^.DESCVEC[DESCDEX] := DESCVEC[DESCDEX];
41560 NEWMULT^.DESCVEC[DESCDEX].DI := ELSIZE;
41570 SUM := SUM+LI*ELSIZE; ELSIZE := (UI-LI+1)*ELSIZE;
41580 IF ELSIZE<0 THEN ELSIZE := 0
41590 END
41600 END;
41610 FIRSTROW := OLDMULT^.ROWS+1;
41620 WITH NEWMULT^ DO
41630 BEGIN
41640 FOR DESCDEX := FIRSTROW TO FIRSTROW+NOROWS-1 DO WITH DESCVEC[DESCDEX] DO
41650 BEGIN
41660 UI := GETSTKTOP(SZINT, (DESCDEX-FIRSTROW)*SZINT); LI := 1; DI := ELSIZE;
41670 SUM := SUM+ELSIZE; ELSIZE := UI*ELSIZE
41680 END;
41690 LBADJ := SUM;
41700 ROWS := FIRSTROW+NOROWS-1;
41710 END;
41720 PCOLLRM := PCCMN(NEWMULT, TEMPLATE, ELSIZE);
41730 END;
41740 (*+01() (*$X4*) ()+01*)
41750 (**)
41760 (**)
41770 FUNCTION PCOLLCK(TEMP: NAKEGER; DEPTH, COUNT: INTEGER): ASNAKED;
41780 (*PCOLLCHECK*)
41790 BEGIN
41800 WITH TEMP.NAK.STOWEDVAL^ DO WITH DESCVEC[ROWS-DEPTH] DO
41810 IF (LI<>1) OR (UI<>COUNT) THEN ERRORR(RMULASS);
41820 PCOLLCK := TEMP.ASNAK;
41830 END;
41840 (**)
41850 (**)
41860 (*-02() BEGIN END ; ()-02*)
41870 (*+01()
41880 BEGIN (*OF MAIN PROGRAM*)
41890 END (*OF EVERYTHING*).
41900 ()+01*)