mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 16:31:36 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			114 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
| {
 | |
|     $Id$
 | |
|     Copyright (c) 2000-2002 by Free Pascal Development Team
 | |
| 
 | |
|     Routines to compute CRC values
 | |
| 
 | |
|     This program is free software; you can redistribute it and/or modify
 | |
|     it under the terms of the GNU General Public License as published by
 | |
|     the Free Software Foundation; either version 2 of the License, or
 | |
|     (at your option) any later version.
 | |
| 
 | |
|     This program is distributed in the hope that it will be useful,
 | |
|     but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|     GNU General Public License for more details.
 | |
| 
 | |
|     You should have received a copy of the GNU General Public License
 | |
|     along with this program; if not, write to the Free Software
 | |
|     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 | |
| 
 | |
|  ****************************************************************************
 | |
| }
 | |
| Unit crc;
 | |
| 
 | |
| {$i fpcdefs.inc}
 | |
| 
 | |
| Interface
 | |
| 
 | |
| Function Crc32(Const HStr:String):cardinal;
 | |
| Function UpdateCrc32(InitCrc:cardinal;const InBuf;InLen:integer):cardinal;
 | |
| Function UpdCrc32(InitCrc:cardinal;b:byte):cardinal;
 | |
| 
 | |
| 
 | |
| Implementation
 | |
| 
 | |
| {*****************************************************************************
 | |
|                                    Crc 32
 | |
| *****************************************************************************}
 | |
| 
 | |
| var
 | |
|   Crc32Tbl : array[0..255] of cardinal;
 | |
| 
 | |
| procedure MakeCRC32Tbl;
 | |
| var
 | |
|   crc : cardinal;
 | |
|   i,n : integer;
 | |
| begin
 | |
|   for i:=0 to 255 do
 | |
|    begin
 | |
|      crc:=i;
 | |
|      for n:=1 to 8 do
 | |
|       if (crc and 1)<>0 then
 | |
|        crc:=(crc shr 1) xor cardinal($edb88320)
 | |
|       else
 | |
|        crc:=crc shr 1;
 | |
|      Crc32Tbl[i]:=crc;
 | |
|    end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| Function Crc32(Const HStr:String):cardinal;
 | |
| var
 | |
|   i : integer;
 | |
|   InitCrc : cardinal;
 | |
| begin
 | |
|   if Crc32Tbl[1]=0 then
 | |
|    MakeCrc32Tbl;
 | |
|   InitCrc:=cardinal($ffffffff);
 | |
|   for i:=1 to Length(Hstr) do
 | |
|    InitCrc:=Crc32Tbl[byte(InitCrc) xor ord(Hstr[i])] xor (InitCrc shr 8);
 | |
|   Crc32:=InitCrc;
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| Function UpdateCrc32(InitCrc:cardinal;const InBuf;InLen:Integer):cardinal;
 | |
| var
 | |
|   i : integer;
 | |
|   p : pchar;
 | |
| begin
 | |
|   if Crc32Tbl[1]=0 then
 | |
|    MakeCrc32Tbl;
 | |
|   p:=@InBuf;
 | |
|   for i:=1 to InLen do
 | |
|    begin
 | |
|      InitCrc:=Crc32Tbl[byte(InitCrc) xor byte(p^)] xor (InitCrc shr 8);
 | |
|      inc(p);
 | |
|    end;
 | |
|   UpdateCrc32:=InitCrc;
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| Function UpdCrc32(InitCrc:cardinal;b:byte):cardinal;
 | |
| begin
 | |
|   if Crc32Tbl[1]=0 then
 | |
|    MakeCrc32Tbl;
 | |
|   UpdCrc32:=Crc32Tbl[byte(InitCrc) xor b] xor (InitCrc shr 8);
 | |
| end;
 | |
| 
 | |
| end.
 | |
| {
 | |
|   $Log$
 | |
|   Revision 1.9  2002-05-18 13:34:06  peter
 | |
|     * readded missing revisions
 | |
| 
 | |
|   Revision 1.8  2002/05/16 19:46:35  carl
 | |
|   + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
 | |
|   + try to fix temp allocation (still in ifdef)
 | |
|   + generic constructor calls
 | |
|   + start of tassembler / tmodulebase class cleanup
 | |
| 
 | |
| }
 | 
