On 12/3/2014 3:41 AM, Jonas Maebe wrote:

On 03 Dec 2014, at 06:05, waldo kitty wrote:

can you help me understand the differences in the output of the below program?

given these three filenames: t.txt t1.txt t11.txt

with mask  t?.txt  why does MatchesMaskList not show t.txt and t11.txt like
plain findfirst?

"?" means "a single arbitrary character".  findfirst with "t?.txt" should not
match t.txt nor t11.txt either.

yes, i wrote t11.txt when i should have written t1.txt... my bad...

however on
  OS/2 native
  OS/2 with 4OS2 command interpreter replacement
  OS/2 DOS native
  OS/2 DOS with 4DOS command interpreter replacement
  Vista (32bit)
t?.txt returns both t.txt and t1.txt...


C:\freepascal\projects\misc>dir t?.txt

 Volume in drive C is SQ004512V04
 Volume Serial Number is DC02-9142

 Directory of C:\freepascal\projects\misc

12/02/2014  11:31 PM                 2 t.txt
12/02/2014  11:31 PM                 2 t1.txt
               2 File(s)              4 bytes
               0 Dir(s)  51,111,350,272 bytes free



C:\freepascal\projects\misc>filemask t?.txt

looking for files that match "t?.txt"

*FindFirst only - multiple masks capable*

  ff1(t?.txt);
    t.txt
    t1.txt


*FindFirst w/ MatchesMaskList*

  ff2(t?.txt);
    t1.txt


*FindFirst w/ RegExpr - multiple masks capable*

  ff3(t?.txt);
    t.txt
    t1.txt
    t11.txt



new filemask demo program follows...


===== snip filemask.lpr =====
Program Filemask;

Uses
  SysUtils, StrUtils, Classes, Masks, RegExpr;

var
  dirSR : TSearchRec;
  flist : TStringList;
  fmask : String;
  lcnt  : Integer;

procedure ff(tstr : String);
begin
  if FindFirst(tstr,faAnyFile,dirSR) = 0 then
    begin
      repeat
        flist.Add(dirSR.Name);
      until FindNext(dirSR) <> 0;
      {$IFDEF FPC}
      FindClose(dirSR);
      {$ENDIF}
    end;
end;

procedure ff1(tstr : String);
var
  tcnt  : Integer = 0;
  fmcnt : Integer = 0;
begin
  fmcnt := WordCount(tstr,[';']);
  if fmcnt = 0 then
    ff(tstr)
  else
    for tcnt := 1 to fmcnt do
      begin
        ff(ExtractWord(tcnt,tstr,[';']));
      end;
end;

procedure ff2(tstr : String);
begin
  if FindFirst('*',faAnyFile,dirSR) = 0 then
    begin
      repeat
        if MatchesMaskList(dirSR.Name,tstr) then
          flist.Add(dirSR.Name);
      until FindNext(dirSR) <> 0;
      {$IFDEF FPC}
      FindClose(dirSR);
      {$ENDIF}
    end;
end;

procedure ffregex(tstr : String);
var
  RegexObj: TRegExpr;
begin
  RegexObj := TRegExpr.Create;
  RegexObj.Expression := tstr;
  if FindFirst('*',faAnyFile,dirSR) = 0 then
    begin
      repeat
        if RegexObj.Exec(dirSR.Name) then
          flist.Add(dirSR.Name);
      until FindNext(dirSR) <> 0;
      {$IFDEF FPC}
      FindClose(dirSR);
      {$ENDIF}
    end;
  RegexObj.Free;
end;

procedure ff3(tstr : String);
var
  tcnt  : Integer = 0;
  fmcnt : Integer = 0;
begin
  fmcnt := WordCount(tstr,[';']);
  if fmcnt = 0 then
    ffregex(tstr)
  else
    for tcnt := 1 to fmcnt do
      begin
        ffregex(ExtractWord(tcnt,tstr,[';']));
      end;
end;


begin
  if ParamStr(1) = '' then
    WriteLn('please specify a file mask - eg: *.foo')
  else
    begin
      fmask := ParamStr(1);
      WriteLn;
      WriteLn('looking for files that match "'+fmask+'"');
      WriteLn;
      flist := TStringList.Create;
      flist.Sorted := True;
      flist.Duplicates := dupIgnore;
      flist.CaseSensitive := False;
      try
        WriteLn('*FindFirst only - multiple masks capable*');
        WriteLn;
        WriteLn('  ff1('+fmask+');');
        ff1(fmask);
        for lcnt := 1 to flist.Count do
          WriteLn('    '+flist.Strings[lcnt-1]);
        WriteLn;
        WriteLn;

        flist.Clear;
        WriteLn('*FindFirst w/ MatchesMaskList*');
        WriteLn;
        WriteLn('  ff2('+fmask+');');
        ff2(fmask);
        for lcnt := 1 to flist.Count do
          WriteLn('    '+flist.Strings[lcnt-1]);
        WriteLn;
        WriteLn;

        flist.Clear;
        WriteLn('*FindFirst w/ RegExpr - multiple masks capable*');
        WriteLn;
        WriteLn('  ff3('+fmask+');');
        ff3(fmask);
        for lcnt := 1 to flist.Count do
          WriteLn('    '+flist.Strings[lcnt-1]);
        WriteLn;
        WriteLn;
      finally
        if Assigned(flist) then
          FreeAndNil(flist);
      end;
    end;
end.
===== snip =====

--
 NOTE: No off-list assistance is given without prior approval.
       Please *keep mailing list traffic on the list* unless
       private contact is specifically requested and granted.
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to