authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-05-30 15:21:50 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-05-30 15:21:50 -07:00
loge789611498c56f074447733083e3a629c4b2b947
tree690574cc55f34cd5473b720eec0349631bf6b69a
parent754e83d745ec6cf4832b70534d15f869c5df6f5b
signaturebadge-check Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

stringify: fix string escaping


1 files changed, 26 insertions(+), 2 deletions(-)

json.zig+26-2
......@@ -725,7 +725,19 @@ pub fn stringify(writer: anytype, value: anytype, options: std.json.StringifyOpt
725725 const T = @TypeOf(value);
726726 if (comptime extras.isZigString(T)) {
727727 if (extras.matchesAll(u8, value, std.ascii.isAscii)) {
728 try writer.writevAll(&.{ &.{'"'}, value, &.{'"'} });
728 if (extras.matchesAll(u8, value, std.ascii.isPrint)) {
729 try writer.writevAll(&.{ &.{'"'}, value, &.{'"'} });
730 } else {
731 try writer.writeAll("\"");
732 for (value) |c| {
733 try writer.writeAll(switch (c) {
734 0x20...0x7e => &.{c},
735 0x0c => "\\n",
736 else => "\\u00" ++ extras.to_hex([_]u8{c}),
737 });
738 }
739 try writer.writeAll("\"");
740 }
729741 } else {
730742 @panic("TODO");
731743 }
......@@ -733,7 +745,19 @@ pub fn stringify(writer: anytype, value: anytype, options: std.json.StringifyOpt
733745 }
734746 if (comptime extras.isArrayOf(u8)(T)) {
735747 if (extras.matchesAll(u8, &value, std.ascii.isAscii)) {
736 try writer.writevAll(&.{ &.{'"'}, &value, &.{'"'} });
748 if (extras.matchesAll(u8, value, std.ascii.isPrint)) {
749 try writer.writevAll(&.{ &.{'"'}, &value, &.{'"'} });
750 } else {
751 try writer.writeAll("\"");
752 for (&value) |c| {
753 try writer.writeAll(switch (c) {
754 0x20...0x7e => &.{c},
755 0x0c => "\\n",
756 else => "\\u00" ++ extras.to_hex([_]u8{c}),
757 });
758 }
759 try writer.writeAll("\"");
760 }
737761 } else {
738762 @panic("TODO");
739763 }