summaryrefslogtreecommitdiff
path: root/lib/std/dirname.myr
diff options
context:
space:
mode:
Diffstat (limited to 'lib/std/dirname.myr')
-rw-r--r--lib/std/dirname.myr37
1 files changed, 37 insertions, 0 deletions
diff --git a/lib/std/dirname.myr b/lib/std/dirname.myr
new file mode 100644
index 0000000..5e80771
--- /dev/null
+++ b/lib/std/dirname.myr
@@ -0,0 +1,37 @@
+use "alloc.use"
+use "slcp.use"
+use "die.use"
+use "sldup.use"
+use "strfind.use"
+use "option.use"
+
+pkg std =
+ const dirname : (p : byte[:] -> byte[:])
+ const basename : (p : byte[:] -> byte[:])
+;;
+
+const dirname = {p
+ match std.strrfind(p, "/")
+ | `std.Some idx:
+ -> std.sldup(p[:idx])
+ | `std.None:
+ -> std.sldup(".")
+ ;;
+}
+
+const basename = {p
+:again
+ if p.len == 0
+ -> std.sldup(".")
+ ;;
+
+ match std.strrfind(p, "/")
+ | `std.Some idx:
+ if idx == p.len - 1
+ goto again
+ ;;
+ -> std.sldup(p[idx+1:])
+ | `std.None:
+ -> std.sldup(p)
+ ;;
+}