Sat, 12 Sep 2009 21:27:57 +0300
(don't know)
module("path", package.seeall) require("tuple") require("lfs") require("err") require("config") local sep=config.dirsep function join(p, f) return p..sep..f end function dirbasename(p) local d, b = string.match(p, "(.*)"..sep.."+([^"..sep.."]+)"..sep.."*$") if not b then return string.match(p, "([^"..sep.."]*") else return d, b end end function dirname(p) return tuple.fst(dirbasename(p)) end function basename(p) return tuple.snd(dirbasename(p)) end -- would rather do this as an iterator, but can't -- coroutine.yield from gsub handler function split(p) local t={} local head="" local s, p2 = string.match(p, "^("..sep.."+)(.*)$") if s then table.insert(t, "/.") -- root p=p2 end string.gsub(p, "([^"..sep.."]+)"..sep.."+", function(d) table.insert(t, d); end) return t end function parts(p) local s={i=1, t=split(p)} local function g(s) local v=s.t[s.i] s.i=s.i+1 return v end return g, s end function makepath(p) local head="" for d in parts(p) do head=head..d local a=lfs.attributes(head) if not a then local success, e = lfs.mkdir(head) if not success then err.file(head, e) end elseif a.mode~="directory" then err.file(head, "not a directory") end head=head..sep end end --[[ print(dirbasename("/foo/bar/baz")) for k in parts("//foo/bar/baz/quk") do print(k) end makepath("foo/bar/baz/quk") --]]