make multiple substitutions work and other cleanup
This commit is contained in:
parent
899d5fdfc5
commit
a30c6d9ea1
2 changed files with 17 additions and 24 deletions
|
@ -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" {
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
line1
|
||||
old_text
|
||||
line3
|
||||
another_old
|
||||
line5
|
Loading…
Add table
Reference in a new issue