<<>> <> <> <> <> <> <<>> DIRECTORY Basics USING [LongNumber], Checksum; ChecksumImpl: CEDAR PROGRAM EXPORTS Checksum ~ BEGIN OPEN Checksum; <> ComputeChecksum: PUBLIC PROC [ cs: CARD16 ¬ 0, nHalfWords: CARDINAL, p: POINTER, offset: CARDINAL ¬ 0] RETURNS [checksum: CARD16] ~ TRUSTED { RawHalfwords: TYPE = RECORD [PACKED SEQUENCE COMPUTED CARDINAL OF CARD16]; phw: POINTER TO RawHalfwords ¬ LOOPHOLE[p]; FOR i: CARDINAL IN [offset..nHalfWords+offset) DO <> t: Basics.LongNumber ¬ [lc[cs + phw[i]]]; t.lc ¬ (t.lo + t.hi)*2; t.lc ¬ t.lo + t.hi; cs ¬ t.lo; ENDLOOP; IF cs = CARD16.LAST THEN cs ¬ 0; RETURN [cs]; }; END. <> <> <<>>