hedgewars/adler32.pas
changeset 6926 6e832f8f4d8e
parent 6580 6155187bf599
child 6927 ee000959d645
equal deleted inserted replaced
6925:1fbf9266ba52 6926:6e832f8f4d8e
    61 ----------------------------------------------------------------------------*)
    61 ----------------------------------------------------------------------------*)
    62 
    62 
    63 (*
    63 (*
    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 *)
    67 *)
    67 
    68 
    68 procedure Adler32Update ( var adler     :longint; Msg     :pointer; Len     :longint );
    69 procedure Adler32Update ( var adler     :longint; Msg     :pointer; Len     :longint );
    69 
    70 
    70 implementation
    71 implementation
   126 procedure Adler32Update(var adler: longint; Msg: pointer; Len :longint);
   127 procedure Adler32Update(var adler: longint; Msg: pointer; Len :longint);
   127     {-update Adler32 with Msg data}
   128     {-update Adler32 with Msg data}
   128     const
   129     const
   129         BASE = 65521; {max. prime < 65536 }
   130         BASE = 65521; {max. prime < 65536 }
   130         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}
   131     type
       
   132         LH = packed record
       
   133             L, H: word;
       
   134             end;
       
   135     var
   132     var
   136         s1, s2: longint;
   133         s1, s2: longint;
   137         i, n: integer;
   134         i, n: integer;
   138     begin
   135     begin
   139         s1 := LH(adler).L;
   136         s1 := adler and $FFFF;
   140         s2 := LH(adler).H;
   137         s2 := adler shr 16;
   141         while Len>0 do
   138         while Len>0 do
   142             begin
   139             begin
   143             if Len<NMAX then
   140             if Len<NMAX then
   144                 n := Len
   141                 n := Len
   145             else
   142             else
   153                 end;
   150                 end;
   154             s1 := s1 mod BASE;
   151             s1 := s1 mod BASE;
   155             s2 := s2 mod BASE;
   152             s2 := s2 mod BASE;
   156             dec(len, n);
   153             dec(len, n);
   157             end;
   154             end;
   158         LH(adler).L := word(s1);
   155         adler:= (s2 shl 16) or s1;
   159         LH(adler).H := word(s2);
       
   160     end;
   156     end;
   161 
   157 
   162 end.
   158 end.