vig/src/main.zig

92 lines
2.3 KiB
Zig
Raw Permalink Normal View History

2019-06-04 00:29:53 +00:00
const std = @import("std");
2019-06-05 00:27:05 +00:00
const runners = @import("runner.zig");
2019-06-04 18:06:57 +00:00
const Allocator = std.mem.Allocator;
pub const Result = error{
Ok,
2019-06-06 01:06:12 +00:00
ScannerError,
CompileError,
};
2020-04-10 19:48:10 +00:00
fn run(allocator: *Allocator, data: []const u8) !void {
2019-12-07 22:45:12 +00:00
var stdout_file = std.io.getStdOut();
2020-04-10 19:48:10 +00:00
const stdout = stdout_file.outStream();
2019-06-04 18:06:57 +00:00
2019-06-05 00:27:05 +00:00
var runner = runners.Runner.init(allocator, stdout);
return runner.execute(data);
}
fn runFile(allocator: *Allocator, path: []const u8) !void {
2020-04-10 19:48:10 +00:00
var file = try std.fs.cwd().openFile(path, .{});
defer file.close();
const total_bytes = try file.getEndPos();
var slice = try allocator.alloc(u8, total_bytes);
_ = try file.read(slice);
run(allocator, slice) catch |err| {
switch (err) {
Result.Ok => {},
Result.CompileError => std.os.exit(65),
else => return err,
}
};
}
fn runPrompt(allocator: *Allocator) !void {
2019-12-07 22:45:12 +00:00
var stdout_file = std.io.getStdOut();
2020-04-10 19:48:10 +00:00
const stdout = stdout_file.outStream();
var stdin_file = std.io.getStdIn();
const stdin = stdin_file.inStream();
var line_buf: [1024]u8 = undefined;
while (true) {
2020-04-10 19:48:10 +00:00
try stdout.print("> ", .{});
2020-04-10 19:48:10 +00:00
const amt = try stdin.read(&line_buf);
if (amt == line_buf.len) {
try stdout.print("Input too long.\n", .{});
continue;
}
const line = std.mem.trimRight(u8, line_buf[0..amt], "\r\n");
run(allocator, line) catch |err| {
switch (err) {
Result.Ok => {},
2019-06-06 01:06:12 +00:00
Result.ScannerError => blk: {
2020-04-10 19:48:10 +00:00
try stdout.print("scanner error.\n", .{});
2019-06-06 01:06:12 +00:00
},
Result.CompileError => blk: {
2020-04-10 19:48:10 +00:00
try stdout.print("compile error.\n", .{});
},
else => return err,
}
};
}
}
2019-06-04 00:29:53 +00:00
pub fn main() anyerror!void {
2020-04-10 19:48:10 +00:00
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
defer arena.deinit();
var allocator = &arena.allocator;
2019-12-07 22:45:12 +00:00
var stdout_file = std.io.getStdOut();
2020-04-10 19:48:10 +00:00
var stdout = stdout_file.outStream();
var args_it = std.process.args();
_ = args_it.next(allocator);
var filePath = try (args_it.next(allocator) orelse {
try runPrompt(allocator);
return;
});
try runFile(allocator, filePath);
2019-06-04 00:29:53 +00:00
}