diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2019-11-21 18:51:12 -0500 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2019-11-21 18:51:12 -0500 |
| commit | bf1cbebea1fd846c982e568ef4f013dfaf232e3e (patch) | |
| tree | e7e95cf078d70e2f88071ef55d0f4197faf7bcd6 /lib/std/os | |
| parent | cd37c1a377483154e82dce47b10ab0c54264f4e9 (diff) | |
| download | zig-bf1cbebea1fd846c982e568ef4f013dfaf232e3e.tar.gz zig-bf1cbebea1fd846c982e568ef4f013dfaf232e3e.zip | |
improve std.fs.selfExePath and related functions on Windows
Diffstat (limited to 'lib/std/os')
| -rw-r--r-- | lib/std/os/windows.zig | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/lib/std/os/windows.zig b/lib/std/os/windows.zig index 06da223d5c..a04e351799 100644 --- a/lib/std/os/windows.zig +++ b/lib/std/os/windows.zig @@ -927,6 +927,24 @@ pub fn sliceToPrefixedFileW(s: []const u8) ![PATH_MAX_WIDE + 1]u16 { return sliceToPrefixedSuffixedFileW(s, [_]u16{0}); } +/// Assumes an absolute path. +pub fn wToPrefixedFileW(s: []const u16) ![PATH_MAX_WIDE + 1]u16 { + // TODO https://github.com/ziglang/zig/issues/2765 + var result: [PATH_MAX_WIDE + 1]u16 = undefined; + + const start_index = if (mem.startsWith(u16, s, [_]u16{'\\', '?'})) 0 else blk: { + const prefix = [_]u16{ '\\', '?', '?', '\\' }; + mem.copy(u16, result[0..], prefix); + break :blk prefix.len; + }; + const end_index = start_index + s.len; + if (end_index + 1 > result.len) return error.NameTooLong; + mem.copy(u16, result[start_index..], s); + result[end_index] = 0; + return result; + +} + pub fn sliceToPrefixedSuffixedFileW(s: []const u8, comptime suffix: []const u16) ![PATH_MAX_WIDE + suffix.len]u16 { // TODO https://github.com/ziglang/zig/issues/2765 var result: [PATH_MAX_WIDE + suffix.len]u16 = undefined; @@ -948,7 +966,6 @@ pub fn sliceToPrefixedSuffixedFileW(s: []const u8, comptime suffix: []const u16) break :blk prefix.len; }; const end_index = start_index + try std.unicode.utf8ToUtf16Le(result[start_index..], s); - assert(end_index <= result.len); if (end_index + suffix.len > result.len) return error.NameTooLong; mem.copy(u16, result[end_index..], suffix); return result; |
