adridoesthings revised this gist . Go to revision
No changes
adridoesthings revised this gist . Go to revision
1 file changed, 80 insertions
find.zig(file created)
| @@ -0,0 +1,80 @@ | |||
| 1 | + | const std = @import("std"); | |
| 2 | + | ||
| 3 | + | const COLOR_RED = "\x1b[0;31m"; | |
| 4 | + | const COLOR_RESET = "\x1b[0m"; | |
| 5 | + | ||
| 6 | + | fn print_usage(exec: [*:0]u8) void { | |
| 7 | + | std.debug.print("Usage: {s} FILE PATTERN\n", .{exec}); | |
| 8 | + | } | |
| 9 | + | ||
| 10 | + | fn string_contains_substring(allocator: std.mem.Allocator, string: []u8, substring: []u8) !std.ArrayList([2]usize) { | |
| 11 | + | var list = std.ArrayList([2]usize).init(allocator); | |
| 12 | + | ||
| 13 | + | var start: ?usize = null; | |
| 14 | + | var substring_index: usize = 0; | |
| 15 | + | ||
| 16 | + | for (string, 0..) |c, i| { | |
| 17 | + | if (c == substring[substring_index]) { | |
| 18 | + | substring_index += 1; | |
| 19 | + | ||
| 20 | + | if (substring_index == substring.len) { | |
| 21 | + | try list.append(.{ start orelse i, i }); | |
| 22 | + | start = null; | |
| 23 | + | substring_index = 0; | |
| 24 | + | continue; | |
| 25 | + | } | |
| 26 | + | ||
| 27 | + | if (start == null) { | |
| 28 | + | start = i; | |
| 29 | + | } | |
| 30 | + | } else if (start != null) { | |
| 31 | + | start = null; | |
| 32 | + | substring_index = 0; | |
| 33 | + | } | |
| 34 | + | } | |
| 35 | + | ||
| 36 | + | return list; | |
| 37 | + | } | |
| 38 | + | ||
| 39 | + | pub fn main() !void { | |
| 40 | + | if (std.os.argv.len != 3) { | |
| 41 | + | print_usage(std.os.argv[0]); | |
| 42 | + | std.process.exit(1); | |
| 43 | + | unreachable; | |
| 44 | + | } | |
| 45 | + | ||
| 46 | + | const stdout = std.io.getStdOut().writer(); | |
| 47 | + | ||
| 48 | + | var gpa = std.heap.GeneralPurposeAllocator(.{}){}; | |
| 49 | + | const allocator = gpa.allocator(); | |
| 50 | + | defer { | |
| 51 | + | const status = gpa.deinit(); | |
| 52 | + | if (status == .leak) @panic("there are leaks"); | |
| 53 | + | } | |
| 54 | + | ||
| 55 | + | const args = try std.process.argsAlloc(allocator); | |
| 56 | + | defer std.process.argsFree(allocator, args); | |
| 57 | + | ||
| 58 | + | const file = try std.fs.cwd().openFile(args[1], .{}); | |
| 59 | + | defer file.close(); | |
| 60 | + | ||
| 61 | + | const reader = file.reader(); | |
| 62 | + | while (true) { | |
| 63 | + | const line = reader.readUntilDelimiterAlloc(allocator, '\n', 1024 * 1024) catch break; | |
| 64 | + | defer allocator.free(line); | |
| 65 | + | const contains = try string_contains_substring(allocator, line, args[2]); | |
| 66 | + | defer contains.deinit(); | |
| 67 | + | ||
| 68 | + | if (contains.items.len == 0) { | |
| 69 | + | try stdout.print(" {s}\n", .{line}); | |
| 70 | + | } else { | |
| 71 | + | try stdout.print("> ", .{}); | |
| 72 | + | var previous: usize = 0; | |
| 73 | + | for (contains.items) |element| { | |
| 74 | + | try stdout.print("{s}{s}{s}{s}", .{ line[previous..element[0]], COLOR_RED, line[element[0] .. element[1] + 1], COLOR_RESET }); | |
| 75 | + | previous = element[1] + 1; | |
| 76 | + | } | |
| 77 | + | try stdout.print("{s}\n", .{line[previous..]}); | |
| 78 | + | } | |
| 79 | + | } | |
| 80 | + | } | |
Newer
Older