mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 16:09:31 +02:00
* the FNMatch private helper function moved from unit DOS to unit WasiUtil, and
changed to have rawbytestring parameters, so it can be used from SysUtils as well.
This commit is contained in:
parent
de3ab7e46b
commit
78c4585b53
@ -385,88 +385,6 @@ end;
|
||||
******************************************************************************}
|
||||
|
||||
|
||||
Function FNMatch(const Pattern,Name:string):Boolean;
|
||||
Var
|
||||
LenPat,LenName : longint;
|
||||
|
||||
Function DoFNMatch(i,j:longint):Boolean;
|
||||
Var
|
||||
Found : boolean;
|
||||
Begin
|
||||
Found:=true;
|
||||
While Found and (i<=LenPat) Do
|
||||
Begin
|
||||
Case Pattern[i] of
|
||||
'?' : Found:=(j<=LenName);
|
||||
'*' : Begin
|
||||
{find the next character in pattern, different of ? and *}
|
||||
while Found do
|
||||
begin
|
||||
inc(i);
|
||||
if i>LenPat then Break;
|
||||
case Pattern[i] of
|
||||
'*' : ;
|
||||
'?' : begin
|
||||
if j>LenName then begin DoFNMatch:=false; Exit; end;
|
||||
inc(j);
|
||||
end;
|
||||
else
|
||||
Found:=false;
|
||||
end;
|
||||
end;
|
||||
Assert((i>LenPat) or ( (Pattern[i]<>'*') and (Pattern[i]<>'?') ));
|
||||
{Now, find in name the character which i points to, if the * or ?
|
||||
wasn't the last character in the pattern, else, use up all the
|
||||
chars in name}
|
||||
Found:=false;
|
||||
if (i<=LenPat) then
|
||||
begin
|
||||
repeat
|
||||
{find a letter (not only first !) which maches pattern[i]}
|
||||
while (j<=LenName) and (name[j]<>pattern[i]) do
|
||||
inc (j);
|
||||
if (j<LenName) then
|
||||
begin
|
||||
if DoFnMatch(i+1,j+1) then
|
||||
begin
|
||||
i:=LenPat;
|
||||
j:=LenName;{we can stop}
|
||||
Found:=true;
|
||||
Break;
|
||||
end else
|
||||
inc(j);{We didn't find one, need to look further}
|
||||
end else
|
||||
if j=LenName then
|
||||
begin
|
||||
Found:=true;
|
||||
Break;
|
||||
end;
|
||||
{ This 'until' condition must be j>LenName, not j>=LenName.
|
||||
That's because when we 'need to look further' and
|
||||
j = LenName then loop must not terminate. }
|
||||
until (j>LenName);
|
||||
end else
|
||||
begin
|
||||
j:=LenName;{we can stop}
|
||||
Found:=true;
|
||||
end;
|
||||
end;
|
||||
else {not a wildcard character in pattern}
|
||||
Found:=(j<=LenName) and (pattern[i]=name[j]);
|
||||
end;
|
||||
inc(i);
|
||||
inc(j);
|
||||
end;
|
||||
DoFnMatch:=Found and (j>LenName);
|
||||
end;
|
||||
|
||||
Begin {start FNMatch}
|
||||
LenPat:=Length(Pattern);
|
||||
LenName:=Length(Name);
|
||||
FNMatch:=DoFNMatch(1,1);
|
||||
End;
|
||||
|
||||
|
||||
Const
|
||||
RtlFindSize = 15;
|
||||
Type
|
||||
|
@ -24,7 +24,89 @@ uses
|
||||
|
||||
function ConvertToFdRelativePath(path: RawByteString; out fd: LongInt; out relfd_path: RawByteString): Word; external name 'FPC_WASI_CONVERTTOFDRELATIVEPATH';
|
||||
function fpc_wasi_path_readlink_ansistring(fd: __wasi_fd_t; const path: PChar; path_len: size_t; out link: rawbytestring): __wasi_errno_t; external name 'FPC_WASI_PATH_READLINK_ANSISTRING';
|
||||
function FNMatch(const Pattern,Name:rawbytestring):Boolean;
|
||||
|
||||
implementation
|
||||
|
||||
Function FNMatch(const Pattern,Name:rawbytestring):Boolean;
|
||||
Var
|
||||
LenPat,LenName : longint;
|
||||
|
||||
Function DoFNMatch(i,j:longint):Boolean;
|
||||
Var
|
||||
Found : boolean;
|
||||
Begin
|
||||
Found:=true;
|
||||
While Found and (i<=LenPat) Do
|
||||
Begin
|
||||
Case Pattern[i] of
|
||||
'?' : Found:=(j<=LenName);
|
||||
'*' : Begin
|
||||
{find the next character in pattern, different of ? and *}
|
||||
while Found do
|
||||
begin
|
||||
inc(i);
|
||||
if i>LenPat then Break;
|
||||
case Pattern[i] of
|
||||
'*' : ;
|
||||
'?' : begin
|
||||
if j>LenName then begin DoFNMatch:=false; Exit; end;
|
||||
inc(j);
|
||||
end;
|
||||
else
|
||||
Found:=false;
|
||||
end;
|
||||
end;
|
||||
Assert((i>LenPat) or ( (Pattern[i]<>'*') and (Pattern[i]<>'?') ));
|
||||
{Now, find in name the character which i points to, if the * or ?
|
||||
wasn't the last character in the pattern, else, use up all the
|
||||
chars in name}
|
||||
Found:=false;
|
||||
if (i<=LenPat) then
|
||||
begin
|
||||
repeat
|
||||
{find a letter (not only first !) which maches pattern[i]}
|
||||
while (j<=LenName) and (name[j]<>pattern[i]) do
|
||||
inc (j);
|
||||
if (j<LenName) then
|
||||
begin
|
||||
if DoFnMatch(i+1,j+1) then
|
||||
begin
|
||||
i:=LenPat;
|
||||
j:=LenName;{we can stop}
|
||||
Found:=true;
|
||||
Break;
|
||||
end else
|
||||
inc(j);{We didn't find one, need to look further}
|
||||
end else
|
||||
if j=LenName then
|
||||
begin
|
||||
Found:=true;
|
||||
Break;
|
||||
end;
|
||||
{ This 'until' condition must be j>LenName, not j>=LenName.
|
||||
That's because when we 'need to look further' and
|
||||
j = LenName then loop must not terminate. }
|
||||
until (j>LenName);
|
||||
end else
|
||||
begin
|
||||
j:=LenName;{we can stop}
|
||||
Found:=true;
|
||||
end;
|
||||
end;
|
||||
else {not a wildcard character in pattern}
|
||||
Found:=(j<=LenName) and (pattern[i]=name[j]);
|
||||
end;
|
||||
inc(i);
|
||||
inc(j);
|
||||
end;
|
||||
DoFnMatch:=Found and (j>LenName);
|
||||
end;
|
||||
|
||||
Begin {start FNMatch}
|
||||
LenPat:=Length(Pattern);
|
||||
LenName:=Length(Name);
|
||||
FNMatch:=DoFNMatch(1,1);
|
||||
End;
|
||||
|
||||
end.
|
||||
|
Loading…
Reference in New Issue
Block a user