|
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 |
[Prev in Thread] | Current Thread | [Next in Thread] |