| ... | @@ -1201,15 +1201,17 @@ fn testRelativeWindows(from: []const u8, to: []const u8, expected_output: []cons | ... | @@ -1201,15 +1201,17 @@ fn testRelativeWindows(from: []const u8, to: []const u8, expected_output: []cons |
| 1201 | /// - `"src.keep.me"` ⇒ `".me"` | 1201 | /// - `"src.keep.me"` ⇒ `".me"` |
| 1202 | /// - `"/src/keep.me"` ⇒ `".me"` | 1202 | /// - `"/src/keep.me"` ⇒ `".me"` |
| 1203 | /// - `"/src/keep.me/"` ⇒ `".me"` | 1203 | /// - `"/src/keep.me/"` ⇒ `".me"` |
| | 1204 | /// The returned slice is guaranteed to have its pointer within the start and end |
| | 1205 | /// pointer address range of `path`, even if it is length zero. |
| 1204 | pub fn extension(path: []const u8) []const u8 { | 1206 | pub fn extension(path: []const u8) []const u8 { |
| 1205 | const filename = basename(path); | 1207 | const filename = basename(path); |
| 1206 | return if (std.mem.lastIndexOf(u8, filename, ".")) |index| | 1208 | return if (std.mem.lastIndexOf(u8, filename, ".")) |index| |
| 1207 | if (index == 0 or index == filename.len - 1) | 1209 | if (index == 0 or index == filename.len - 1) |
| 1208 | "" | 1210 | path[path.len..] |
| 1209 | else | 1211 | else |
| 1210 | filename[index..] | 1212 | filename[index..] |
| 1211 | else | 1213 | else |
| 1212 | ""; | 1214 | path[path.len..]; |
| 1213 | } | 1215 | } |
| 1214 | | 1216 | |
| 1215 | fn testExtension(path: []const u8, expected: []const u8) void { | 1217 | fn testExtension(path: []const u8, expected: []const u8) void { |