main.zig (4761B)
1 const std = @import("std"); 2 3 const mymarkdown = @import("mymarkdown"); 4 const tracy = @import("tracy"); 5 6 fn readInput(gpa: std.mem.Allocator, arena: std.mem.Allocator) !std.ArrayList(u8) { 7 const stdin = std.io.getStdIn(); 8 const tracy_frame = tracy.namedFrame("reading input"); 9 defer tracy_frame.end(); 10 if (stdin.stat()) |stat| { 11 if (stat.size > 0) { 12 var al: std.ArrayList(u8) = try .initCapacity(arena, stat.size + mymarkdown.PADDING + 1); 13 try stdin.reader().readAllArrayList(&al, std.math.maxInt(u32) - mymarkdown.PADDING - 1); 14 try al.appendNTimes('\n', mymarkdown.PADDING + 1); 15 return al; 16 } 17 } else |_| {} 18 var al: std.ArrayList(u8) = try .initCapacity(gpa, 4096); 19 errdefer al.deinit(); 20 try stdin.reader().readAllArrayList(&al, std.math.maxInt(u32) - mymarkdown.PADDING - 1); 21 try al.appendNTimes('\n', mymarkdown.PADDING + 1); 22 return al; 23 } 24 25 var debug_allocator: std.heap.DebugAllocator(.{}) = .init; 26 27 pub fn main() !void { 28 const gpa, const is_debug = gpa: { 29 break :gpa switch (@import("builtin").mode) { 30 .Debug, .ReleaseSafe => .{ debug_allocator.allocator(), true }, 31 .ReleaseFast, .ReleaseSmall => .{ std.heap.smp_allocator, false }, 32 }; 33 }; 34 defer _ = if (is_debug) debug_allocator.deinit(); 35 var arena_instance: std.heap.ArenaAllocator = .init(gpa); 36 defer arena_instance.deinit(); 37 const arena = arena_instance.allocator(); 38 39 const args = try std.process.argsAlloc(arena); 40 41 const bench, // 42 const run, // 43 const render, // 44 const print, // 45 const iters = 46 blk: { 47 var bench = false; 48 var run = false; 49 var render = false; 50 var print = false; 51 var iters: usize = 8; 52 for (args) |arg| { 53 if (std.mem.eql(u8, arg, "--bench")) 54 bench = true; 55 if (std.mem.eql(u8, arg, "--run")) 56 run = true; 57 if (std.mem.eql(u8, arg, "--render")) 58 render, run = .{ true, true }; 59 if (std.mem.eql(u8, arg, "--print")) 60 print, run = .{ true, true }; 61 if (std.mem.startsWith(u8, arg, "--iters=")) 62 iters = std.fmt.parseInt( 63 usize, 64 arg[8..], 65 0, 66 ) catch |err| { 67 std.debug.print( 68 "Invalid --iters= argument, expected number: {}\n", 69 .{err}, 70 ); 71 continue; 72 }; 73 if (std.mem.eql(u8, arg, "--wait")) 74 std.Thread.sleep(2e9); 75 } 76 break :blk .{ 77 bench, 78 run, 79 render, 80 print, 81 iters, 82 }; 83 }; 84 85 var input_arraylist = try readInput(gpa, arena); 86 defer input_arraylist.deinit(); 87 const input = input_arraylist.items; 88 89 for (0..iters) |_| { 90 if (bench) { 91 const ast = blk: { 92 const tracy_frame = tracy.namedFrame("parse"); 93 defer tracy_frame.end(); 94 break :blk try mymarkdown.parse( 95 gpa, 96 gpa, 97 input, 98 ); 99 }; 100 ast.deinit(gpa); 101 } 102 } 103 104 if (!bench) { 105 const ast: mymarkdown.Ast = if (run) blk: { 106 const tracy_frame = tracy.namedFrame("parse"); 107 defer tracy_frame.end(); 108 break :blk try mymarkdown.parse( 109 gpa, 110 arena, 111 input, 112 ); 113 } else .empty; 114 115 var render_arraylist: std.ArrayList(u8) = .init(gpa); 116 defer render_arraylist.deinit(); 117 if (render or print) { 118 std.debug.print("Rendering\n", .{}); 119 const tracy_frame = tracy.namedFrame("Render"); 120 defer tracy_frame.end(); 121 _ = try ast.renderAst(render_arraylist.writer(), input); 122 } 123 124 for (0..iters) |_| { 125 if (render) { 126 std.debug.print("Re-rendering\n", .{}); 127 render_arraylist.clearRetainingCapacity(); 128 const tracy_frame = tracy.namedFrame("re-render"); 129 defer tracy_frame.end(); 130 _ = try ast.renderAst(render_arraylist.writer(), input); 131 } 132 } 133 134 if (print) try std.io.getStdOut().writeAll(render_arraylist.items); 135 } 136 137 if (tracy.enable) { 138 tracy.frameMarkNamed("waiting for tracy"); 139 std.Thread.sleep(100 * std.time.ns_per_ms); 140 } 141 }