Initial public release

This commit is contained in:
CJ van den Berg 2024-02-29 00:00:15 +01:00
parent 3c3f068914
commit 4ece4babad
63 changed files with 15101 additions and 0 deletions

63
src/text_manip.zig Normal file
View file

@ -0,0 +1,63 @@
const std = @import("std");
const TextWriter = std.ArrayList(u8).Writer;
pub fn find_first_non_ws(text: []const u8) ?usize {
for (text, 0..) |c, i| if (c == ' ' or c == '\t') continue else return i;
return null;
}
pub fn find_prefix(prefix: []const u8, text: []const u8) ?usize {
var start: usize = 0;
var pos: usize = 0;
var in_prefix: bool = false;
for (text, 0..) |c, i| {
if (!in_prefix) {
if (c == ' ' or c == '\t')
continue
else {
in_prefix = true;
start = i;
}
}
if (in_prefix) {
if (c == prefix[pos]) {
pos += 1;
if (prefix.len > pos) continue else return start;
} else return null;
}
}
return null;
}
fn toggle_prefix_in_line(prefix: []const u8, text: []const u8, writer: TextWriter) !void {
if (find_prefix(prefix, text)) |pos| {
_ = try writer.write(text[0..pos]);
if (text.len > pos + prefix.len) {
_ = try if (text[pos + prefix.len] == ' ')
writer.write(text[pos + 1 + prefix.len ..])
else
writer.write(text[pos + prefix.len ..]);
}
} else if (find_first_non_ws(text)) |pos| {
_ = try writer.write(text[0..pos]);
_ = try writer.write(prefix);
_ = try writer.write(" ");
_ = try writer.write(text[pos..]);
} else {
_ = try writer.write(prefix);
_ = try writer.write(text);
}
}
pub fn toggle_prefix_in_text(prefix: []const u8, text: []const u8, a: std.mem.Allocator) ![]const u8 {
var result = try std.ArrayList(u8).initCapacity(a, prefix.len + text.len);
const writer = result.writer();
var pos: usize = 0;
while (std.mem.indexOfScalarPos(u8, text, pos, '\n')) |next| {
try toggle_prefix_in_line(prefix, text[pos..next], writer);
_ = try writer.write("\n");
pos = next + 1;
}
return result.toOwnedSlice();
}