Merge pull request #1696 from mitchellh/update-zig

Update to Latest Zig
This commit is contained in:
Mitchell Hashimoto
2024-04-18 16:40:37 -07:00
committed by GitHub
30 changed files with 167 additions and 151 deletions

View File

@ -25,7 +25,7 @@ const Command = @import("src/Command.zig");
// but we liberally update it. In the future, we'll be more careful about
// using released versions so that package managers can integrate better.
comptime {
const required_zig = "0.12.0-dev.3405+31791ae15";
const required_zig = "0.12.0-dev.3676+21a6a1b0f";
const current_zig = builtin.zig_version;
const min_zig = std.SemanticVersion.parse(required_zig) catch unreachable;
if (current_zig.order(min_zig) == .lt) {
@ -221,7 +221,7 @@ pub fn build(b: *std.Build) !void {
// We only build an exe if we have a runtime set.
const exe_: ?*std.Build.Step.Compile = if (config.app_runtime != .none) b.addExecutable(.{
.name = "ghostty",
.root_source_file = .{ .path = "src/main.zig" },
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
}) else null;
@ -265,7 +265,7 @@ pub fn build(b: *std.Build) !void {
if (target.result.os.tag == .windows) {
exe.subsystem = .Windows;
exe.addWin32ResourceFile(.{
.file = .{ .path = "dist/windows/ghostty.rc" },
.file = b.path("dist/windows/ghostty.rc"),
});
// Building with LTO on Windows is broken.
@ -309,7 +309,7 @@ pub fn build(b: *std.Build) !void {
// Shell-integration
{
const install = b.addInstallDirectory(.{
.source_dir = .{ .path = "src/shell-integration" },
.source_dir = b.path("src/shell-integration"),
.install_dir = .{ .custom = "share" },
.install_subdir = b.pathJoin(&.{ "ghostty", "shell-integration" }),
.exclude_extensions = &.{".md"},
@ -483,7 +483,7 @@ pub fn build(b: *std.Build) !void {
{
const lib = b.addSharedLibrary(.{
.name = "ghostty",
.root_source_file = .{ .path = "src/main_c.zig" },
.root_source_file = b.path("src/main_c.zig"),
.optimize = optimize,
.target = target,
});
@ -500,7 +500,7 @@ pub fn build(b: *std.Build) !void {
{
const lib = b.addStaticLibrary(.{
.name = "ghostty",
.root_source_file = .{ .path = "src/main_c.zig" },
.root_source_file = b.path("src/main_c.zig"),
.optimize = optimize,
.target = target,
});
@ -515,7 +515,7 @@ pub fn build(b: *std.Build) !void {
// Copy our ghostty.h to include.
const header_install = b.addInstallHeaderFile(
"include/ghostty.h",
b.path("include/ghostty.h"),
"ghostty.h",
);
b.getInstallStep().dependOn(&header_install.step);
@ -570,7 +570,7 @@ pub fn build(b: *std.Build) !void {
// Copy our ghostty.h to include. The header file is shared by
// all embedded targets.
const header_install = b.addInstallHeaderFile(
"include/ghostty.h",
b.path("include/ghostty.h"),
"ghostty.h",
);
b.getInstallStep().dependOn(&header_install.step);
@ -583,15 +583,15 @@ pub fn build(b: *std.Build) !void {
.libraries = &.{
.{
.library = macos_lib_path,
.headers = .{ .path = "include" },
.headers = b.path("include"),
},
.{
.library = ios_lib_path,
.headers = .{ .path = "include" },
.headers = b.path("include"),
},
.{
.library = ios_sim_lib_path,
.headers = .{ .path = "include" },
.headers = b.path("include"),
},
},
});
@ -645,7 +645,7 @@ pub fn build(b: *std.Build) !void {
const wasm = b.addSharedLibrary(.{
.name = "ghostty-wasm",
.root_source_file = .{ .path = "src/main_wasm.zig" },
.root_source_file = b.path("src/main_wasm.zig"),
.target = b.resolveTargetQuery(wasm_crosstarget),
.optimize = optimize,
});
@ -675,7 +675,7 @@ pub fn build(b: *std.Build) !void {
const test_step = b.step("test-wasm", "Run all tests for wasm");
const main_test = b.addTest(.{
.name = "wasm-test",
.root_source_file = .{ .path = "src/main_wasm.zig" },
.root_source_file = b.path("src/main_wasm.zig"),
.target = b.resolveTargetQuery(wasm_crosstarget),
});
@ -714,7 +714,7 @@ pub fn build(b: *std.Build) !void {
const main_test = b.addTest(.{
.name = "ghostty-test",
.root_source_file = .{ .path = "src/main.zig" },
.root_source_file = b.path("src/main.zig"),
.target = test_target,
.filter = test_filter,
});
@ -796,7 +796,7 @@ fn createMacOSLib(
const static_lib_aarch64 = lib: {
const lib = b.addStaticLibrary(.{
.name = "ghostty",
.root_source_file = .{ .path = "src/main_c.zig" },
.root_source_file = b.path("src/main_c.zig"),
.target = genericMacOSTarget(b),
.optimize = optimize,
});
@ -820,7 +820,7 @@ fn createMacOSLib(
const static_lib_x86_64 = lib: {
const lib = b.addStaticLibrary(.{
.name = "ghostty",
.root_source_file = .{ .path = "src/main_c.zig" },
.root_source_file = b.path("src/main_c.zig"),
.target = b.resolveTargetQuery(.{
.cpu_arch = .x86_64,
.os_tag = .macos,
@ -875,7 +875,7 @@ fn createIOSLib(
const lib = b.addStaticLibrary(.{
.name = "ghostty",
.root_source_file = .{ .path = "src/main_c.zig" },
.root_source_file = b.path("src/main_c.zig"),
.optimize = optimize,
.target = b.resolveTargetQuery(.{
.cpu_arch = .aarch64,
@ -1027,12 +1027,12 @@ fn addDeps(
// C files
step.linkLibC();
step.addIncludePath(.{ .path = "src/stb" });
step.addIncludePath(b.path("src/stb"));
step.addCSourceFiles(.{ .files = &.{"src/stb/stb.c"} });
// C++ files
step.linkLibCpp();
step.addIncludePath(.{ .path = "src" });
step.addIncludePath(b.path("src"));
step.addCSourceFiles(.{ .files = &.{
"src/simd/codepoint_width.cpp",
"src/simd/index_of.cpp",
@ -1160,9 +1160,9 @@ fn addDeps(
if (!lib) {
// We always statically compile glad
step.addIncludePath(.{ .path = "vendor/glad/include/" });
step.addIncludePath(b.path("vendor/glad/include/"));
step.addCSourceFile(.{
.file = .{ .path = "vendor/glad/src/gl.c" },
.file = b.path("vendor/glad/src/gl.c"),
.flags = &.{},
});
@ -1246,7 +1246,7 @@ fn addHelp(
const help_output = HelpState.generated orelse strings: {
const help_exe = b.addExecutable(.{
.name = "helpgen",
.root_source_file = .{ .path = "src/helpgen.zig" },
.root_source_file = b.path("src/helpgen.zig"),
.target = b.host,
});
if (step_ == null) b.installArtifact(help_exe);
@ -1286,7 +1286,7 @@ fn addUnicodeTables(
const output = State.generated orelse strings: {
const exe = b.addExecutable(.{
.name = "unigen",
.root_source_file = .{ .path = "src/unicode/props.zig" },
.root_source_file = b.path("src/unicode/props.zig"),
.target = b.host,
});
exe.linkLibC();
@ -1326,7 +1326,7 @@ fn buildDocumentation(
inline for (manpages) |manpage| {
const generate_markdown = b.addExecutable(.{
.name = "mdgen_" ++ manpage.name ++ "_" ++ manpage.section,
.root_source_file = .{ .path = "src/main.zig" },
.root_source_file = b.path("src/main.zig"),
.target = b.host,
});
try addHelp(b, generate_markdown, config);
@ -1412,7 +1412,7 @@ fn benchSteps(
const bin_name = try std.fmt.allocPrint(b.allocator, "bench-{s}", .{name});
const c_exe = b.addExecutable(.{
.name = bin_name,
.root_source_file = .{ .path = "src/main.zig" },
.root_source_file = b.path("src/main.zig"),
.target = target,
// We always want our benchmarks to be in release mode.
@ -1468,7 +1468,7 @@ fn conformanceSteps(
// Executable builder.
const c_exe = b.addExecutable(.{
.name = name,
.root_source_file = .{ .path = path },
.root_source_file = b.path(path),
.target = target,
.optimize = optimize,
});

View File

@ -5,17 +5,17 @@
.dependencies = .{
// Zig libs
.libxev = .{
.url = "https://github.com/mitchellh/libxev/archive/0f73adfda1cff9c740160717b5431ebada6b8755.tar.gz",
.hash = "12203dcbe098ee49ea242432cd198b1ca557626988f056bea86630dcfe8660244407",
.url = "https://github.com/mitchellh/libxev/archive/a284cf851fe2f88f8947c01160c39ff216dacea1.tar.gz",
.hash = "12205b8ea5495b812b9a8943535a7af8da556644d2c1599dc01e1a5ea7aaf59bb2c7",
},
.mach_glfw = .{
.url = "https://github.com/der-teufel-programming/mach-glfw/archive/250affff8c52d1eaa0fab2ef1118f691bf1225ec.tar.gz",
.hash = "122029f65edf3965d86f7d0741fe141bcc1d68b1f013fa7280bbfda4e87c6affc15f",
.url = "https://github.com/mitchellh/mach-glfw/archive/20c773d86df269722d8926f98bc8af26ebd90999.tar.gz",
.hash = "1220d6df7eb57501616e86ed812854164ff02d2f4a0eaa06b8301f32950d8d3e89df",
.lazy = true,
},
.zig_objc = .{
.url = "https://github.com/mitchellh/zig-objc/archive/0a89cc09da6804ae448241a673ce85a282216074.tar.gz",
.hash = "1220acfc53954f699415c6942422571670544a5236866fa7b6e069e2b1b2ba86ae9c",
.url = "https://github.com/mitchellh/zig-objc/archive/9e2174ed9b5a2c11bf1779cf6c819260c8091888.tar.gz",
.hash = "1220014cd3774aa0b18320e6527ed7b3270412c70958ab16a3c55070ffb7f2042f87",
},
.zig_js = .{
.url = "https://github.com/mitchellh/zig-js/archive/d4edb682733aef8dc3933683272bdf7c8b9fe658.tar.gz",

12
flake.lock generated
View File

@ -147,11 +147,11 @@
},
"nixpkgs-zig-0-12": {
"locked": {
"lastModified": 1712247214,
"narHash": "sha256-7PTw86NnE2nCQPf+PPI/kOKwmlbbTqUthYSz/nDnAoc=",
"lastModified": 1713479535,
"narHash": "sha256-PnquFNhs0vtXwHkKk44dmnrNTMMCQelgi8pS/DGh6Ks=",
"owner": "vancluever",
"repo": "nixpkgs",
"rev": "6726262c930716f601345b2c9d0c42ba069991b8",
"rev": "153458bf17bfeedd3ab8b9a3250ba1168135e8ae",
"type": "github"
},
"original": {
@ -194,11 +194,11 @@
]
},
"locked": {
"lastModified": 1711109355,
"narHash": "sha256-VZPO5mq2di5yjHkkY9ZGEIZaX7EtdusSkxICBAtHAec=",
"lastModified": 1713476117,
"narHash": "sha256-97U178Ob/D+EYiGMg/ne7je292ZLCghclhXiPfIfpdQ=",
"owner": "mitchellh",
"repo": "zig-overlay",
"rev": "5fe52bdf2c213e47712d93c9ce12dfed4c4cef86",
"rev": "8f336c6f54b57492ac1d8a7385a79fefac84b7dc",
"type": "github"
},
"original": {

View File

@ -1,3 +1,3 @@
# This file is auto-generated! check build-support/check-zig-cache-hash.sh for
# more details.
"sha256-nr8utAh2oMwnN6nyWzJo8VubFO5cCrHK+QNYuT2WBi0="
"sha256-HkGZWT8drDMqZOb5tUEmNZ7TpBldM15bAkeNbCh2yT0="

View File

@ -79,12 +79,11 @@ pub fn build(b: *std.Build) !void {
}
}
lib.installHeadersDirectoryOptions(.{
.source_dir = .{ .path = "vendor" },
.install_dir = .header,
.install_subdir = "",
.include_extensions = &.{".h"},
});
lib.installHeadersDirectory(
.{ .path = "vendor" },
"",
.{ .include_extensions = &.{".h"} },
);
b.installArtifact(lib);

View File

@ -162,12 +162,11 @@ pub fn build(b: *std.Build) !void {
.flags = flags.items,
});
lib.installHeadersDirectoryOptions(.{
.source_dir = upstream.path("fontconfig"),
.install_dir = .header,
.install_subdir = "fontconfig",
.include_extensions = &.{".h"},
});
lib.installHeadersDirectory(
upstream.path("fontconfig"),
"fontconfig",
.{ .include_extensions = &.{".h"} },
);
b.installArtifact(lib);

View File

@ -91,7 +91,8 @@ pub const Property = enum {
var name: [replaced.len:0]u8 = undefined;
@memcpy(&name, replaced);
name[replaced.len] = 0;
break :name &name;
const final = name;
break :name &final;
};
}
}

View File

@ -81,13 +81,12 @@ pub fn build(b: *std.Build) !void {
}),
}
lib.installHeader("freetype-zig.h", "freetype-zig.h");
lib.installHeadersDirectoryOptions(.{
.source_dir = upstream.path("include"),
.install_dir = .header,
.install_subdir = "",
.include_extensions = &.{".h"},
});
lib.installHeader(.{ .path = "freetype-zig.h" }, "freetype-zig.h");
lib.installHeadersDirectory(
upstream.path("include"),
"",
.{ .include_extensions = &.{".h"} },
);
b.installArtifact(lib);

View File

@ -141,12 +141,11 @@ fn buildGlslang(
});
}
lib.installHeadersDirectoryOptions(.{
.source_dir = upstream.path(""),
.install_dir = .header,
.install_subdir = "",
.include_extensions = &.{".h"},
});
lib.installHeadersDirectory(
upstream.path(""),
"",
.{ .include_extensions = &.{".h"} },
);
return lib;
}

View File

@ -76,12 +76,11 @@ pub fn build(b: *std.Build) !void {
.file = upstream.path("src/harfbuzz.cc"),
.flags = flags.items,
});
lib.installHeadersDirectoryOptions(.{
.source_dir = upstream.path("src"),
.install_dir = .header,
.install_subdir = "",
.include_extensions = &.{".h"},
});
lib.installHeadersDirectory(
upstream.path("src"),
"",
.{ .include_extensions = &.{".h"} },
);
b.installArtifact(lib);

View File

@ -84,12 +84,11 @@ pub fn build(b: *std.Build) !void {
"hwy/timer.cc",
},
});
lib.installHeadersDirectoryOptions(.{
.source_dir = upstream.path("hwy"),
.install_dir = .header,
.install_subdir = "hwy",
.include_extensions = &.{".h"},
});
lib.installHeadersDirectory(
upstream.path("hwy"),
"hwy",
.{ .include_extensions = &.{".h"} },
);
b.installArtifact(lib);

View File

@ -40,13 +40,12 @@ pub fn build(b: *std.Build) !void {
.flags = flags.items,
});
lib.installHeader("pnglibconf.h", "pnglibconf.h");
lib.installHeadersDirectoryOptions(.{
.source_dir = upstream.path(""),
.install_dir = .header,
.install_subdir = "",
.include_extensions = &.{".h"},
});
lib.installHeader(.{ .path = "pnglibconf.h" }, "pnglibconf.h");
lib.installHeadersDirectory(
upstream.path(""),
"",
.{ .include_extensions = &.{".h"} },
);
b.installArtifact(lib);
}

View File

@ -100,13 +100,15 @@ pub fn build(b: *std.Build) !void {
.flags = flags.items,
});
lib.installHeader("override/include/libxml/xmlversion.h", "libxml/xmlversion.h");
lib.installHeadersDirectoryOptions(.{
.source_dir = upstream.path("include"),
.install_dir = .header,
.install_subdir = "",
.include_extensions = &.{".h"},
});
lib.installHeader(
.{ .path = "override/include/libxml/xmlversion.h" },
"libxml/xmlversion.h",
);
lib.installHeadersDirectory(
upstream.path("include"),
"",
.{ .include_extensions = &.{".h"} },
);
b.installArtifact(lib);
}

View File

@ -125,12 +125,11 @@ fn buildOniguruma(
},
});
lib.installHeadersDirectoryOptions(.{
.source_dir = upstream.path("src"),
.install_dir = .header,
.install_subdir = "",
.include_extensions = &.{".h"},
});
lib.installHeadersDirectory(
upstream.path("src"),
"",
.{ .include_extensions = &.{".h"} },
);
return lib;
}

View File

@ -62,13 +62,12 @@ pub fn build(b: *std.Build) !void {
.flags = flags.items,
});
lib.installHeader("pixman-version.h", "pixman-version.h");
lib.installHeadersDirectoryOptions(.{
.source_dir = upstream.path("pixman"),
.install_dir = .header,
.install_subdir = "",
.include_extensions = &.{".h"},
});
lib.installHeader(.{ .path = "pixman-version.h" }, "pixman-version.h");
lib.installHeadersDirectory(
upstream.path("pixman"),
"",
.{ .include_extensions = &.{".h"} },
);
b.installArtifact(lib);

View File

@ -27,12 +27,11 @@ pub fn build(b: *std.Build) !void {
"vendor/simdutf.cpp",
},
});
lib.installHeadersDirectoryOptions(.{
.source_dir = .{ .path = "vendor" },
.install_dir = .header,
.install_subdir = "",
.include_extensions = &.{".h"},
});
lib.installHeadersDirectory(
.{ .path = "vendor" },
"",
.{ .include_extensions = &.{".h"} },
);
b.installArtifact(lib);

View File

@ -78,12 +78,11 @@ fn buildSpirvCross(
},
});
lib.installHeadersDirectoryOptions(.{
.source_dir = upstream.path(""),
.install_dir = .header,
.install_subdir = "",
.include_extensions = &.{".h"},
});
lib.installHeadersDirectory(
upstream.path(""),
"",
.{ .include_extensions = &.{".h"} },
);
return lib;
}

View File

@ -27,12 +27,11 @@ pub fn build(b: *std.Build) !void {
.flags = flags.items,
.files = &.{"empty.cc"},
});
lib.installHeadersDirectoryOptions(.{
.source_dir = upstream.path("source"),
.install_dir = .header,
.install_subdir = "",
.include_extensions = &.{".h"},
});
lib.installHeadersDirectory(
upstream.path("source"),
"",
.{ .include_extensions = &.{".h"} },
);
b.installArtifact(lib);

View File

@ -18,12 +18,11 @@ pub fn build(b: *std.Build) !void {
try apple_sdk.addPaths(b, &lib.root_module);
}
lib.installHeadersDirectoryOptions(.{
.source_dir = upstream.path(""),
.install_dir = .header,
.install_subdir = "",
.include_extensions = &.{".h"},
});
lib.installHeadersDirectory(
upstream.path(""),
"",
.{ .include_extensions = &.{".h"} },
);
var flags = std.ArrayList([]const u8).init(b.allocator);
defer flags.deinit();

View File

@ -145,8 +145,8 @@ pub const Container = union(enum) {
pub fn split(self: Container) ?*Split {
return switch (self) {
.none, .tab_ => null,
.split_tl => |ptr| @fieldParentPtr(Split, "top_left", ptr),
.split_br => |ptr| @fieldParentPtr(Split, "bottom_right", ptr),
.split_tl => |ptr| @fieldParentPtr("top_left", ptr),
.split_br => |ptr| @fieldParentPtr("bottom_right", ptr),
};
}

View File

@ -61,7 +61,8 @@ fn comptimeGenerateGResourceXML(comptime libadwaita: bool) []const u8 {
var buf: [counter.bytes_written]u8 = undefined;
var stream = std.io.fixedBufferStream(&buf);
try writeGResourceXML(libadwaita, stream.writer());
return stream.getWritten();
const final = buf;
return final[0..stream.getWritten().len];
}
}

View File

@ -19,7 +19,8 @@ fn comptimeGenerateFishCompletions() []const u8 {
var buf: [counter.bytes_written]u8 = undefined;
var stream = std.io.fixedBufferStream(&buf);
try writeFishCompletions(stream.writer());
return stream.getWritten();
const final = buf;
return final[0..stream.getWritten().len];
}
}

View File

@ -35,7 +35,8 @@ fn comptimeGenSyntax() []const u8 {
var buf: [counting_writer.bytes_written]u8 = undefined;
var stream = std.io.fixedBufferStream(&buf);
try writeSyntax(stream.writer());
return stream.getWritten();
const final = buf;
return final[0..stream.getWritten().len];
}
}

View File

@ -83,7 +83,7 @@ pub const Mods = packed struct(Mods.Backing) {
super: Side = .left,
};
pub const Side = enum { left, right };
pub const Side = enum(u1) { left, right };
/// Integer value of this struct.
pub fn int(self: Mods) Backing {

View File

@ -25,7 +25,9 @@ pub const entries: []const Entry = entries: {
.native = raw[native_idx],
};
}
break :entries &result;
const final = result;
break :entries &final;
};
/// Entry contains the USB code, native keycode, and W3C dom code for

View File

@ -22,7 +22,9 @@ pub const entries: []const Entry = entries: {
.modifier = raw[3],
};
}
break :entries &result;
const final = result;
break :entries &final;
};
/// Raw entry is the tuple form of an entry for easy human management.

View File

@ -112,7 +112,7 @@ flags: packed struct {
/// Set via the XTSHIFTESCAPE sequence. If true (XTSHIFTESCAPE = 1)
/// then we want to capture the shift key for the mouse protocol
/// if the configuration allows it.
mouse_shift_capture: enum { null, false, true } = .null,
mouse_shift_capture: enum(u2) { null, false, true } = .null,
} = .{},
/// The event types that can be reported for mouse-related activities.

View File

@ -1236,7 +1236,7 @@ pub const Cell = packed struct(u64) {
// }
test "Cell is zero by default" {
const cell: Cell = .{};
const cell = Cell.init(0);
const cell_int: u64 = @bitCast(cell);
try std.testing.expectEqual(@as(u64, 0), cell_int);
}

View File

@ -88,7 +88,8 @@ pub fn xtgettcapMap(comptime self: Source) type {
.numeric => |v| numeric: {
var buf: [10]u8 = undefined;
const num_len = std.fmt.formatIntBuf(&buf, v, 10, .upper, .{});
break :numeric buf[0..num_len];
const final = buf;
break :numeric final[0..num_len];
},
} };
}
@ -100,7 +101,7 @@ pub fn xtgettcapMap(comptime self: Source) type {
// The value is more complex
var buf: [5 + entry[0].len + 1 + (entry[1].len * 2) + 2]u8 = undefined;
entry[1] = if (std.mem.eql(u8, entry[1], "")) std.fmt.bufPrint(
const out = if (std.mem.eql(u8, entry[1], "")) std.fmt.bufPrint(
&buf,
"\x1bP1+r{s}\x1b\\",
.{entry[0]}, // important: hex-encoded name
@ -109,9 +110,13 @@ pub fn xtgettcapMap(comptime self: Source) type {
"\x1bP1+r{s}={s}\x1b\\",
.{ entry[0], hexencode(entry[1]) }, // important: hex-encoded name
) catch unreachable;
const final = buf;
entry[1] = final[0..out.len];
}
return std.ComptimeStringMap([]const u8, kvs);
const kvs_final = kvs;
return std.ComptimeStringMap([]const u8, &kvs_final);
}
fn hexencode(comptime input: []const u8) []const u8 {

View File

@ -2646,9 +2646,15 @@ const StreamHandler = struct {
// any host (such an SSH session). The best practice terminals follow
// is to valid the hostname to be local.
const host_valid = host_valid: {
const host = uri.host orelse break :host_valid false;
const host_component = uri.host orelse break :host_valid false;
// Empty or localhost is always good
// Get the raw string of the URI. Its unclear to me if the various
// tags of this enum guarantee no percent-encoding so we just
// check all of it. This isn't a performance critical path.
const host = switch (host_component) {
.raw => |v| v,
.percent_encoded => |v| v,
};
if (host.len == 0 or std.mem.eql(u8, "localhost", host)) {
break :host_valid true;
}
@ -2671,24 +2677,32 @@ const StreamHandler = struct {
// the stack and fall back to heap allocation if we have to.
var pathBuf: [1024]u8 = undefined;
const path, const heap = path: {
// Get the raw string of the URI. Its unclear to me if the various
// tags of this enum guarantee no percent-encoding so we just
// check all of it. This isn't a performance critical path.
const path = switch (uri.path) {
.raw => |v| v,
.percent_encoded => |v| v,
};
// If the path doesn't have any escapes, we can use it directly.
if (std.mem.indexOfScalar(u8, uri.path, '%') == null)
break :path .{ uri.path, false };
if (std.mem.indexOfScalar(u8, path, '%') == null)
break :path .{ path, false };
// First try to stack-allocate
var fba = std.heap.FixedBufferAllocator.init(&pathBuf);
if (std.Uri.unescapeString(fba.allocator(), uri.path)) |path|
break :path .{ path, false }
if (std.fmt.allocPrint(fba.allocator(), "{raw}", .{uri.path})) |v|
break :path .{ v, false }
else |_| {}
// Fall back to heap
if (std.Uri.unescapeString(self.alloc, uri.path)) |path|
break :path .{ path, true }
if (std.fmt.allocPrint(self.alloc, "{raw}", .{uri.path})) |v|
break :path .{ v, true }
else |_| {}
// Fall back to using it directly...
log.warn("failed to unescape OSC 7 path, using it directly path={s}", .{uri.path});
break :path .{ uri.path, false };
log.warn("failed to unescape OSC 7 path, using it directly path={s}", .{path});
break :path .{ path, false };
};
defer if (heap) self.alloc.free(path);