hedgewars/adler32.pas
changeset 10015 4feced261c68
parent 8026 4a4f21070479
child 12758 49c31d8cc740
equal deleted inserted replaced
10014:56d2f2d5aad8 10015:4feced261c68
     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);