46 lines
937 B
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();
|
|
}
|