From 37ff7af18cd2e896506e6d228058204525b4a6eb Mon Sep 17 00:00:00 2001 From: Taylan Kammer Date: Sun, 31 May 2026 20:58:42 +0200 Subject: More proper shebang line parsing. --- src/zisp/io/Parser.zig | 45 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/zisp/io/Parser.zig b/src/zisp/io/Parser.zig index 8e2908d..e29868a 100644 --- a/src/zisp/io/Parser.zig +++ b/src/zisp/io/Parser.zig @@ -620,11 +620,46 @@ fn endRuneDatum(p: *Parser) !void { } fn parseHashBang(p: *Parser, next: Fn) !void { - while (try p.readNoEof2("hash-bang")) |c| { - if (c == ' ' or c == '\t') continue; - const s = try p.getBareString(c); - return p.jump(next, p.cons(SHBANG, s)); - } + const val = try p.getHashBangValue(); + return p.jump(next, p.cons(SHBANG, val)); +} + +fn getHashBangValue(p: *Parser) !Value { + while (try p.readNoEof2("hash-bang")) |c| switch (c) { + ' ', '\t' => continue, + '\n' => return p.err(.InvalidCharacter, "hash-bang"), + else => { + try p.addChar(c); + while (try p.read()) |c2| switch (c2) { + '\n' => return p.getCharsAsString(), + ' ', '\t' => break, + else => try p.addChar(c2), + }; + const interp = try p.getCharsAsString(); + if (try p.getHashBangArgLine()) |arg_line| { + return p.cons(interp, arg_line); + } else { + return interp; + } + }, + }; + unreachable; +} + +fn getHashBangArgLine(p: *Parser) !?Value { + while (try p.read()) |c| switch (c) { + ' ', '\t' => continue, + '\n' => return null, + else => { + try p.addChar(c); + while (try p.read()) |c2| { + if (c2 == '\n') break; + try p.addChar(c2); + } + return try p.getCharsAsString(); + }, + }; + return null; } fn parseLabel(p: *Parser, next: Fn) !void { -- cgit v1.2.3