gforth
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [gforth] Parsing a directory


From: Bernd Paysan
Subject: Re: [gforth] Parsing a directory
Date: Wed, 13 Jun 2018 01:17:15 +0200

Am Dienstag, 12. Juni 2018, 23:58:49 CEST schrieb Dennis Ruffer:
> I’m working on a project that needs to recursively find every file in a
> directory structure and I found some code to get started with at:
> https://www.rosettacode.org/wiki/Walk_a_directory/Recursively#Forth
> 
> It is not doing what it is supposed to do and I hope to improve on it, but
> I’ve run into a stumbling block.
> 
> I can’t seem to be able to open directories to see if I’ve fallen into a
> symbolic loop.
> 
> For example, a symbolic link pointing to “../” will cause it to overflow
> real quickly.
> 
> The only solution I can think of is to look for duplicate names, but that
> has far too many false positives.
> Here’s my code, and I’m hoping someone can suggest an alternative:
> : $append ( from len to -- )   2DUP >R >R  COUNT + SWAP MOVE  R> R@ C@ + R>
> : C! ;
> : 
> : dots? ( name len -- ? )
> 
> \  2dup s" ." compare 0= if  2drop true exit  then
> \  s" .." compare 0= if  true exit  then
>   drop c@ [char] . = if  true exit  then
>   false ;
> 
> : (ls-r) ( dir len -- )
> 
>   pad c@ >r  dup >r  pad count >r >r  pad $append  s" /" pad $append
>   r> r> 2dup + 1- r> 2 + search nip nip if
>     ."  -> loop detected"  r> pad c!  exit  then  ( duplicate)
>   pad count open-dir if  drop  r> pad c!  exit  then  ( dirid)
>   begin
>     dup pad count + 256 rot read-dir throw
>   while
>     pad count + over dots? 0= if   \ ignore current and parent dirs
>       cr dup pad count rot + type
>       pad count + swap recurse
>     else drop then
>   repeat
>   drop  r> pad c!
>   close-dir throw
> ;
> 
> : ls-r ( dir len -- )  0 pad c!  (ls-r) ;
> 
> s" ." ls-r cr
> 
> DaR

Ah yes, there's a good reason why I added unix/filestat.fs, which has lstat, 
and allows you to analyze a file before you follow it.

Follow S_IFDIR files, don't follow symlinks.

-- 
Bernd Paysan
"If you want it done right, you have to do it yourself"
net2o id: kQusJzA;address@hidden(dQ*
http://bernd-paysan.de/

Attachment: signature.asc
Description: This is a digitally signed message part.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]