Parsing a directory

Dennis Ruffer <[email protected]>
Newsgroups gmane.comp.lang.forth.gforth
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.