aboutsummaryrefslogtreecommitdiff
path: root/builtins
diff options
context:
space:
mode:
Diffstat (limited to 'builtins')
-rw-r--r--builtins/path.c19
-rw-r--r--builtins/path.h3
2 files changed, 22 insertions, 0 deletions
diff --git a/builtins/path.c b/builtins/path.c
index fa15519a..7c9df396 100644
--- a/builtins/path.c
+++ b/builtins/path.c
@@ -323,6 +323,25 @@ public Text_t Path$write_unique(Path_t path, Text_t text)
return Text$format("%s", buf);
}
+public Path_t Path$parent(Path_t path)
+{
+ return Text$replace(path, Pattern("{..}/{!/}{end}"), Text("@1"), Text("@"), false);
+}
+
+public Text_t Path$base_name(Path_t path)
+{
+ return Text$replace(path, Pattern("{..}/{!/}{end}"), Text("@2"), Text("@"), false);
+}
+
+public Text_t Path$extension(Path_t path, bool full)
+{
+ Text_t base = Path$base_name(path);
+ if (Text$has(base, Pattern("{!.}.{!.}")))
+ return Text$replace(base, full ? Pattern("{!.}.{..}{end}") : Pattern("{..}.{!.}{end}"), Text("@2"), Text("@"), false);
+ else
+ return Text("");
+}
+
public const TypeInfo Path$info = {
.size=sizeof(Path_t),
.align=__alignof__(Path_t),
diff --git a/builtins/path.h b/builtins/path.h
index 0826f00d..f3d51f81 100644
--- a/builtins/path.h
+++ b/builtins/path.h
@@ -33,6 +33,9 @@ Array_t Path$files(Path_t path, bool include_hidden);
Array_t Path$subdirectories(Path_t path, bool include_hidden);
Path_t Path$unique_directory(Path_t path);
Text_t Path$write_unique(Path_t path, Text_t text);
+Path_t Path$parent(Path_t path);
+Text_t Path$base_name(Path_t path);
+Text_t Path$extension(Path_t path, bool full);
extern const TypeInfo Path$info;