Utoljára aktív 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 gist felülvizsgálása 1719877009. Revízióhoz ugrás

Nincsenek változtatások

adridoesthings's Avatar adridoesthings gist felülvizsgálása 1719876998. Revízióhoz ugrás

1 file changed, 80 insertions

find.zig(fájl létrehozva)

@@ -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 + }
Újabb Régebbi