Răsfoiți Sursa

* don't allocate unixfinddata if we search only one file, patch from neli

git-svn-id: trunk@4855 -
peter 19 ani în urmă
părinte
comite
d9bcee0cbe
1 a modificat fișierele cu 18 adăugiri și 17 ștergeri
  1. 18 17
      rtl/unix/sysutils.pp

+ 18 - 17
rtl/unix/sysutils.pp

@@ -388,7 +388,6 @@ End;
 
 Type
   TUnixFindData = Record
-    NamePos    : LongInt;     {to track which search this is}
     DirPtr     : Pointer;     {directory pointer for reading directory}
     SearchSpec : String;
     SearchType : Byte;        {0=normal, 1=open will close, 2=only 1 file}
@@ -424,9 +423,9 @@ begin
   if not fpstat(s,st)>=0 then
    exit;
   WinAttr:=LinuxToWinAttr(PChar(s),st);
-  If ((WinAttr and Not(PUnixFindData(f.FindHandle)^.searchattr))=0) Then
+  If (f.FindHandle = nil) or ((WinAttr and Not(PUnixFindData(f.FindHandle)^.searchattr))=0) Then
    Begin
-     f.Name:=Copy(s,PUnixFindData(f.FindHandle)^.NamePos+1,Length(s));
+     f.Name:=ExtractFileName(s);
      f.Attr:=WinAttr;
      f.Size:=st.st_Size;
      f.Mode:=st.st_mode;
@@ -461,7 +460,8 @@ Begin
       If UnixFindData^.NamePos = 0 Then
         DirName:='./'
       Else
-        DirName:=Copy(UnixFindData^.SearchSpec,1,UnixFindData^.NamePos);
+        DirName:=
+	Copy(UnixFindData^.SearchSpec,1,UnixFindData^.NamePos);
       UnixFindData^.DirPtr := fpopendir(Pchar(DirName));
     end;
   SName:=Copy(UnixFindData^.SearchSpec,UnixFindData^.NamePos+1,Length(UnixFindData^.SearchSpec));
@@ -503,26 +503,27 @@ Begin
   fillchar(Rslt,sizeof(Rslt),0);
   if Path='' then
     exit;
-  { Allocate UnixFindData }
-  New(UnixFindData);
-  FillChar(UnixFindData^,sizeof(UnixFindData^),0);
-  Rslt.FindHandle:=UnixFindData;
-  {Create Info}
-  UnixFindData^.SearchSpec := Path;
-  {We always also search for readonly and archive, regardless of Attr:}
-  UnixFindData^.SearchAttr := Attr or faarchive or fareadonly;
-  UnixFindData^.NamePos := Length(UnixFindData^.SearchSpec);
-  while (UnixFindData^.NamePos>0) and (UnixFindData^.SearchSpec[UnixFindData^.NamePos]<>'/') do
-   dec(UnixFindData^.NamePos);
   {Wildcards?}
   if (Pos('?',Path)=0)  and (Pos('*',Path)=0) then
    begin
      if FindGetFileInfo(Path,Rslt) then
        Result:=0;
-     UnixFindData^.SearchType:=1;
    end
   else
-    Result:=FindNext(Rslt);
+   begin
+     { Allocate UnixFindData }
+     New(UnixFindData);
+     FillChar(UnixFindData^,sizeof(UnixFindData^),0);
+     Rslt.FindHandle:=UnixFindData;
+     {Create Info}
+     UnixFindData^.SearchSpec := Path;
+     {We always also search for readonly and archive, regardless of Attr:}
+     UnixFindData^.SearchAttr := Attr or faarchive or fareadonly;
+     UnixFindData^.NamePos := Length(UnixFindData^.SearchSpec);
+     while (UnixFindData^.NamePos>0) and (UnixFindData^.SearchSpec[UnixFindData^.NamePos]<>'/') do
+       dec(UnixFindData^.NamePos);
+     Result:=FindNext(Rslt);
+   end;
 End;