From a30c6d9ea108b40f971d3124d24a5e0a5b8a9cfc Mon Sep 17 00:00:00 2001 From: Emil Lerch Date: Thu, 18 Sep 2025 13:44:05 -0700 Subject: [PATCH] make multiple substitutions work and other cleanup --- sed-lite/src/main.zig | 36 +++++++++++++++++------------------- sed-lite/test.txt | 5 ----- 2 files changed, 17 insertions(+), 24 deletions(-) delete mode 100644 sed-lite/test.txt diff --git a/sed-lite/src/main.zig b/sed-lite/src/main.zig index 315db37..f5639ff 100644 --- a/sed-lite/src/main.zig +++ b/sed-lite/src/main.zig @@ -45,8 +45,6 @@ pub fn main() !u8 { }; defer file.close(); - var buffer: [4096]u8 = undefined; - const temp_path = try std.fmt.allocPrint(allocator, "{s}.tmp", .{file_path}); defer allocator.free(temp_path); @@ -56,12 +54,16 @@ pub fn main() !u8 { }; defer temp_file.close(); - var output_buffer: [4096]u8 = undefined; - var reader = file.reader(&buffer).interface; - var writer = temp_file.writer(&output_buffer).interface; + // don't screw with vars and consts in this block... + var reader_buffer: [4096]u8 = undefined; + var freader = file.reader(&reader_buffer); + const reader = &freader.interface; + var writer_buffer: [4096]u8 = undefined; + var fwriter = temp_file.writer(&writer_buffer); + const writer = &fwriter.interface; try substituteLines( - &reader, - &writer, + reader, + writer, substitutions, ); try writer.flush(); @@ -82,27 +84,23 @@ const Substitution = struct { }; fn substituteLines(reader: *std.Io.Reader, writer: *std.Io.Writer, substitutions: []const Substitution) !void { - var line_buf: [1024]u8 = undefined; - var line = std.Io.Writer.fixed(&line_buf); - - while ((try reader.streamDelimiterEnding(&line, '\n')) > 0) : (_ = line.consumeAll()) { - const line_content = line.buffered(); + while (reader.takeDelimiterExclusive('\n')) |line| { var substituted = false; for (substitutions) |sub| { - if (std.mem.eql(u8, line_content, sub.original)) { + if (std.mem.eql(u8, line, sub.original)) { try writer.writeAll(sub.replacement); substituted = true; break; } } if (!substituted) - try writer.writeAll(line_content); + try writer.writeAll(line); - // Write our \n - if (reader.takeByte()) |b| - try writer.writeByte(b) - else |_| {} // end of stream - } + if (reader.peekByte() != error.EndOfStream) + try writer.writeByte('\n'); + } else |err| if (err != error.EndOfStream) return err; + // write the final newline + // try writer.writeByte('\n'); } test "substitute lines exact match" { diff --git a/sed-lite/test.txt b/sed-lite/test.txt deleted file mode 100644 index 16b0b87..0000000 --- a/sed-lite/test.txt +++ /dev/null @@ -1,5 +0,0 @@ -line1 -old_text -line3 -another_old -line5