aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2023-11-03 15:19:07 +0000
committers-ol <s+removethis@s-ol.nu>2023-11-03 15:19:07 +0000
commit8d8b6b25997446e8e04c0394d1723d8d710d7698 (patch)
treee985f36dd1c6b58a6f6a52fa640ba89c06513e83
parentonly restore uniform values if type unchanged (diff)
downloadglsl-view-8d8b6b25997446e8e04c0394d1723d8d710d7698.tar.gz
glsl-view-8d8b6b25997446e8e04c0394d1723d8d710d7698.zip
inject #line directives for better error reporting
-rw-r--r--src/main.zig23
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;
}
}