From d45719bba6bafb081a482b31b6ba24b010f8ab3c Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 9 Feb 2000 23:09:13 +0000 Subject: [PATCH] * rewrote glob to be much simpler and cleaner, the old code did strange complex things with pointers which was unnecessary --- rtl/linux/linux.pp | 111 ++++++++++++++++++++------------------------- 1 file changed, 49 insertions(+), 62 deletions(-) diff --git a/rtl/linux/linux.pp b/rtl/linux/linux.pp index 7c4884b192..d5ad30e7d2 100644 --- a/rtl/linux/linux.pp +++ b/rtl/linux/linux.pp @@ -3364,11 +3364,11 @@ Procedure Globfree(var p : pglob); var temp : pglob; begin - while p<>nil do + while assigned(p) do begin temp:=p^.next; - if p^.name<>nil then - freemem(p^.name,strlen(p^.name)+1); + if assigned(p^.name) then + freemem(p^.name); dispose(p); p:=temp; end; @@ -3383,16 +3383,17 @@ Function Glob(Const path:pathstr):pglob; linuxerror is set accordingly. } var - temp : string[255]; - thedir : pdir; - buffer : pdirent; - root,run : pglob; + temp, + temp2 : string[255]; + thedir : pdir; + buffer : pdirent; + root, + current : pglob; begin { Get directory } - if dirname(path)='' then - temp:='.' - else - temp:=dirname(path); + temp:=dirname(path); + if temp='' then + temp:='.'; temp:=temp+#0; thedir:=opendir(@temp[1]); if thedir=nil then @@ -3401,7 +3402,7 @@ begin linuxerror:=errno; exit; end; - temp:=basename(path,'');{ get the pattern } + temp:=basename(path,''); { get the pattern } if thedir^.fd<0 then begin linuxerror:=errno; @@ -3409,62 +3410,44 @@ begin exit; end; {get the entries} - new(root); - root^.next:=nil; - root^.name:=nil; - run:=root; + root:=nil; + current:=nil; repeat buffer:=Sys_readdir(thedir); - if buffer<>nil then + if buffer=nil then + break; + temp2:=strpas(@(buffer^.name[0])); + if fnmatch(temp,temp2) then begin - if fnmatch(temp,strpas(@(buffer^.name[0]))) then + if root=nil then begin - { get memory for pglob } - new(run^.next); - if run^.next=nil then - begin - linuxerror:=Sys_ENOMEM; - globfree(root); - glob:=nil; - exit; - end - else - begin - run:=run^.next; - run^.next:=nil; - end; - { Get memory for name } - getmem(run^.name,strlen(@(buffer^.name[0]))+1); - if run^.name=nil then - begin - linuxerror:=Sys_ENOMEM; - globfree(root); - glob:=nil; - exit; - end; - move(buffer^.name[0],run^.name^,strlen(@(buffer^.name[0]))+1); - end;{ if fnmatch } - end { buffer <> nil } - else - begin - run:=root; - if root^.next<>nil then - root:=root^.next;{ put root on first entry} - if run<>nil then + new(root); + current:=root; + end + else begin - run^.next:=nil; - globfree(run); + new(current^.next); + current:=current^.next; end; + if current=nil then + begin + linuxerror:=Sys_ENOMEM; + globfree(root); + break; + end; + current^.next:=nil; + getmem(current^.name,length(temp2)+1); + if current^.name=nil then + begin + linuxerror:=Sys_ENOMEM; + globfree(root); + break; + end; + move(buffer^.name[0],current^.name^,length(temp2)+1); end; - until buffer=nil; - if root^.name=nil then - begin - dispose(root); - linuxerror:=0; - glob:=nil; - end - else - glob:=root; + until false; + closedir(thedir); + glob:=root; end; @@ -3848,7 +3831,11 @@ End. { $Log$ - Revision 1.61 2000-02-09 16:59:31 peter + Revision 1.62 2000-02-09 23:09:13 peter + * rewrote glob to be much simpler and cleaner, the old code did + strange complex things with pointers which was unnecessary + + Revision 1.61 2000/02/09 16:59:31 peter * truncated log Revision 1.60 2000/02/08 12:05:58 peter