summaryrefslogtreecommitdiff
path: root/src/main.zig
blob: 6095e81e1a5ae1f6eb5ffc90e7bcf7363edac374 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
const std = @import("std");
const tok = @import("tokenizer.zig");

pub fn main() !void {
    const inneralloc = std.heap.smp_allocator;
    var arena = std.heap.ArenaAllocator.init(inneralloc);
    defer arena.deinit();
    const alloc = arena.allocator();

    var outbuff: [64]u8 = undefined;
    var inbuff: [64]u8 = undefined;
    var stdout_writer = std.fs.File.stdout().writer(&outbuff);
    var stdin_reader = std.fs.File.stdin().reader(&inbuff);
    const stdout = &stdout_writer.interface;
    const stdin = &stdin_reader.interface;

    var sb = try std.ArrayList(u8).initCapacity(alloc, 1024);
    defer sb.deinit(alloc);

    var line = std.io.Writer.Allocating.init(alloc);
    defer line.deinit();

    while (true) {
        _ = stdin.streamDelimiter(&line.writer, '\n') catch |err| {
            if (err == error.EndOfStream) break else return err;
        };
        try sb.appendSlice(alloc, line.written());
        try sb.appendSlice(alloc, try stdin.take(1));
        line.clearRetainingCapacity();
    }
    if (line.written().len > 0) try sb.appendSlice(alloc, line.written());

    std.debug.print("INPUT\n==========\n{s}\n==========\n", .{sb.items});

    const tokens = try tok.tokenize(alloc, sb.items);
    std.debug.print("{any}\n", .{tokens});
    for (tokens) |t|
        try stdout.print("{s}\n", .{ try t.print(alloc) });
    try stdout.flush();
}