From e19a73c2d5b61d783470daa8aabbaba23ceb4578 Mon Sep 17 00:00:00 2001 From: Ryan Liptak Date: Wed, 26 Aug 2026 14:17:43 -0700 Subject: [PATCH] Fix std.zig.StringEscapeWriter drain function returning the wrong information `drain` should return the number of bytes consumed from `data` Fixes #36647 --- lib/std/zig.zig | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/std/zig.zig b/lib/std/zig.zig index e18a6414c6e9ba130640e061307c68b16ff02456..32d71776c227b56c4be7bfac1268959c0ddfca79 100644 --- a/lib/std/zig.zig +++ b/lib/std/zig.zig @@ -601,20 +601,35 @@ pub const StringEscapeWriter = struct { fn drain(w: *Writer, data: []const []const u8, splat: usize) Io.Writer.Error!usize { const sew: *StringEscapeWriter = @alignCast(@fieldParentPtr("writer", w)); const out = sew.out; - _ = try stringEscapeCounting(w.buffered(), out); + try stringEscape(w.buffered(), out); w.end = 0; var n: usize = 0; for (data[0 .. data.len - 1]) |bytes| { - n += try stringEscapeCounting(bytes, out); + try stringEscape(bytes, out); + n += bytes.len; } const pattern = data[data.len - 1]; for (0..splat) |_| { - n += try stringEscapeCounting(pattern, out); + try stringEscape(pattern, out); + n += pattern.len; } return n; } }; +test StringEscapeWriter { + const bytes = "\x7f\t\n\r\\\"abc"; + const escaped = "\\x7f\\t\\n\\r\\\\\\\"abc"; + + var out_buf: [escaped.len]u8 = undefined; + var out: Io.Writer = .fixed(&out_buf); + var w: StringEscapeWriter = .init(&out, &.{}); + + const n = try w.writer.write(bytes); + try std.testing.expectEqual(bytes.len, n); + try std.testing.expectEqualStrings(escaped, out.buffered()); +} + /// Print as escaped contents of a single-quoted string. pub fn charEscape(codepoint: u21, w: *Writer) Writer.Error!void { switch (codepoint) { -- 2.54.0