ref: 983a758d3127bf5d861227e6a9c56900bf6e2da8
parent: ca845d8cb698f7822497046525c1ea477a944835
author: Ori Bernstein <ori@eigenstate.org>
date: Tue Oct 6 18:55:00 EDT 2015
Fix dirname/basename.
--- a/lib/std/dirname.myr
+++ b/lib/std/dirname.myr
@@ -4,6 +4,7 @@
use "sldup.use"
use "strfind.use"
use "option.use"
+use "types.use"
pkg std =
const dirname : (p : byte[:] -> byte[:])
@@ -10,28 +11,38 @@
const basename : (p : byte[:] -> byte[:])
;;
+extern const put : (fmt : byte[:], args : ... -> size)
+
const dirname = {p+ var end
+
+ for end = p.len; end > 1; end--
+ if p[end-1] != '/' castto(byte)
+ break
+ ;;
+ ;;
+ std.put("p: {}, end: {}, p[:{}]: {}\n", p, end, end, p[:end])+ p = p[:end]
match std.strrfind(p, "/")
- | `std.Some idx:
- -> std.sldup(p[:idx])
- | `std.None:
- -> std.sldup(".")+ | `std.None: -> std.sldup(".")+ | `std.Some 0: -> std.sldup("/")+ | `std.Some i: -> std.sldup(p[:i])
;;
}
const basename = {p-:again
- if p.len == 0
- -> std.sldup(".")+ var end
+
+ for end = p.len; end > 1; end--
+ if p[end-1] != '/' castto(byte)
+ break
+ ;;
;;
+ std.put("p: {}, end: {}, p[:{}]: {}\n", p, end, end, p[:end])+ p = p[:end]
match std.strrfind(p, "/")
- | `std.Some idx:
- if idx == p.len - 1
- goto again
- ;;
- -> std.sldup(p[idx+1:])
- | `std.None:
- -> std.sldup(p)
+ | `std.None: -> std.sldup(p[:end])
+ | `std.Some i: -> std.sldup(p[i+1:end])
;;
}
--- /dev/null
+++ b/lib/std/test/dirname.myr
@@ -1,0 +1,23 @@
+use std
+
+const main = {+ eq(std.dirname("foo/bar"), "foo")+ eq(std.dirname("/foo/bar"), "/foo")+ eq(std.dirname("/foo/bar/"), "/foo")+ eq(std.dirname("/bar/"), "/")+ eq(std.dirname("/"), "/")+ eq(std.dirname("///"), "/")+
+ eq(std.basename("foo/bar"), "bar")+ eq(std.basename("/foo/bar"), "bar")+ eq(std.basename("/foo/bar/"), "bar")+ eq(std.basename("/bar/"), "bar")+ eq(std.basename("/"), "")+ eq(std.basename("///"), "")+}
+
+const eq = {a, e+ if !std.sleq(e, a)
+ std.fatal("expected '{}', got '{}'\n", e, a)+ ;;
+}
--
⑨