|
1 |
|
2 module("path", package.seeall) |
|
3 |
|
4 require("tuple") |
|
5 require("lfs") |
|
6 require("err") |
|
7 require("config") |
|
8 |
|
9 local sep=config.dirsep |
|
10 |
|
11 function join(p, f) |
|
12 return p..sep..f |
|
13 end |
|
14 |
|
15 function dirbasename(p) |
|
16 local d, b = string.match(p, |
|
17 "(.*)"..sep.."+([^"..sep.."]+)"..sep.."*$") |
|
18 if not b then |
|
19 return string.match(p, "([^"..sep.."]*") |
|
20 else |
|
21 return d, b |
|
22 end |
|
23 end |
|
24 |
|
25 function dirname(p) |
|
26 return tuple.fst(dirbasename(p)) |
|
27 end |
|
28 |
|
29 function basename(p) |
|
30 return tuple.snd(dirbasename(p)) |
|
31 end |
|
32 |
|
33 -- would rather do this as an iterator, but can't |
|
34 -- coroutine.yield from gsub handler |
|
35 function split(p) |
|
36 local t={} |
|
37 local head="" |
|
38 local s, p2 = string.match(p, "^("..sep.."+)(.*)$") |
|
39 if s then |
|
40 table.insert(t, "/.") -- root |
|
41 p=p2 |
|
42 end |
|
43 string.gsub(p, "([^"..sep.."]+)"..sep.."+", |
|
44 function(d) table.insert(t, d); end) |
|
45 return t |
|
46 end |
|
47 |
|
48 function parts(p) |
|
49 local s={i=1, t=split(p)} |
|
50 local function g(s) |
|
51 local v=s.t[s.i] |
|
52 s.i=s.i+1 |
|
53 return v |
|
54 end |
|
55 return g, s |
|
56 end |
|
57 |
|
58 function makepath(p) |
|
59 local head="" |
|
60 for d in parts(p) do |
|
61 head=head..d |
|
62 local a=lfs.attributes(head) |
|
63 if not a then |
|
64 local success, e = lfs.mkdir(head) |
|
65 if not success then |
|
66 err.file(head, e) |
|
67 end |
|
68 elseif a.mode~="directory" then |
|
69 err.file(head, "not a directory") |
|
70 end |
|
71 head=head..sep |
|
72 end |
|
73 end |
|
74 |
|
75 --[[ |
|
76 print(dirbasename("/foo/bar/baz")) |
|
77 |
|
78 for k in parts("//foo/bar/baz/quk") do |
|
79 print(k) |
|
80 end |
|
81 |
|
82 makepath("foo/bar/baz/quk") |
|
83 --]] |