diff options
Diffstat (limited to 'src/paths.zig')
-rw-r--r-- | src/paths.zig | 39 |
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) }; } |