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