Commit 7721c0cbef

r00ster91 <r00ster91@proton.me>
2022-10-23 18:58:24
std.fs.path: add stem()
1 parent a0a5095
Changed files (1)
lib
std
lib/std/fs/path.zig
@@ -1319,3 +1319,40 @@ test "extension" {
     try testExtension("/foo/bar/bam/a.b.c", ".c");
     try testExtension("/foo/bar/bam/a.b.c/", ".c");
 }
+
+/// Returns the last component of this path without its extension (if any):
+/// - "hello/world/lib.tar.gz" โ‡’ "lib.tar"
+/// - "hello/world/lib.tar"    โ‡’ "lib"
+/// - "hello/world/lib"        โ‡’ "lib"
+pub fn stem(path: []const u8) []const u8 {
+    const filename = basename(path);
+    const index = mem.lastIndexOfScalar(u8, filename, '.') orelse return filename[0..];
+    if (index == 0) return path;
+    return filename[0..index];
+}
+
+fn testStem(path: []const u8, expected: []const u8) !void {
+    try testing.expectEqualStrings(expected, stem(path));
+}
+
+test "stem" {
+    try testStem("hello/world/lib.tar.gz", "lib.tar");
+    try testStem("hello/world/lib.tar", "lib");
+    try testStem("hello/world/lib", "lib");
+    try testStem("hello/lib/", "lib");
+    try testStem("hello...", "hello..");
+    try testStem("hello.", "hello");
+    try testStem("/hello.", "hello");
+    try testStem(".gitignore", ".gitignore");
+    try testStem(".image.png", ".image");
+    try testStem("file.ext", "file");
+    try testStem("file.ext.", "file.ext");
+    try testStem("a.b.c", "a.b");
+    try testStem("a.b.c/", "a.b");
+    try testStem(".a", ".a");
+    try testStem("///", "");
+    try testStem("..", ".");
+    try testStem(".", ".");
+    try testStem(" ", " ");
+    try testStem("", "");
+}