154 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
26000 #include "rundecs.h"
 | 
						|
26010     (*  COPYRIGHT 1983 C.H.LINDSEY, UNIVERSITY OF MANCHESTER  *)
 | 
						|
26020 (**)
 | 
						|
26030 (**)
 | 
						|
26040 PROCEDURE COPYSLICE(ASLICE: OBJECTP); EXTERN;
 | 
						|
26050 FUNCTION COPYDESC(ORIGINAL: OBJECTP; NEWSORT: STRUCTYPE): OBJECTP; EXTERN;
 | 
						|
26060 PROCEDURE ERRORR(N :INTEGER); EXTERN;
 | 
						|
26070 (**)
 | 
						|
26080 (**)
 | 
						|
26090 FUNCTION BOUND(ROWCOUNT: INTEGER): OBJECTP;
 | 
						|
26100 (*PBOUNDS*)
 | 
						|
26110   VAR NEWMULT: OBJECTP;
 | 
						|
26120       DESCDEX: INTEGER; BND: BOUNDSRANGE;
 | 
						|
26130     BEGIN
 | 
						|
26140     ENEW(NEWMULT, MULTCONST+ROWCOUNT*SZPDS);
 | 
						|
26150     WITH NEWMULT^ DO
 | 
						|
26160       BEGIN
 | 
						|
26170 (*-02() FIRSTWORD := SORTSHIFT * ORD(MULT); ()-02*)
 | 
						|
26180 (*+02() PCOUNT:=0; SORT:=MULT; ()+02*)
 | 
						|
26190 (*+01() SECONDWORD := 0; ()+01*)
 | 
						|
26200       OSCOPE := 0 ;
 | 
						|
26210       FOR DESCDEX := 0 TO ROWCOUNT-1 DO
 | 
						|
26220         WITH DESCVEC[DESCDEX] DO
 | 
						|
26230           BEGIN
 | 
						|
26240           BND := GETSTKTOP(SZINT, DESCDEX*2*SZINT);
 | 
						|
26250           IF BND=INTUNDEF THEN ERRORR(RCUPPER); UI := BND;
 | 
						|
26260           BND := GETSTKTOP(SZINT, DESCDEX*2*SZINT+SZINT);
 | 
						|
26270           IF BND=INTUNDEF THEN ERRORR(RCLOWER); LI := BND;
 | 
						|
26280           END;
 | 
						|
26290       ROWS := ROWCOUNT-1;
 | 
						|
26300       PVALUE := NIL;
 | 
						|
26310       IHEAD := NIL; FPTR := NIL; BPTR := NIL
 | 
						|
26320       END;
 | 
						|
26330     BOUND := NEWMULT;
 | 
						|
26340     END;
 | 
						|
26350 (**)
 | 
						|
26360 (**)
 | 
						|
26370 FUNCTION CRMULT(NEWMULT: OBJECTP; TEMPLATE: DPOINT): OBJECTP;
 | 
						|
26380 (*PACTDRMULT*)
 | 
						|
26390   VAR NEWELS: OBJECTP;
 | 
						|
26400       SUM, ELSIZE, INDEX, DESCDEX, TEMPOS, STRUCTPOS, INC: INTEGER;
 | 
						|
26410       PTR, LIMIT: UNDRESSP;
 | 
						|
26420     BEGIN
 | 
						|
26430     WITH NEWMULT^ DO
 | 
						|
26440       BEGIN
 | 
						|
26450       IF ORD(TEMPLATE)=0 THEN ELSIZE := SZADDR  (*DRESSED*)
 | 
						|
26460       ELSE IF ORD(TEMPLATE)<=MAXSIZE THEN ELSIZE := ORD(TEMPLATE)  (*UNDRESSED*)
 | 
						|
26470         ELSE ELSIZE := TEMPLATE^[0];  (*STRUCT*)
 | 
						|
26480       SIZE:= ELSIZE;
 | 
						|
26490       SUM:= 0;
 | 
						|
26500       FOR DESCDEX := 0 TO ROWS DO
 | 
						|
26510         WITH DESCVEC[DESCDEX] DO
 | 
						|
26520           BEGIN
 | 
						|
26530           DI:= ELSIZE;
 | 
						|
26540           SUM := SUM+LI*ELSIZE;
 | 
						|
26550           ELSIZE:= (UI-LI+1)*ELSIZE;
 | 
						|
26560           IF ELSIZE <= 0 THEN
 | 
						|
26570             ELSIZE:= 0
 | 
						|
26580           END;
 | 
						|
26590       LBADJ := SUM-ELSCONST;
 | 
						|
26600       MDBLOCK := TEMPLATE;
 | 
						|
26610       ENEW(NEWELS, ELSCONST+ELSIZE);
 | 
						|
26620       WITH NEWELS^ DO
 | 
						|
26630         BEGIN
 | 
						|
26640 (*-02() FIRSTWORD := SORTSHIFT*ORD(IELS)+INCRF; ()-02*)
 | 
						|
26650 (*+02() PCOUNT:=1; SORT:=IELS; ()+02*)
 | 
						|
26660         OSCOPE := 0;
 | 
						|
26670         DBLOCK:= TEMPLATE;
 | 
						|
26680         D0:= ELSIZE;
 | 
						|
26690         CCOUNT:= 1;
 | 
						|
26700         PTR := INCPTR(NEWELS, ELSCONST);
 | 
						|
26710         IHEAD := NIL;
 | 
						|
26720 (*-02()
 | 
						|
26730         IF ORD(TEMPLATE)=0 THEN BEGIN PTR^.FIRSTPTR := UNDEFIN; INC := SZADDR END  (*DRESSED*)
 | 
						|
26740         ELSE BEGIN PTR^.FIRSTWORD := INTUNDEF; INC := SZWORD END;  (*UNDRESSED*)
 | 
						|
26750         MOVELEFT(PTR, INCPTR(PTR, INC), ELSIZE-INC);
 | 
						|
26760 ()-02*)
 | 
						|
26770 (*+02()
 | 
						|
26780         LIMIT := INCPTR(PTR, ELSIZE);
 | 
						|
26790         IF ORD(TEMPLATE)=0 THEN WHILE PTR<>LIMIT DO
 | 
						|
26800           BEGIN PTR^.FIRSTPTR := UNDEFIN; PTR := INCPTR(PTR, SZADDR) END
 | 
						|
26810         ELSE WHILE PTR<>LIMIT DO
 | 
						|
26820           BEGIN PTR^.FIRSTWORD := INTUNDEF; PTR := INCPTR(PTR, SZWORD) END;
 | 
						|
26830 ()+02*)
 | 
						|
26840         IF ORD(TEMPLATE)>MAXSIZE  (*STRUCT*) THEN
 | 
						|
26850           BEGIN
 | 
						|
26860           ELSIZE:= TEMPLATE^[0];
 | 
						|
26870           INDEX:= 0;
 | 
						|
26880           WHILE INDEX < D0 DO
 | 
						|
26890             BEGIN
 | 
						|
26900             TEMPOS:= 1;
 | 
						|
26910             STRUCTPOS:= TEMPLATE^[1];
 | 
						|
26920             WHILE STRUCTPOS >= 0 DO
 | 
						|
26930               BEGIN
 | 
						|
26940               PTR := INCPTR(NEWELS, ELSCONST+INDEX+STRUCTPOS);
 | 
						|
26950               PTR^.FIRSTPTR := UNDEFIN;
 | 
						|
26960               TEMPOS:= TEMPOS+1;
 | 
						|
26970               STRUCTPOS:= TEMPLATE^[TEMPOS]
 | 
						|
26980               END;
 | 
						|
26990             INDEX:= INDEX+ELSIZE
 | 
						|
27000             END
 | 
						|
27010           END
 | 
						|
27020         END;
 | 
						|
27030         PVALUE:= NEWELS
 | 
						|
27040       END;
 | 
						|
27050     CRMULT := NEWMULT
 | 
						|
27060     END;
 | 
						|
27070 (**)
 | 
						|
27080 (**)
 | 
						|
27090 FUNCTION CRREFR(ANOBJECT: OBJECTP): OBJECTP;
 | 
						|
27100 (*PCREATEREF+2*)
 | 
						|
27110   VAR  NEWREFR: OBJECTP;
 | 
						|
27120     BEGIN
 | 
						|
27130     WITH ANOBJECT^ DO
 | 
						|
27140       BEGIN
 | 
						|
27150       IF (BPTR<>NIL) AND (SORT=MULT)  THEN (*SOURCE IS A SLICE*)
 | 
						|
27160         COPYSLICE(ANOBJECT);
 | 
						|
27170       IF FTST THEN
 | 
						|
27180         BEGIN NEWREFR := ANOBJECT; NEWREFR^.SORT := REFR END
 | 
						|
27190       ELSE
 | 
						|
27200         BEGIN
 | 
						|
27210         NEWREFR := COPYDESC(ANOBJECT, REFR);
 | 
						|
27220         WITH NEWREFR^.PVALUE^ DO FINC
 | 
						|
27230         END
 | 
						|
27240       END;
 | 
						|
27250     WITH NEWREFR^ DO
 | 
						|
27260       BEGIN
 | 
						|
27270       OSCOPE := SCOPE+FIRSTRG.RIBOFFSET^.RGSCOPE;
 | 
						|
27280       ANCESTOR:= NEWREFR;
 | 
						|
27290       CCOUNT:= 1;
 | 
						|
27300       END;
 | 
						|
27310     CRREFR := NEWREFR;
 | 
						|
27320     END;
 | 
						|
27330 (**)
 | 
						|
27340 (**)
 | 
						|
27350 FUNCTION CHKDESC(SOURCEMULT, CDESC: OBJECTP): OBJECTP;
 | 
						|
27360  (*PCHECKDESC*)
 | 
						|
27370 VAR  COUNT: INTEGER;
 | 
						|
27380 BEGIN
 | 
						|
27390      IF SOURCEMULT^.SORT=UNDEF THEN ERRORR(RMULASS);
 | 
						|
27400      FOR COUNT:= 0 TO CDESC^.ROWS
 | 
						|
27410           DO   WITH CDESC^.DESCVEC[COUNT], SOURCEMULT^ DO
 | 
						|
27420                     IF (LI <> DESCVEC[COUNT].LI)
 | 
						|
27430                          OR (UI <>  DESCVEC[COUNT].UI)
 | 
						|
27440                     THEN ERRORR(RMULASS);
 | 
						|
27450     CHKDESC := SOURCEMULT;
 | 
						|
27460 END;
 | 
						|
27470 (**)
 | 
						|
27480 (**)
 | 
						|
27490 (*-02() BEGIN END ; ()-02*)
 | 
						|
27500 (*+01()
 | 
						|
27510 BEGIN (*OF MAIN PROGRAM*)
 | 
						|
27520 END (*OF EVERYTHING*).
 | 
						|
27530 ()+01*)
 |