DIRECTORY Basics, VM; Cx: CEDAR PROGRAM IMPORTS Basics, VM = BEGIN Runs: TYPE = RECORD[start, num: CARDINAL]; Cp1: PROC[srcL, dstL: LONG CARDINAL, count: CARDINAL] RETURNS[total: CARDINAL, lc: LIST OF Runs] = TRUSTED { dst: LONG POINTER TO WORD _ LOOPHOLE[dstL]; src: LONG POINTER TO WORD _ LOOPHOLE[srcL]; lastBad: CARDINAL _ 0; total _ 0; lc _ LIST[[0, 1]]; FOR i: CARDINAL IN [0..count) DO IF dst^ # src^ THEN { total _ total + 1; IF i = lastBad + 1 THEN lc.first.num _ lc.first.num + 1 ELSE { IF lc.first.num = 1 THEN lc.first.start _ i ELSE lc _ CONS[[i, 1], lc]; }; lastBad _ i; }; dst _ LOOPHOLE[dst + 1]; src _ LOOPHOLE[src + 1]; ENDLOOP; }; Cpx: PROC[srcL, dstL: LONG CARDINAL, count: CARDINAL] RETURNS[total: CARDINAL, lc: LIST OF Runs] = TRUSTED { dst: LONG POINTER TO WORD _ LOOPHOLE[dstL]; src: LONG POINTER TO WORD _ LOOPHOLE[srcL]; lastBad: CARDINAL _ 0; total _ 0; FOR i: CARDINAL IN [0..count) DO IF dst^ # src^ THEN { total _ total + 1; IF i = lastBad + 1 THEN lc.first.num _ lc.first.num + 1 ELSE lc _ CONS[[i, 1], lc]; lastBad _ i; }; dst _ LOOPHOLE[dst + 1]; src _ LOOPHOLE[src + 1]; ENDLOOP; }; Find: PROC[start, badGuy: LONG POINTER TO WORD, length: INT] RETURNS[LONG POINTER TO WORD] = TRUSTED { firstbad: WORD = badGuy^; FOR i: INT _ 0, i+400B UNTIL i >= length DO BEGIN ENABLE VM.AddressFault => GOTO tryNext; maybe: LONG POINTER TO WORD; didMatch: BOOL _ TRUE; IF (start+i)^ # firstbad THEN LOOP; maybe _ LOOPHOLE[start+i]; FOR j: INT IN [0.. 400B) DO IF (maybe+j)^ # (badGuy+j)^ THEN GOTO noMatch; ENDLOOP; RETURN[maybe]; EXITS noMatch => NULL; tryNext => NULL; END; ENDLOOP; RETURN[NIL]; }; Cp: PROC[srcL, dstL: LONG POINTER, count: CARDINAL] RETURNS[lc: LIST OF CARDINAL] = TRUSTED { dst: LONG POINTER TO WORD _ LOOPHOLE[dstL]; src: LONG POINTER TO WORD _ LOOPHOLE[srcL]; FOR i: CARDINAL IN [0..count) DO IF dst^ # src^ THEN lc _ CONS[i, lc]; dst _ LOOPHOLE[dst + 1]; src _ LOOPHOLE[src + 1]; ENDLOOP; }; Zr: PROC[srcL: LONG POINTER, count: CARDINAL] RETURNS[total: CARDINAL, lc: LIST OF Runs] = TRUSTED { src: LONG POINTER TO WORD _ LOOPHOLE[srcL]; lastBad: CARDINAL _ 0; total _ 0; FOR i: CARDINAL IN [0..count) DO IF src^ # 0 THEN { total _ total + 1; IF i = lastBad + 1 THEN lc.first.num _ lc.first.num + 1 ELSE lc _ CONS[[i, 1], lc]; lastBad _ i; }; src _ LOOPHOLE[src + 1]; ENDLOOP; }; Xor: PROC[a, b: WORD] RETURNS[WORD] = { RETURN[Basics.BITXOR[a, b]] }; END. :Cx.mesa Willie-Sue, August 25, 1986 11:32:09 am PDT Κm˜šœ™Icode™+—J˜šΟk ˜ J˜Jšœ˜—J˜šΟnœœ˜Jšœ ˜Jšœ˜Jšœœœ œ˜*J˜š žœœ œœ œ˜5Jš œœœœœ œ˜7Jš œœœœœœ˜+Jš œœœœœœ˜+Jšœ œ˜Jšœ ˜ Jšœœ ˜šœœœ ˜ šœ œ˜Jšœ˜šœœ ˜7šœ˜Jšœœœœ ˜GJ˜——Jšœ ˜ J˜—Jšœœ ˜Jšœœ ˜Jšœ˜—J˜J˜—J˜š žœœ œœ œ˜5Jš œœœœœ œ˜7Jš œœœœœœ˜+Jš œœœœœœ˜+Jšœ œ˜Jšœ ˜ šœœœ ˜ šœ œ˜Jšœ˜šœœ ˜7Jšœœ ˜—Jšœ ˜ J˜—Jšœœ ˜Jšœœ ˜Jšœ˜—J˜—J˜šžœœœœœœ œ˜