REBOL [ Title: "my clean path" Date: 1999-11-19 File: %clean-path.r Author: "Stephane Bagnier" Organization: "D2SET french association" Web-Site: http://www.multimania.com/d2set/ Email: bagnier@physique.ens.fr Version: 1.0 Tabs: 4 Need: 2.2 Purpose: { Cleans-up '.' and '..' in path; returns the cleaned path. This script is smaller than the original, and works on an url ! } ] clean-path: func [ {Cleans-up '.' and '..' in path; returns the cleaned path} target [file! url!] /local target-copy detail clean-target][ target-copy: copy target if all [file? target-copy (first target-copy) <> #"/"] [ insert target-copy system/script/path] detail: parse/all (to-string target-copy) "/" until [error? try [remove find detail "."]] until [error? try [remove/part back find detail ".." 2]] clean-target: either file? target [to-file head detail ][ remove back tail first detail to-url (head remove next head detail)] if (last target) == #"/" [append clean-target #"/"] clean-target ] ; trial to-clean-list:[ %toto/./tata/./dummy/../titi %toto/./tata/dummy/dummy2/../../titi %toto/./tata/dummy/../titi/ %/toto/./tata/dummy/../titi file://toto/./tata/dummy/../titi http://www.rebol.com/toto/./ta%20ta/dummy/../titi file://toto/./tata/dummy/../titi/ http://www.rebol.com/toto/./tata/dummy/../titi/] foreach thing to-clean-list [ print reduce [thing "^(tab)->^(tab)" mold clean-path thing] ]