Última atividade 1719877009

Find a pattern in a file, print the content of the file and mark the position of the pattern (if found)

adridoesthings's Avatar adridoesthings revisou este gist 1719877009. Ir para a revisão

Sem alterações

adridoesthings's Avatar adridoesthings revisou este gist 1719876998. Ir para a revisão

1 file changed, 80 insertions

find.zig(arquivo criado)

@@ -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 + }
Próximo Anterior