From a2bfc5e9f4c66db6a29810c064b981d772aefb2a Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sun, 9 Nov 2008 16:06:45 +0100 Subject: Port CRC32 and MD5 functions to standard FreePascal RTL Added compat dir for Kylix compatibility --- UChecksum.pas | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) (limited to 'UChecksum.pas') diff --git a/UChecksum.pas b/UChecksum.pas index 35bb7a1..9bd2aaf 100644 --- a/UChecksum.pas +++ b/UChecksum.pas @@ -63,7 +63,7 @@ var implementation -uses ULocale, UCoreUtils, ULibc, UCore, DateUtils; +uses ULocale, UCoreUtils, ULibc, UCore, DateUtils, md5, crc; type TFileListItem = class public @@ -210,7 +210,7 @@ begin i := integer(Application.MessageBox(Format(LANGTheFileSYouAreTryingToOpenIsQuiteBig, [StrToUTF8(ExtractFileName(FileName))]), [mbYes, mbNo], mbWarning, mbNone, mbNo)); if (i = integer(mbNo)) or (i = 251) then Exit; end; - IsMD5 := (Pos('MD5', WideUpperCase(FileName)) > 0) or ((Pos('SFV', WideUpperCase(FileName)) = 0) and (Pos('SUM', WideUpperCase(FileName)) > 0)); + IsMD5 := (Pos('MD5', WideUpperCase(ExtractFileName(FileName))) > 0) or ((Pos('SFV', WideUpperCase(ExtractFileName(FileName))) = 0) and (Pos('SUM', WideUpperCase(ExtractFileName(FileName))) > 0)); if IsMD5 then MD5Present := True else SFVPresent := True; if MD5Present and SFVPresent then FileList.Columns[1].Caption := 'CRC32/MD5' @@ -377,7 +377,8 @@ var i, Error, Count: integer; Data: TFileListItem; Time1, Time2: TDateTime; CRC: LongWord; - MD5Hash: THash_MD5; + MDContext: TMDContext; + MDDigest: TMDDigest; begin if List.Count = 0 then Exit; CheckButton.Caption := LANGCheckButtonCaptionStop; @@ -411,9 +412,8 @@ begin FileList.Items[i].SetCursor(0, False, False, 0, 0); Application.ProcessMessages; Data := List[i]; - CRC := $FFFFFFFF; - MD5Hash := nil; - if Data.IsMD5 then MD5Hash := THash_MD5.Create; + CRC := 0; + if Data.IsMD5 then MDInit(MDContext, MD_VERSION_5); Error := 0; FD := Engine.OpenFile(Data.FullPath, omRead, Error); if Error <> 0 then begin @@ -428,17 +428,16 @@ begin Continue; end; if not Data.IsMD5 then CRC := CRC32(CRC, Buffer, Count) - else MD5Hash.Calc(Buffer^, Count); + else MDUpdate(MDContext, Buffer^, Count); ProgressBar.Value := ProgressBar.Value + Count; ProgressBar.Text := Format('%d %%', [Trunc(ProgressBar.Fraction * 100)]); Application.ProcessMessages; until (Count < ChksumBlockSize) or Stop; if Stop then Break; Engine.CloseFile(FD); - if not Data.IsMD5 then Data.Status := Ord(not ((not CRC) = Data.CRC)) + 1 else begin - MD5Hash.Done; - Data.Status := Ord(AnsiCompareText(Data.MD5, MD5Hash.GetKeyStrH) <> 0) + 1; - MD5Hash.Free; + if not Data.IsMD5 then Data.Status := Ord(not (CRC = Data.CRC)) + 1 else begin + MDFinal(MDContext, MDDigest); + Data.Status := Ord(AnsiCompareText(Data.MD5, MDPrint(MDDigest)) <> 0) + 1; end; if Data.Status in [2, 3] then MarkAsBad(Data.FullPath); end; -- cgit v1.2.3