Cleaner freeing of input line, proper SIGINT handling

This commit is contained in:
Der Teufel 2021-12-30 21:03:08 +01:00
parent 782e1a2ca3
commit e83052f06d
2 changed files with 17 additions and 4 deletions

View file

@ -11,7 +11,7 @@ pub fn main() anyerror!void {
while (true) { while (true) {
var input = prompt.readline("topiku> ") orelse break; var input = prompt.readline("topiku> ") orelse break;
defer std.c.free(&input); defer prompt.free(input);
try stdout.print(">>> {s}\n", .{input}); try stdout.print(">>> {s}\n", .{input});
} }

View file

@ -5,8 +5,11 @@ const ceditline = @cImport({
const std = @import("std"); const std = @import("std");
const io = std.io; const io = std.io;
pub fn readline(prompt: [*c]const u8) ?[]u8 { const __sighandler = ?fn (c_int) callconv(.C) void;
var line = ceditline.readline(@as([*c]const u8, prompt)); extern fn signal(sig: c_int, handler: __sighandler) __sighandler;
pub fn readline(prompt: []const u8) ?[]u8 {
var line = ceditline.readline(@as([*c]const u8, prompt.ptr));
if (line == 0) { if (line == 0) {
std.c.free(line); std.c.free(line);
return null; return null;
@ -14,8 +17,18 @@ pub fn readline(prompt: [*c]const u8) ?[]u8 {
return std.mem.sliceTo(line, 0); return std.mem.sliceTo(line, 0);
} }
pub fn free(slice: []u8) void {
std.c.free(slice.ptr);
}
pub fn init() void { pub fn init() void {
ceditline.rl_initialize(); ceditline.rl_initialize();
_ = signal(std.os.SIG.INT, exit);
}
fn exit(_ : c_int) callconv(.C) void {
deinit();
std.os.exit(0);
} }
pub fn deinit() void { pub fn deinit() void {