topiku/src/prompt.zig

46 lines
937 B
Zig

const ceditline = @cImport({
@cInclude("stdio.h");
@cInclude("editline.h");
});
const std = @import("std");
const io = std.io;
const __sighandler = ?fn (c_int) callconv(.C) void;
extern fn signal(sig: c_int, handler: __sighandler) __sighandler;
var line_num: usize = 0;
pub const Line = struct {
content: []u8,
num: usize,
};
pub fn readline(prompt: []const u8) ?Line {
var line = ceditline.readline(@as([*c]const u8, prompt.ptr));
if (line == 0) {
std.c.free(line);
return null;
}
line_num += 1;
return Line{ .content = std.mem.sliceTo(line, 0), .num = line_num };
}
pub fn free(line: Line) void {
std.c.free(line.content.ptr);
}
pub fn init() void {
ceditline.rl_initialize();
_ = signal(std.os.SIG.INT, exit);
line_num = 0;
}
fn exit(_: c_int) callconv(.C) void {
deinit();
std.os.exit(0);
}
pub fn deinit() void {
ceditline.rl_uninitialize();
}