gforth
[Top][All Lists]
Advanced

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

[gforth] Parsing a directory


From: Dennis Ruffer
Subject: [gforth] Parsing a directory
Date: Tue, 12 Jun 2018 14:58:49 -0700

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

 


reply via email to

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