138 lines
4.8 KiB
OpenEdge ABL
138 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.
|