equal
deleted
inserted
replaced
1 unit Adler32; |
1 unit Adler32; |
2 |
2 |
3 {ZLib - Adler32 checksum function} |
3 {ZLib - Adler32 checksum function} |
4 |
|
5 |
4 |
6 interface |
5 interface |
7 |
6 |
8 (************************************************************************* |
7 (************************************************************************* |
9 |
8 |
64 As per the license above, noting that this implementation of adler32 was stripped of everything we didn't need. |
63 As per the license above, noting that this implementation of adler32 was stripped of everything we didn't need. |
65 That means no btypes, file loading, and the assembly version disabled. |
64 That means no btypes, file loading, and the assembly version disabled. |
66 Also, the structure was removed to simplify C conversion |
65 Also, the structure was removed to simplify C conversion |
67 *) |
66 *) |
68 |
67 |
69 function Adler32Update ( var adler :longint; Msg :pointer; Len :longint ) : longint; |
68 function Adler32Update (var adler : longint; Msg :Pointer; Len :longint ) : longint; |
70 |
69 |
71 implementation |
70 implementation |
72 |
71 |
73 (* |
72 (* |
74 $ifdef BASM16 |
73 $ifdef BASM16 |
122 LH(adler).L := word(s1); |
121 LH(adler).L := word(s1); |
123 LH(adler).H := word(s2); |
122 LH(adler).H := word(s2); |
124 end; |
123 end; |
125 *) |
124 *) |
126 |
125 |
127 function Adler32Update(var adler: longint; Msg: pointer; Len :longint) : longint; |
126 function Adler32Update(var adler:longint; Msg: Pointer; Len :longint) : longint; |
128 {-update Adler32 with Msg data} |
127 {-update Adler32 with Msg data} |
129 const |
128 const |
130 BASE = 65521; {max. prime < 65536 } |
129 BASE = 65521; {max. prime < 65536 } |
131 NMAX = 3854; {max. n with 255n(n+1)/2 + (n+1)(BASE-1) < 2^31} |
130 NMAX = 3854; {max. n with 255n(n+1)/2 + (n+1)(BASE-1) < 2^31} |
132 var |
131 var |
133 s1, s2: longint; |
132 s1, s2 : longint; |
134 i, n: integer; |
133 i, n : integer; |
|
134 m : PByte; |
135 begin |
135 begin |
136 s1 := adler and $FFFF; |
136 m := PByte(Msg); |
137 s2 := adler shr 16; |
137 s1 := Longword(adler) and $FFFF; |
|
138 s2 := Longword(adler) shr 16; |
138 while Len>0 do |
139 while Len>0 do |
139 begin |
140 begin |
140 if Len<NMAX then |
141 if Len<NMAX then |
141 n := Len |
142 n := Len |
142 else |
143 else |
143 n := NMAX; |
144 n := NMAX; |
144 |
145 |
145 for i := 1 to n do |
146 for i := 1 to n do |
146 begin |
147 begin |
147 inc(s1, pByte(Msg)^); |
148 inc(s1, m^); |
148 inc(Msg); |
149 inc(m); |
149 inc(s2, s1); |
150 inc(s2, s1); |
150 end; |
151 end; |
151 s1 := s1 mod BASE; |
152 s1 := s1 mod BASE; |
152 s2 := s2 mod BASE; |
153 s2 := s2 mod BASE; |
153 dec(len, n); |
154 dec(len, n); |