Function relativeWindows [src]

Prototype

pub fn relativeWindows(allocator: Allocator, from: []const u8, to: []const u8) ![]u8

Parameters

allocator: Allocatorfrom: []const u8to: []const u8

Source

pub fn relativeWindows(allocator: Allocator, from: []const u8, to: []const u8) ![]u8 { const cwd = try process.getCwdAlloc(allocator); defer allocator.free(cwd); const resolved_from = try resolveWindows(allocator, &[_][]const u8{ cwd, from }); defer allocator.free(resolved_from); var clean_up_resolved_to = true; const resolved_to = try resolveWindows(allocator, &[_][]const u8{ cwd, to }); defer if (clean_up_resolved_to) allocator.free(resolved_to); const parsed_from = windowsParsePath(resolved_from); const parsed_to = windowsParsePath(resolved_to); const result_is_to = x: { if (parsed_from.kind != parsed_to.kind) { break :x true; } else switch (parsed_from.kind) { .NetworkShare => { break :x !networkShareServersEql(parsed_to.disk_designator, parsed_from.disk_designator); }, .Drive => { break :x ascii.toUpper(parsed_from.disk_designator[0]) != ascii.toUpper(parsed_to.disk_designator[0]); }, .None => { break :x false; }, } }; if (result_is_to) { clean_up_resolved_to = false; return resolved_to; } var from_it = mem.tokenizeAny(u8, resolved_from, "/\\"); var to_it = mem.tokenizeAny(u8, resolved_to, "/\\"); while (true) { const from_component = from_it.next() orelse return allocator.dupe(u8, to_it.rest()); const to_rest = to_it.rest(); if (to_it.next()) |to_component| { if (windows.eqlIgnoreCaseWtf8(from_component, to_component)) continue; } var up_index_end = "..".len; while (from_it.next()) |_| { up_index_end += "\\..".len; } const result = try allocator.alloc(u8, up_index_end + @intFromBool(to_rest.len > 0) + to_rest.len); errdefer allocator.free(result); result[0..2].* = "..".*; var result_index: usize = 2; while (result_index < up_index_end) { result[result_index..][0..3].* = "\\..".*; result_index += 3; } var rest_it = mem.tokenizeAny(u8, to_rest, "/\\"); while (rest_it.next()) |to_component| { result[result_index] = '\\'; result_index += 1; @memcpy(result[result_index..][0..to_component.len], to_component); result_index += to_component.len; } return allocator.realloc(result, result_index); } return [_]u8{}; }