Cleaner freeing of input line, proper SIGINT handling
This commit is contained in:
parent
782e1a2ca3
commit
e83052f06d
|
@ -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});
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue