JarUnPacker/prereq/ANB ST CP/data/VersionControl.pas
2023-02-02 12:02:14 +03:00

146 lines
5.6 KiB
ObjectPascal

unit VersionControl;
{$MODE Delphi}
{$codepage UTF8}
interface
uses LCLIntf, LCLType, LMessages, SysUtils, StrUtils, Forms, Classes,
{$IFDEF WINDOWS}PJVersionInfo{$ENDIF};
type TSmallVersionInfo = record
sviMajor, sviMinor: int64;
end;
type TVersionInfo = record
viMajor, viMinor, viRelease, viBuild: integer;
end;
function SmallVersionInfoToStr (const Value: TSmallVersionInfo): string; stdcall;
function VersionInfoToStr (const Value: TVersionInfo): string; stdcall;
function VersionInfoToSmallVersionInfo (const Value: TVersionInfo): TSmallVersionInfo; stdcall;
function SmallVersionInfoToVersionInfo (const Value: TSmallVersionInfo; const ANilValue: integer = 0): TVersionInfo; stdcall;
function StrToVersionInfo (const AString: string): TVersionInfo; stdcall;
function StrToSmallVersionInfo (const AString: string): TSmallVersionInfo; stdcall;
function CompareVersionInfo (const AVersionInfo1, AVersionInfo2: TVersionInfo): integer; stdcall;
function CompareSmallVersionInfo (const ASmallVersionInfo1, ASmallVersionInfo2: TSmallVersionInfo): integer; stdcall;
{$IFDEF WINDOWS}function GetApplicationVersionInfoStr (const AFileName, AVersionSTR: string): string; STDCALL;{$ENDIF}
const NilVersionInfo: TVersionInfo = (viMajor: 0; viMinor: 0; viRelease: 0; viBuild: 0);
NilSmallVersionInfo: TSmallVersionInfo = (sviMajor: 0; sviMinor: 0);
implementation
function SmallVersionInfoToStr (const Value: TSmallVersionInfo): string;
const Mask: string = '%d.%d';
begin
Result:= Format(Mask, [Value.sviMajor, Value.sviMinor]);
end;
function VersionInfoToStr (const Value: TVersionInfo): string;
const Mask: string = '%d.%d.%d.%d';
begin
Result:= Format(Mask, [Value.viMajor, Value.viMinor, Value.viRelease, Value.viBuild]);
end;
function VersionInfoToSmallVersionInfo (const Value: TVersionInfo): TSmallVersionInfo;
begin
Result.sviMajor:= Value.viMajor;
Result.sviMinor:= Value.viMinor;
end;
function SmallVersionInfoToVersionInfo (const Value: TSmallVersionInfo; const ANilValue: integer = 0): TVersionInfo;
begin
Result.viMajor:= Value.sviMajor;
Result.viMinor:= Value.sviMinor;
Result.viRelease:= ANilValue;
Result.viBuild:= ANilValue;
end;
function StrToVersionInfo (const AString: string): TVersionInfo;
var stringver: string;
CurrDelim, NextDelim, CurrIndex: Integer;
StrArray: array [1..4] of string;
begin
stringver:= AString;
CurrDelim:= 1;
CurrIndex:= 1;
repeat
NextDelim:= PosEx('.', stringver, CurrDelim);
if NextDelim = 0 then
NextDelim:= Length(stringver) + 1;
StrArray[CurrIndex]:= Copy(stringver, CurrDelim, NextDelim - CurrDelim);
CurrDelim:= NextDelim + 1;
CurrIndex:= CurrIndex + 1;
until CurrDelim > Length(stringver);
Result.viMajor:= StrToInt(StrArray[1]);
Result.viMinor:= StrToInt(StrArray[2]);
Result.viRelease:= StrToInt(StrArray[3]);
Result.viBuild:= StrToInt(StrArray[4]);
end;
function StrToSmallVersionInfo (const AString: string): TSmallVersionInfo;
var stringver: string;
CurrDelim, NextDelim: Integer;
StrArray: array [1..2] of string;
begin
stringver:= AString;
NextDelim:= PosEx('.', stringver, 1);
if NextDelim = 0 then
begin
StrArray[1]:= stringver;
Exit;
end;
StrArray[1]:= Copy(stringver, 1, NextDelim - 1);
CurrDelim:= NextDelim + 1;
NextDelim:= PosEx('.', stringver, CurrDelim);
if NextDelim = 0 then
NextDelim:= Length(stringver) + 1;
StrArray[2]:= Copy(stringver, CurrDelim, NextDelim - CurrDelim);
Result.sviMajor:= StrToInt(StrArray[1]);
Result.sviMinor:= StrToInt(StrArray[2]);
end;
function CompareVersionInfo (const AVersionInfo1, AVersionInfo2: TVersionInfo): integer;
//Result:
// 0 - AVersionInfo1 = AVersionInfo2
// -1 - AVersionInfo1 > AVersionInfo2
// 1 - AVersionInfo1 < AVersionInfo2
begin
//by default this versions are equal
Result:= 0;
//equal
if ((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and
(AVersionInfo1.viMinor = AVersionInfo2.viMinor) and
(AVersionInfo1.viRelease = AVersionInfo2.viRelease) and
(AVersionInfo1.viBuild = AVersionInfo2.viBuild)) then
Result:= 0;
//more
if ((AVersionInfo1.viMajor > AVersionInfo2.viMajor) or
((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and
(AVersionInfo1.viMinor > AVersionInfo2.viMinor)) or
((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and
(AVersionInfo1.viMinor = AVersionInfo2.viMinor) and
(AVersionInfo1.viRelease > AVersionInfo2.viRelease)) or
((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and
(AVersionInfo1.viMinor = AVersionInfo2.viMinor) and
(AVersionInfo1.viRelease = AVersionInfo2.viRelease) and
(AVersionInfo1.viBuild > AVersionInfo2.viBuild))) then
Result:= -1;
//less
if ((AVersionInfo1.viMajor < AVersionInfo2.viMajor) or
((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and
(AVersionInfo1.viMinor < AVersionInfo2.viMinor)) or
((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and
(AVersionInfo1.viMinor = AVersionInfo2.viMinor) and
(AVersionInfo1.viRelease < AVersionInfo2.viRelease)) or
((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and
(AVersionInfo1.viMinor = AVersionInfo2.viMinor) and
(AVersionInfo1.viRelease = AVersionInfo2.viRelease) and
(AVersionInfo1.viBuild < AVersionInfo2.viBuild))) then
Result:= 1;
end;
function CompareSmallVersionInfo (const ASmallVersionInfo1, ASmallVersionInfo2: TSmallVersionInfo): integer;
var AVI1, AVI2: TVersionInfo;
begin
AVI1:= SmallVersionInfoToVersionInfo(ASmallVersionInfo1);
AVI2:= SmallVersionInfoToVersionInfo(ASmallVersionInfo2);
Result:= CompareVersionInfo(AVI1, AVI2);
end;
{$IFDEF WINDOWS}
function GetApplicationVersionInfoStr (const AFileName, AVersionSTR: string): string;
var VIC: TPJVersionInfo;
begin
VIC:= TPJVersionInfo.Create(nil);
VIC.FileName:= AFileName;
Result:= VIC.StringFileInfo[AVersionSTR];
VIC.Free;
end;
{$ENDIF WINDOWS}
end.