summaryrefslogtreecommitdiff
path: root/src/paths.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/paths.zig')
-rw-r--r--src/paths.zig39
1 files changed, 21 insertions, 18 deletions
diff --git a/src/paths.zig b/src/paths.zig
index b64ff04..dd3ace2 100644
--- a/src/paths.zig
+++ b/src/paths.zig
@@ -32,8 +32,13 @@ pub fn formatDosPath(allocator: Allocator, path: []const u8) ![]const u8 {
// Convert component to 8.3 format
const short_name = try convertTo83(allocator, component);
- defer allocator.free(short_name);
- try result.appendSlice(short_name);
+ defer allocator.free(short_name.name);
+ defer allocator.free(short_name.ext);
+ try result.appendSlice(short_name.name);
+ if (short_name.ext.len > 0) {
+ try result.append('.');
+ try result.appendSlice(short_name.ext);
+ }
}
// Ensure it starts with a drive letter if it's an absolute path
@@ -51,15 +56,15 @@ pub fn formatDosPath(allocator: Allocator, path: []const u8) ![]const u8 {
return allocator.dupe(u8, result.items);
}
-pub fn convertTo83(allocator: Allocator, filename: []const u8) ![]const u8 {
+pub fn convertTo83(allocator: Allocator, filename: []const u8) !struct { name: []const u8, ext: []const u8 } {
// Handle special directories
if (std.mem.eql(u8, filename, ".") or std.mem.eql(u8, filename, "..")) {
- return allocator.dupe(u8, filename);
+ return .{ .name = try allocator.dupe(u8, filename), .ext = try allocator.dupe(u8, "") };
}
// Handle drive letters (like C:)
if (filename.len == 2 and filename[1] == ':') {
- return allocator.dupe(u8, filename);
+ return .{ .name = try allocator.dupe(u8, filename), .ext = try allocator.dupe(u8, "") };
}
// Split filename and extension
@@ -97,29 +102,27 @@ pub fn convertTo83(allocator: Allocator, filename: []const u8) ![]const u8 {
}
}
- // Build 8.3 filename
- var result = ArrayList(u8).init(allocator);
- defer result.deinit();
+ var name_result = ArrayList(u8).init(allocator);
+ defer name_result.deinit();
+ var ext_result = ArrayList(u8).init(allocator);
+ defer ext_result.deinit();
+ // Build 8.3 filename
if (clean_name.items.len <= 8 and clean_ext.items.len <= 3) {
// Name fits in 8.3, use as-is
- try result.appendSlice(clean_name.items);
- if (clean_ext.items.len > 0) {
- try result.append('.');
- try result.appendSlice(clean_ext.items);
- }
+ try name_result.appendSlice(clean_name.items);
+ try ext_result.appendSlice(clean_ext.items);
} else {
// Need to abbreviate with ~1
const max_name_len = if (clean_name.items.len > 6) 6 else clean_name.items.len;
- try result.appendSlice(clean_name.items[0..max_name_len]);
- try result.appendSlice("~1");
+ try name_result.appendSlice(clean_name.items[0..max_name_len]);
+ try name_result.appendSlice("~1");
if (clean_ext.items.len > 0) {
- try result.append('.');
const max_ext_len = if (clean_ext.items.len > 3) 3 else clean_ext.items.len;
- try result.appendSlice(clean_ext.items[0..max_ext_len]);
+ try ext_result.appendSlice(clean_ext.items[0..max_ext_len]);
}
}
- return allocator.dupe(u8, result.items);
+ return .{ .name = try allocator.dupe(u8, name_result.items), .ext = try allocator.dupe(u8, ext_result.items) };
}