/..

#CONTENT

#TOP

term.zig
RS
const std = @import("std");
const mem = std.mem;
const fmt = std.fmt;
const serial = @import("serial.zig");
const Writer = std.io.Writer;
const Allocator = mem.Allocator;

pub const writer = Writer(void, error{}, writeFn){ .context = {} };

fn writeFn(_: void, string: []const u8) error{}!usize {
    serial.send(string);
    return string.len;
}

pub fn printf(comptime format: []const u8, args: anytype) void {
    writer.print(format, args) catch unreachable;
}

var recent: ?u8 = null;
var do_echo = true;

pub fn init() void {}

pub fn flush() void {
    recent = null;
}

pub fn echo(state: bool) void {
    do_echo = state;
}

pub fn getchar() u8 {
    if (recent) |ch| {
        defer recent = null;
        return ch;
    }
    var ch = serial.getchar();
    if (do_echo) {
        switch (ch) {
            '\n', '\r' => {
                serial.send("\r\n");
            },
            else => serial.putchar(ch),
        }
    }
    return ch;
}

pub fn putback(ch: u8) void {
    recent = ch;
}

pub fn peek() u8 {
    if (recent) |ch| {
        return ch;
    }
    recent = serial.getchar();
    return recent.?;
}