aboutsummaryrefslogtreecommitdiff
path: root/vendor/libghostty-vt/src/cli/args.zig
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-09-10 21:51:57 +0300
committerGitHub <noreply@github.com>2026-09-10 21:51:57 +0300
commit425c86179791cd32e2d4ce0ae7f269940b4b0663 (patch)
treee52c4383a6d69216cbe2a32638bf90841d7e2189 /vendor/libghostty-vt/src/cli/args.zig
parent90e947a6e26e02f10ec7f1694c4eb5b78a86406b (diff)
chore: upgrade libghostty and preserve terminal behavior (#3906)
Diffstat (limited to 'vendor/libghostty-vt/src/cli/args.zig')
-rw-r--r--vendor/libghostty-vt/src/cli/args.zig79
1 files changed, 54 insertions, 25 deletions
diff --git a/vendor/libghostty-vt/src/cli/args.zig b/vendor/libghostty-vt/src/cli/args.zig
index bd5060d6..38616fc0 100644
--- a/vendor/libghostty-vt/src/cli/args.zig
+++ b/vendor/libghostty-vt/src/cli/args.zig
@@ -489,18 +489,13 @@ pub fn parseTaggedUnion(comptime T: type, alloc: Allocator, v: []const u8) !T {
// We need to create a struct that looks like this union field.
// This lets us use parseIntoField as if its a dedicated struct.
- const Target = @Type(.{ .@"struct" = .{
- .layout = .auto,
- .fields = &.{.{
- .name = field.name,
- .type = field.type,
- .default_value_ptr = null,
- .is_comptime = false,
- .alignment = @alignOf(field.type),
- }},
- .decls = &.{},
- .is_tuple = false,
- } });
+ const Target = @Struct(
+ .auto,
+ null,
+ &.{field.name},
+ &.{field.type},
+ &.{.{ .@"align" = @alignOf(field.type) }},
+ );
// Parse the value into the struct
var t: Target = undefined;
@@ -677,7 +672,7 @@ test "parse: simple" {
} = .{};
defer if (data._arena) |arena| arena.deinit();
- var iter = try std.process.ArgIteratorGeneral(.{}).init(
+ var iter = try std.process.Args.IteratorGeneral(.{}).init(
testing.allocator,
"--a=42 --b --b-f=false",
);
@@ -689,7 +684,7 @@ test "parse: simple" {
try testing.expect(!data.@"b-f");
// Reparsing works
- var iter2 = try std.process.ArgIteratorGeneral(.{}).init(
+ var iter2 = try std.process.Args.IteratorGeneral(.{}).init(
testing.allocator,
"--a=84",
);
@@ -711,7 +706,7 @@ test "parse: quoted value" {
} = .{};
defer if (data._arena) |arena| arena.deinit();
- var iter = try std.process.ArgIteratorGeneral(.{}).init(
+ var iter = try std.process.Args.IteratorGeneral(.{}).init(
testing.allocator,
"--a=\"42\" --b=\"hello!\"",
);
@@ -731,7 +726,7 @@ test "parse: empty value resets to default" {
} = .{};
defer if (data._arena) |arena| arena.deinit();
- var iter = try std.process.ArgIteratorGeneral(.{}).init(
+ var iter = try std.process.Args.IteratorGeneral(.{}).init(
testing.allocator,
"--a= --b=",
);
@@ -750,7 +745,7 @@ test "parse: positional arguments are invalid" {
} = .{};
defer if (data._arena) |arena| arena.deinit();
- var iter = try std.process.ArgIteratorGeneral(.{}).init(
+ var iter = try std.process.Args.IteratorGeneral(.{}).init(
testing.allocator,
"--a=84 what",
);
@@ -774,7 +769,7 @@ test "parse: diagnostic tracking" {
} = .{};
defer if (data._arena) |arena| arena.deinit();
- var iter = try std.process.ArgIteratorGeneral(.{}).init(
+ var iter = try std.process.Args.IteratorGeneral(.{}).init(
testing.allocator,
"--what --a=42",
);
@@ -858,7 +853,7 @@ test "parse: compatibility handler" {
} = .{};
defer if (data._arena) |arena| arena.deinit();
- var iter = try std.process.ArgIteratorGeneral(.{}).init(
+ var iter = try std.process.Args.IteratorGeneral(.{}).init(
testing.allocator,
"--a=yuh",
);
@@ -884,7 +879,7 @@ test "parse: compatibility renamed" {
} = .{};
defer if (data._arena) |arena| arena.deinit();
- var iter = try std.process.ArgIteratorGeneral(.{}).init(
+ var iter = try std.process.Args.IteratorGeneral(.{}).init(
testing.allocator,
"--old=true --b=true",
);
@@ -1363,8 +1358,11 @@ pub fn ArgsIterator(comptime Iterator: type) type {
}
/// Create an args iterator for the process args. This will skip argv0.
-pub fn argsIterator(alloc_gpa: Allocator) internal_os.args.ArgIterator.InitError!ArgsIterator(internal_os.args.ArgIterator) {
- var iter = try internal_os.args.iterator(alloc_gpa);
+pub fn argsIterator(
+ alloc_gpa: Allocator,
+ args: std.process.Args,
+) std.process.Args.Iterator.InitError!ArgsIterator(std.process.Args.Iterator) {
+ var iter: std.process.Args.Iterator = try .initAllocator(args, alloc_gpa);
errdefer iter.deinit();
_ = iter.next(); // skip argv0
return .{ .iterator = iter };
@@ -1373,7 +1371,7 @@ pub fn argsIterator(alloc_gpa: Allocator) internal_os.args.ArgIterator.InitError
test "ArgsIterator" {
const testing = std.testing;
- const child = try std.process.ArgIteratorGeneral(.{}).init(
+ const child = try std.process.Args.IteratorGeneral(.{}).init(
testing.allocator,
"--what +list-things --a=42",
);
@@ -1456,8 +1454,15 @@ pub const LineIterator = struct {
entry = entry[0..trim.len];
}
- // Ignore blank lines and comments
- if (entry.len == 0 or entry[0] == '#') continue;
+ // Ignore blank lines and comments. If this line consumed the
+ // remaining buffer, refill before the loop condition checks for
+ // more data.
+ if (entry.len == 0 or entry[0] == '#') {
+ if (self.r.seek == self.r.end) {
+ self.r.fillMore() catch {};
+ }
+ continue;
+ }
break entry;
} else return null;
@@ -1625,3 +1630,27 @@ test "LineIterator with buffered and primed reader" {
try testing.expectEqual(@as(?[]const u8, null), iter.next());
try testing.expectEqual(@as(?[]const u8, null), iter.next());
}
+
+test "LineIterator refills after ignored line at buffer boundary" {
+ const testing = std.testing;
+
+ {
+ var f: std.Io.Reader = .fixed("#\nA\n");
+ var buf: [2]u8 = undefined;
+ var r = f.limited(.unlimited, &buf);
+ var iter: LineIterator = .init(&r.interface);
+
+ try testing.expectEqualStrings("--A", iter.next().?);
+ try testing.expectEqual(@as(?[]const u8, null), iter.next());
+ }
+
+ {
+ var f: std.Io.Reader = .fixed("\nA\n");
+ var buf: [1]u8 = undefined;
+ var r = f.limited(.unlimited, &buf);
+ var iter: LineIterator = .init(&r.interface);
+
+ try testing.expectEqualStrings("--A", iter.next().?);
+ try testing.expectEqual(@as(?[]const u8, null), iter.next());
+ }
+}