mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-12 10:19:15 +02:00
LazUtils: Restore backwards compatible TMaskOptions to Masks. More tests.
This commit is contained in:
parent
f1156f551a
commit
04b0a04a45
@ -154,6 +154,10 @@ const
|
|||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
|
// Backwards compatible options.
|
||||||
|
TMaskOption = (moCaseSensitive, moDisableSets);
|
||||||
|
TMaskOptions = set of TMaskOption;
|
||||||
|
|
||||||
{ TMaskBase }
|
{ TMaskBase }
|
||||||
|
|
||||||
TMaskBase = class
|
TMaskBase = class
|
||||||
@ -189,6 +193,7 @@ type
|
|||||||
public
|
public
|
||||||
constructor Create(aCaseSensitive: Boolean=False;
|
constructor Create(aCaseSensitive: Boolean=False;
|
||||||
aOpcodesAllowed: TMaskOpcodesSet=MaskOpCodesDefaultAllowed);
|
aOpcodesAllowed: TMaskOpcodesSet=MaskOpCodesDefaultAllowed);
|
||||||
|
constructor Create(aOptions: TMaskOptions);
|
||||||
public
|
public
|
||||||
property CaseSensitive: Boolean read cCaseSensitive;
|
property CaseSensitive: Boolean read cCaseSensitive;
|
||||||
property EscapeChar: Char read cMaskEscapeChar write SetMaskEscapeChar;
|
property EscapeChar: Char read cMaskEscapeChar write SetMaskEscapeChar;
|
||||||
@ -214,6 +219,8 @@ type
|
|||||||
public
|
public
|
||||||
constructor Create(const aMask: RawByteString; aCaseSensitive: Boolean=False;
|
constructor Create(const aMask: RawByteString; aCaseSensitive: Boolean=False;
|
||||||
aOpcodesAllowed: TMaskOpcodesSet=MaskOpCodesDefaultAllowed);
|
aOpcodesAllowed: TMaskOpcodesSet=MaskOpCodesDefaultAllowed);
|
||||||
|
constructor Create(const aMask: RawByteString; aOptions: TMaskOptions);
|
||||||
|
|
||||||
procedure Compile; override;
|
procedure Compile; override;
|
||||||
function Matches(const aStringToMatch: RawByteString): Boolean; virtual;
|
function Matches(const aStringToMatch: RawByteString): Boolean; virtual;
|
||||||
public
|
public
|
||||||
@ -234,7 +241,9 @@ type
|
|||||||
out aFileName: RawByteString; out aExtension: RawByteString; aIsMask: Boolean=False); static;
|
out aFileName: RawByteString; out aExtension: RawByteString; aIsMask: Boolean=False); static;
|
||||||
public
|
public
|
||||||
constructor Create(const aMask: RawByteString; aCaseSensitive: Boolean=False;
|
constructor Create(const aMask: RawByteString; aCaseSensitive: Boolean=False;
|
||||||
|
aOpcodesAllowed: TMaskOpcodesSet=MaskOpCodesDefaultAllowed;
|
||||||
aWindowsQuirksAllowed: TWindowsQuirkSet=WindowsQuirksDefaultAllowed);
|
aWindowsQuirksAllowed: TWindowsQuirkSet=WindowsQuirksDefaultAllowed);
|
||||||
|
|
||||||
procedure Compile; override;
|
procedure Compile; override;
|
||||||
function Matches(const aFileName: RawByteString): Boolean; override;
|
function Matches(const aFileName: RawByteString): Boolean; override;
|
||||||
public
|
public
|
||||||
@ -261,10 +270,13 @@ type
|
|||||||
function GetCount: Integer;
|
function GetCount: Integer;
|
||||||
function GetItem(Index: Integer): TMask;
|
function GetItem(Index: Integer): TMask;
|
||||||
public
|
public
|
||||||
constructor Create(const AValue: String; ASeparator: Char=';'; CaseSensitive: Boolean=False;
|
constructor Create(const aValue: String; aSeparator: Char=';'; CaseSensitive: Boolean=False;
|
||||||
aOpcodesAllowed: TMaskOpcodesSet=MaskOpCodesDefaultAllowed);
|
aOpcodesAllowed: TMaskOpcodesSet=MaskOpCodesDefaultAllowed);
|
||||||
constructor CreateWindows(const AValue: String; ASeparator: Char; CaseSensitive: Boolean);
|
constructor Create(const aValue: String; aSeparator: Char; aOptions: TMaskOptions);
|
||||||
constructor CreateSysNative(const AValue: String; ASeparator: Char; CaseSensitive: Boolean);
|
constructor CreateWindows(const aValue: String; aSeparator: Char=';'; CaseSensitive: Boolean=False;
|
||||||
|
aOpcodesAllowed: TMaskOpcodesSet=MaskOpCodesDefaultAllowed);
|
||||||
|
constructor CreateWindows(const aValue: String; aSeparator: Char; aOptions: TMaskOptions);
|
||||||
|
constructor CreateSysNative(const aValue: String; aSeparator: Char; CaseSensitive: Boolean);
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
|
|
||||||
function Matches(const AFileName: String): Boolean;
|
function Matches(const AFileName: String): Boolean;
|
||||||
@ -278,17 +290,36 @@ type
|
|||||||
|
|
||||||
function MatchesMask(const FileName, Mask: String; CaseSensitive: Boolean=False;
|
function MatchesMask(const FileName, Mask: String; CaseSensitive: Boolean=False;
|
||||||
aOpcodesAllowed: TMaskOpcodesSet=MaskOpCodesDefaultAllowed): Boolean;
|
aOpcodesAllowed: TMaskOpcodesSet=MaskOpCodesDefaultAllowed): Boolean;
|
||||||
function MatchesWindowsMask(const FileName, Mask: String; CaseSensitive: Boolean=False): Boolean;
|
function MatchesMask(const FileName, Mask: String; Options: TMaskOptions): Boolean;
|
||||||
|
|
||||||
|
function MatchesWindowsMask(const FileName, Mask: String; CaseSensitive: Boolean=False;
|
||||||
|
aOpcodesAllowed: TMaskOpcodesSet=MaskOpCodesDefaultAllowed;
|
||||||
|
aWindowsQuirksAllowed: TWindowsQuirkSet=WindowsQuirksDefaultAllowed): Boolean;
|
||||||
|
function MatchesWindowsMask(const FileName, Mask: String; Options: TMaskOptions): Boolean;
|
||||||
|
|
||||||
function MatchesMaskList(const FileName, Mask: String; Separator: Char=';';
|
function MatchesMaskList(const FileName, Mask: String; Separator: Char=';';
|
||||||
CaseSensitive: Boolean=False;
|
CaseSensitive: Boolean=False;
|
||||||
aOpcodesAllowed: TMaskOpcodesSet=MaskOpCodesDefaultAllowed): Boolean;
|
aOpcodesAllowed: TMaskOpcodesSet=MaskOpCodesDefaultAllowed): Boolean;
|
||||||
|
function MatchesMaskList(const FileName, Mask: String; Separator: Char;
|
||||||
|
Options: TMaskOptions): Boolean;
|
||||||
|
|
||||||
function MatchesWindowsMaskList(const FileName, Mask: String; Separator: Char=';';
|
function MatchesWindowsMaskList(const FileName, Mask: String; Separator: Char=';';
|
||||||
CaseSensitive: Boolean=False): Boolean;
|
CaseSensitive: Boolean=False;
|
||||||
|
aOpcodesAllowed: TMaskOpcodesSet=MaskOpCodesDefaultAllowed): Boolean;
|
||||||
|
function MatchesWindowsMaskList(const FileName, Mask: String; Separator: Char;
|
||||||
|
Options: TMaskOptions): Boolean;
|
||||||
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
function EncodeDisableRange(Options: TMaskOptions): TMaskOpcodesSet;
|
||||||
|
begin
|
||||||
|
if moDisableSets in Options then
|
||||||
|
Result:=MaskOpCodesDisableRange
|
||||||
|
else
|
||||||
|
Result:=MaskOpCodesDefaultAllowed;
|
||||||
|
end;
|
||||||
|
|
||||||
function MatchesMask(const FileName, Mask: String; CaseSensitive: Boolean;
|
function MatchesMask(const FileName, Mask: String; CaseSensitive: Boolean;
|
||||||
aOpcodesAllowed: TMaskOpcodesSet): Boolean;
|
aOpcodesAllowed: TMaskOpcodesSet): Boolean;
|
||||||
var
|
var
|
||||||
@ -302,11 +333,17 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function MatchesWindowsMask(const FileName, Mask: String; CaseSensitive: Boolean): Boolean;
|
function MatchesMask(const FileName, Mask: String; Options: TMaskOptions): Boolean;
|
||||||
|
begin
|
||||||
|
MatchesMask(FileName, Mask, moCaseSensitive in Options, EncodeDisableRange(Options));
|
||||||
|
end;
|
||||||
|
|
||||||
|
function MatchesWindowsMask(const FileName, Mask: String; CaseSensitive: Boolean;
|
||||||
|
aOpcodesAllowed: TMaskOpcodesSet; aWindowsQuirksAllowed: TWindowsQuirkSet): Boolean;
|
||||||
var
|
var
|
||||||
AMask: TMaskWindows;
|
AMask: TMaskWindows;
|
||||||
begin
|
begin
|
||||||
AMask := TMaskWindows.Create(Mask, CaseSensitive);
|
AMask := TMaskWindows.Create(Mask, CaseSensitive, aOpcodesAllowed, aWindowsQuirksAllowed);
|
||||||
try
|
try
|
||||||
Result := AMask.Matches(FileName);
|
Result := AMask.Matches(FileName);
|
||||||
finally
|
finally
|
||||||
@ -314,6 +351,11 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function MatchesWindowsMask(const FileName, Mask: String; Options: TMaskOptions): Boolean;
|
||||||
|
begin
|
||||||
|
MatchesWindowsMask(FileName, Mask, moCaseSensitive in Options, EncodeDisableRange(Options));
|
||||||
|
end;
|
||||||
|
|
||||||
function MatchesMaskList(const FileName, Mask: String; Separator: Char;
|
function MatchesMaskList(const FileName, Mask: String; Separator: Char;
|
||||||
CaseSensitive: Boolean; aOpcodesAllowed: TMaskOpcodesSet): Boolean;
|
CaseSensitive: Boolean; aOpcodesAllowed: TMaskOpcodesSet): Boolean;
|
||||||
var
|
var
|
||||||
@ -327,12 +369,19 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function MatchesMaskList(const FileName, Mask: String; Separator: Char;
|
||||||
|
Options: TMaskOptions): Boolean;
|
||||||
|
begin
|
||||||
|
MatchesMaskList(FileName, Mask, Separator, moCaseSensitive in Options,
|
||||||
|
EncodeDisableRange(Options));
|
||||||
|
end;
|
||||||
|
|
||||||
function MatchesWindowsMaskList(const FileName, Mask: String; Separator: Char;
|
function MatchesWindowsMaskList(const FileName, Mask: String; Separator: Char;
|
||||||
CaseSensitive: Boolean): Boolean;
|
CaseSensitive: Boolean; aOpcodesAllowed: TMaskOpcodesSet): Boolean;
|
||||||
var
|
var
|
||||||
AMaskList: TMaskList;
|
AMaskList: TMaskList;
|
||||||
begin
|
begin
|
||||||
AMaskList := TMaskList.CreateWindows(Mask, Separator, CaseSensitive);
|
AMaskList := TMaskList.CreateWindows(Mask, Separator, CaseSensitive, aOpcodesAllowed);
|
||||||
try
|
try
|
||||||
Result := AMaskList.Matches(FileName);
|
Result := AMaskList.Matches(FileName);
|
||||||
finally
|
finally
|
||||||
@ -340,6 +389,13 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function MatchesWindowsMaskList(const FileName, Mask: String; Separator: Char;
|
||||||
|
Options: TMaskOptions): Boolean;
|
||||||
|
begin
|
||||||
|
MatchesWindowsMaskList(FileName, Mask, Separator, moCaseSensitive in Options,
|
||||||
|
EncodeDisableRange(Options));
|
||||||
|
end;
|
||||||
|
|
||||||
{ EMaskError }
|
{ EMaskError }
|
||||||
|
|
||||||
constructor EMaskError.Create(const msg: string; aCode: TMaskExceptionCode);
|
constructor EMaskError.Create(const msg: string; aCode: TMaskExceptionCode);
|
||||||
@ -446,11 +502,16 @@ end;
|
|||||||
|
|
||||||
constructor TMaskBase.Create(aCaseSensitive: Boolean; aOpcodesAllowed: TMaskOpcodesSet);
|
constructor TMaskBase.Create(aCaseSensitive: Boolean; aOpcodesAllowed: TMaskOpcodesSet);
|
||||||
begin
|
begin
|
||||||
cMaskOpcodesAllowed:=aOpcodesAllowed;
|
|
||||||
cCaseSensitive:=aCaseSensitive;
|
cCaseSensitive:=aCaseSensitive;
|
||||||
|
cMaskOpcodesAllowed:=aOpcodesAllowed;
|
||||||
cMaskEscapeChar:='\';
|
cMaskEscapeChar:='\';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
constructor TMaskBase.Create(aOptions: TMaskOptions);
|
||||||
|
begin
|
||||||
|
Create(moCaseSensitive in aOptions, EncodeDisableRange(aOptions));
|
||||||
|
end;
|
||||||
|
|
||||||
{ TMask }
|
{ TMask }
|
||||||
|
|
||||||
procedure TMaskUTF8.AddAnyChar;
|
procedure TMaskUTF8.AddAnyChar;
|
||||||
@ -820,6 +881,12 @@ begin
|
|||||||
cOriginalMask:=aMask;
|
cOriginalMask:=aMask;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
constructor TMaskUTF8.Create(const aMask: RawByteString; aOptions: TMaskOptions);
|
||||||
|
begin
|
||||||
|
inherited Create(aOptions);
|
||||||
|
cOriginalMask:=aMask;
|
||||||
|
end;
|
||||||
|
|
||||||
function TMaskUTF8.Matches(const aStringToMatch: RawByteString): Boolean;
|
function TMaskUTF8.Matches(const aStringToMatch: RawByteString): Boolean;
|
||||||
begin
|
begin
|
||||||
if not cMaskIsCompiled then Compile;
|
if not cMaskIsCompiled then Compile;
|
||||||
@ -865,12 +932,12 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TMaskUTF8Windows.Create(const aMask: RawByteString;
|
constructor TMaskUTF8Windows.Create(const aMask: RawByteString; aCaseSensitive: Boolean;
|
||||||
aCaseSensitive: Boolean; aWindowsQuirksAllowed: TWindowsQuirkSet);
|
aOpcodesAllowed: TMaskOpcodesSet; aWindowsQuirksAllowed: TWindowsQuirkSet);
|
||||||
begin
|
begin
|
||||||
cMaskWindowsQuirkAllowed:=aWindowsQuirksAllowed;
|
cMaskWindowsQuirkAllowed:=aWindowsQuirksAllowed;
|
||||||
cWindowsMask:=aMask;
|
cWindowsMask:=aMask;
|
||||||
inherited Create(aMask,aCaseSensitive,MaskOpCodesDefaultAllowed);
|
inherited Create(aMask,aCaseSensitive,aOpcodesAllowed);
|
||||||
Compile;
|
Compile;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -1006,7 +1073,7 @@ end;
|
|||||||
|
|
||||||
{ TMaskList }
|
{ TMaskList }
|
||||||
|
|
||||||
constructor TMaskList.Create(const AValue: String; ASeparator: Char;
|
constructor TMaskList.Create(const aValue: String; aSeparator: Char;
|
||||||
CaseSensitive: Boolean; aOpcodesAllowed: TMaskOpcodesSet);
|
CaseSensitive: Boolean; aOpcodesAllowed: TMaskOpcodesSet);
|
||||||
var
|
var
|
||||||
S: TParseStringList;
|
S: TParseStringList;
|
||||||
@ -1014,7 +1081,7 @@ var
|
|||||||
begin
|
begin
|
||||||
FMasks := TObjectList.Create(True);
|
FMasks := TObjectList.Create(True);
|
||||||
FWindowsMasks := TObjectList.Create(True);
|
FWindowsMasks := TObjectList.Create(True);
|
||||||
S := TParseStringList.Create(AValue, ASeparator);
|
S := TParseStringList.Create(aValue, aSeparator);
|
||||||
try
|
try
|
||||||
for I := 0 to S.Count-1 do begin
|
for I := 0 to S.Count-1 do begin
|
||||||
FMasks.Add(TMask.Create(S[I], CaseSensitive, aOpcodesAllowed));
|
FMasks.Add(TMask.Create(S[I], CaseSensitive, aOpcodesAllowed));
|
||||||
@ -1026,7 +1093,21 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TMaskList.CreateWindows(const AValue: String; ASeparator: Char; CaseSensitive: Boolean);
|
constructor TMaskList.Create(const aValue: String; aSeparator: Char; aOptions: TMaskOptions);
|
||||||
|
var
|
||||||
|
CaseSens: Boolean;
|
||||||
|
Opcodes: TMaskOpcodesSet;
|
||||||
|
begin
|
||||||
|
CaseSens:=moCaseSensitive in aOptions;
|
||||||
|
if moDisableSets in aOptions then
|
||||||
|
Opcodes:=MaskOpCodesDisableRange
|
||||||
|
else
|
||||||
|
Opcodes:=MaskOpCodesDefaultAllowed;
|
||||||
|
Create(aValue, aSeparator, CaseSens, Opcodes);
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TMaskList.CreateWindows(const aValue: String; aSeparator: Char;
|
||||||
|
CaseSensitive: Boolean; aOpcodesAllowed: TMaskOpcodesSet);
|
||||||
var
|
var
|
||||||
S: TParseStringList;
|
S: TParseStringList;
|
||||||
I: Integer;
|
I: Integer;
|
||||||
@ -1035,13 +1116,20 @@ begin
|
|||||||
S := TParseStringList.Create(AValue, ASeparator);
|
S := TParseStringList.Create(AValue, ASeparator);
|
||||||
try
|
try
|
||||||
for I := 0 to S.Count-1 do
|
for I := 0 to S.Count-1 do
|
||||||
FMasks.Add(TMaskWindows.Create(S[I], CaseSensitive));
|
FMasks.Add(TMaskWindows.Create(S[I], CaseSensitive, aOpcodesAllowed));
|
||||||
finally
|
finally
|
||||||
S.Free;
|
S.Free;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TMaskList.CreateSysNative(const AValue: String; ASeparator: Char; CaseSensitive: Boolean);
|
constructor TMaskList.CreateWindows(const aValue: String; aSeparator: Char;
|
||||||
|
aOptions: TMaskOptions);
|
||||||
|
begin
|
||||||
|
CreateWindows(aValue, aSeparator, moCaseSensitive in aOptions, EncodeDisableRange(aOptions));
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TMaskList.CreateSysNative(const aValue: String; aSeparator: Char;
|
||||||
|
CaseSensitive: Boolean);
|
||||||
begin
|
begin
|
||||||
{$IFDEF Windows}
|
{$IFDEF Windows}
|
||||||
CreateWindows(AValue, ASeparator, CaseSensitive);
|
CreateWindows(AValue, ASeparator, CaseSensitive);
|
||||||
|
@ -239,7 +239,12 @@ end;
|
|||||||
|
|
||||||
procedure TTestMask.TestDisableRange;
|
procedure TTestMask.TestDisableRange;
|
||||||
begin
|
begin
|
||||||
|
TestMaskDisableRange('a[b]c', 'a[b]c', True); // [] is now literal.
|
||||||
|
// Wildcard syntax should still work.
|
||||||
TestMaskDisableRange('a[b]c', '?[b]?', True);
|
TestMaskDisableRange('a[b]c', '?[b]?', True);
|
||||||
|
TestMaskDisableRange('abc', 'a*', True);
|
||||||
|
TestMaskDisableRange('abc', '?b?', True);
|
||||||
|
|
||||||
TestMaskDisableRange('abc', '?[b]?', False);
|
TestMaskDisableRange('abc', '?[b]?', False);
|
||||||
TestMaskDisableRange('c', '[c]', False);
|
TestMaskDisableRange('c', '[c]', False);
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user