diff options
Diffstat (limited to 'builtins')
| -rw-r--r-- | builtins/path.c | 19 | ||||
| -rw-r--r-- | builtins/path.h | 3 |
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; |
