diff options
| author | s-ol <s+removethis@s-ol.nu> | 2023-11-03 15:19:07 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2023-11-03 15:19:07 +0000 |
| commit | 8d8b6b25997446e8e04c0394d1723d8d710d7698 (patch) | |
| tree | e985f36dd1c6b58a6f6a52fa640ba89c06513e83 | |
| parent | only restore uniform values if type unchanged (diff) | |
| download | glsl-view-8d8b6b25997446e8e04c0394d1723d8d710d7698.tar.gz glsl-view-8d8b6b25997446e8e04c0394d1723d8d710d7698.zip | |
inject #line directives for better error reporting
| -rw-r--r-- | src/main.zig | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/src/main.zig b/src/main.zig index 94ccab9..0181db6 100644 --- a/src/main.zig +++ b/src/main.zig @@ -157,6 +157,16 @@ pub fn main() !void { } } +fn escape_dquote(str: []const u8) []const u8 { + const state = struct { + var buf: [1024]u8 = undefined; + }; + + const len = std.mem.replacementSize(u8, str, "\"", "\\\""); + _ = std.mem.replace(u8, str, "\"", "\\\"", state.buf[0..len]); + return state.buf[0..len]; +} + // given a file and the directory it is in, resolve references fn loadFile(config: *const cfg.Config, writer: anytype, dir: []const u8, filename: []const u8) !void { const file_dir = try fs.path.resolve(c_allocator, &[_][]const u8{ @@ -172,11 +182,10 @@ fn loadFile(config: *const cfg.Config, writer: anytype, dir: []const u8, filenam defer file.close(); var reader = file.reader(); - var line_number: u32 = 0; + var line_number: u32 = 1; var buf: [1024]u8 = undefined; + var wrote_line = false; while (try reader.readUntilDelimiterOrEof(&buf, '\n')) |line| { - line_number += 1; - if (std.mem.startsWith(u8, line, "#pragma ")) { var parts = std.mem.split(u8, line, " "); _ = parts.next(); @@ -192,6 +201,7 @@ fn loadFile(config: *const cfg.Config, writer: anytype, dir: []const u8, filenam include_path = include_path[1 .. include_path.len - 1]; loadFile(config, writer, file_dir, include_path) catch unreachable; + _ = try writer.print("#line {d} \"{s}\"\n", .{ line_number, escape_dquote(filename) }); continue; } else { @@ -200,8 +210,15 @@ fn loadFile(config: *const cfg.Config, writer: anytype, dir: []const u8, filenam } } + if (!std.mem.startsWith(u8, line, "#version") and !wrote_line) { + _ = try writer.print("#line {d} \"{s}\"\n", .{ line_number - 1, escape_dquote(filename) }); + wrote_line = true; + } + _ = try writer.write(line); _ = try writer.write("\n"); + + line_number += 1; } } |
