137 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
| 00100 (*+02() (*$T-*) (*$D+*) (*$W-*) (*$L-*) ()+02*)
 | |
| 00105 PROGRAM COMPARE(F1,F2,INIT(*+02(),OUTPUT()+02*));
 | |
| 00110 CONST SZWORD = (*+12() 2 ()+12*) (*+13() 4 ()+13*);
 | |
| 00112       HOFFSET = (*-02() 4 ()-02*) (*+02() (*+19() 6 ()+19*) (*-19() 8 ()-19*) ()+02*)
 | |
| 00113 (*    HOFFSET IS THE AMOUNT THE HEAP HAS BEEN MOVED UP *)
 | |
| 00120 TYPE ADDRINT = (*-02()INTEGER()-02*)(*+02()LONG()+02*);
 | |
| 00130      LOADFILE = FILE OF ADDRINT;
 | |
| 00140 VAR  F1,F2 : LOADFILE;
 | |
| 00150      INIT : LOADFILE;
 | |
| 00160      GLOBALLENGTH,HEAPSTART,HEAPLENGTH,DUMMY : ADDRINT;
 | |
| 00169 (*-19()
 | |
| 00170 PROCEDURE COPY(LENGTH : ADDRINT);
 | |
| 00180   VAR I,VALUE : INTEGER;
 | |
| 00190       D : RECORD INT,MASK : INTEGER END;
 | |
| 00200       BEGIN
 | |
| 00210       FOR I := 1 TO LENGTH DO
 | |
| 00220         BEGIN
 | |
| 00230         READ(F1,D.INT);
 | |
| 00240         READ(F2,VALUE);
 | |
| 00250         D.MASK := VALUE-D.INT;
 | |
| 00260         IF NOT (D.MASK IN [0,HOFFSET]) THEN  (*VALUE IS PART OF A PACKED RECORD AND TOP BYTE IS NOT USED*)
 | |
| 00270           D.MASK := 0;
 | |
| 00280         IF D.MASK=HOFFSET THEN    (* D.INT IS A POINTER *)
 | |
| 00290           D.INT := D.INT-HEAPSTART;
 | |
| 00300         WRITE(INIT,D.INT,D.MASK)
 | |
| 00310         END
 | |
| 00320       END;
 | |
| 00330 ()-19*)
 | |
| 00350 (*+19()
 | |
| 00360 PROCEDURE COPY(LENGTH : ADDRINT);
 | |
| 00370 VAR
 | |
| 00380     POINTER     : ADDRINT;
 | |
| 00390     LAST1,THIS1,THIS2 : ADDRINT; (*BECAUSE UNINTIALISED HEAP IS -32768*)
 | |
| 00400     DIFF        : INTEGER;
 | |
| 00410     LSW,MSW     : ADDRINT;
 | |
| 00425     COUNT       : ADDRINT;
 | |
| 00000 FUNCTION WORDSREVERSED:BOOLEAN;
 | |
| 00000     TYPE R = RECORD
 | |
| 00000 	    CASE BOOLEAN OF
 | |
| 00000     	TRUE: (X: ADDRINT);
 | |
| 00000     	FALSE: (Y: INTEGER;
 | |
| 00000 	            Z: INTEGER);
 | |
| 00000 	    END;
 | |
| 00000     VAR V: R;
 | |
| 00000     BEGIN
 | |
| 00000     V.X := 1;
 | |
| 00000     WORDSREVERSED := V.Y<>1
 | |
| 00000     END;
 | |
| 00430 BEGIN
 | |
| 00000 IF NOT WORDSREVERSED THEN
 | |
| 00000 BEGIN
 | |
| 00435     COUNT := 1;
 | |
| 00440     WHILE COUNT<=LENGTH DO
 | |
| 00450     BEGIN
 | |
| 00460         READ(F1,THIS1);
 | |
| 00470         READ(F2,THIS2);
 | |
| 00475         COUNT := COUNT+1;
 | |
| 00480         DIFF := ABS(ABS(THIS1)-ABS(THIS2));
 | |
| 00490         IF DIFF IN [2,HOFFSET]  THEN (* LSW OF POINTER *)
 | |
| 00500         BEGIN
 | |
| 00510             LSW := THIS1; (*CONVERT TO 32 BIT NO *)
 | |
| 00520             IF THIS1<0 THEN
 | |
| 00530                 LSW := LSW+65536; (*CONVERT FROM 2'S COMP TO UNSIGNED *)
 | |
| 00540             READ(F1,MSW);
 | |
| 00550             READ(F2,DUMMY);
 | |
| 00555             COUNT := COUNT+1;
 | |
| 00560             POINTER := (MSW*65536)+LSW;
 | |
| 00570             POINTER := POINTER-HEAPSTART; (*MAKE POINTER RELATIVE*)
 | |
| 00580             WRITE(INIT,HOFFSET,POINTER);
 | |
| 00583             IF POINTER>HEAPLENGTH THEN
 | |
| 00585                 WRITELN('WARNING: POINTER OUT OF RANGE',POINTER);
 | |
| 00590         END
 | |
| 00600         ELSE IF DIFF<>0 THEN
 | |
| 00610              BEGIN
 | |
| 00620                  WRITELN('WARNING: UNKNOWN CHANGE IN VALUE',DIFF,' FROM',THIS1,' TO',THIS2);
 | |
| 00630                  WRITE(INIT,0,THIS1)
 | |
| 00640              END
 | |
| 00650              ELSE
 | |
| 00660                  WRITE(INIT,0,THIS1);
 | |
| 00670     END
 | |
| 00680 END
 | |
| 00000 ELSE
 | |
| 00000 BEGIN
 | |
| 00000     COUNT := 0;
 | |
| 00000     READ(F1,THIS1);
 | |
| 00000     READ(F2,THIS2);
 | |
| 00000     COUNT := COUNT+1;
 | |
| 00000     WHILE COUNT<=LENGTH DO
 | |
| 00000     BEGIN
 | |
| 00000         LAST1 := THIS1;
 | |
| 00000         IF COUNT<LENGTH THEN
 | |
| 00000         BEGIN
 | |
| 00000             READ(F1,THIS1);
 | |
| 00000             READ(F2,THIS2);
 | |
| 00000         END;
 | |
| 00000         COUNT := COUNT+1;
 | |
| 00000         IF THIS1=THIS2 THEN
 | |
| 00000             WRITE(INIT,0,LAST1)
 | |
| 00000         ELSE
 | |
| 00000         BEGIN
 | |
| 00000             DIFF := ABS(ABS(THIS1)-ABS(THIS2));
 | |
| 00000             IF DIFF IN [2,HOFFSET] THEN
 | |
| 00000             BEGIN
 | |
| 00000                 LSW := THIS1;
 | |
| 00000                 IF THIS1<0 THEN
 | |
| 00000                     LSW := LSW+65536;
 | |
| 00000                 POINTER := LAST1*65536+LSW-HEAPSTART;
 | |
| 00000                 WRITE(INIT,HOFFSET,POINTER);
 | |
| 00000                 IF POINTER>HEAPLENGTH THEN
 | |
| 00000                     WRITELN('WARNING: POINTER OUT OF RANGE',POINTER);
 | |
| 00000                 IF COUNT<=LENGTH THEN
 | |
| 00000                 BEGIN
 | |
| 00000                     READ(F1,THIS1);
 | |
| 00000                     READ(F2,THIS2);
 | |
| 00000                 END;
 | |
| 00000                 COUNT := COUNT+1;
 | |
| 00000             END
 | |
| 00000             ELSE
 | |
| 00000             BEGIN
 | |
| 00000                 WRITELN('WARNING: UNKNOWN CHANGE IN VALUE',DIFF,' FROM',THIS1,' TO',THIS2);
 | |
| 00000                 WRITE(INIT,0,LAST1)
 | |
| 00000             END
 | |
| 00000         END
 | |
| 00000     END
 | |
| 00000 END;
 | |
| 00675 WRITELN('COPY OF LENGTH',(COUNT-1)*SZWORD); (*IN BYTES*)
 | |
| 00000 END;
 | |
| 00690 ()+19*)
 | |
| 00710 BEGIN(*OF COMPARE*)
 | |
| 00720   RESET(F1); RESET(F2); REWRITE(INIT);
 | |
| 00730   READ(F1,GLOBALLENGTH);WRITE(INIT,GLOBALLENGTH);
 | |
| 00740   READ(F1,HEAPLENGTH);WRITE(INIT,HEAPLENGTH);
 | |
| 00750   READ(F1,HEAPSTART);
 | |
| 00760    READ(F2,DUMMY);READ(F2,DUMMY);READ(F2,DUMMY);
 | |
| 00770   COPY(GLOBALLENGTH DIV SZWORD);
 | |
| 00780   COPY(HEAPLENGTH DIV SZWORD);
 | |
| 00790 END.
 |