From 0bde08a141b8de9b9d9354b532a84333e02724dc Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Sun, 2 Jan 2022 09:29:45 +0200 Subject: Added Allocator to Editor.prompt & Editor.promptEx --- src/Buffer.zig | 7 +++---- src/Editor.zig | 15 ++++++++------- src/search.zig | 9 ++++++++- 3 files changed, 19 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/Buffer.zig b/src/Buffer.zig index 7f3043b..5bf319c 100644 --- a/src/Buffer.zig +++ b/src/Buffer.zig @@ -274,8 +274,8 @@ pub fn forwardChar(self: *Buffer) void { // TODO: Make use of the callback feature to go to the final line while typing in. pub fn goToLine(self: *Buffer, editor: *Editor) !void { - if (try editor.prompt("Goto line")) |line_str| { - defer editor.allocator.free(line_str); + if (try editor.prompt(self.allocator, "Goto line")) |line_str| { + defer self.allocator.free(line_str); const line = std.fmt.parseUnsigned(usize, line_str, 0) catch |err| { try editor.setStatusMessage("Couldn't parse '{s}' as an integer: {}", .{ line_str, err }); @@ -434,8 +434,7 @@ pub fn recenterTopBottom(self: *Buffer, screenrows: usize) void { pub fn save(self: *Buffer, editor: *Editor) !void { if (self.file_path == null) { - // TODO: Editor.prompt should take an Allocator - const fname = (try editor.prompt("Save as")) orelse { return; }; + const fname = (try editor.prompt(self.allocator, "Save as")) orelse { return; }; defer self.allocator.free(fname); const file_path = try es.files.resolvePath(self.allocator, fname); diff --git a/src/Editor.zig b/src/Editor.zig index 469fc81..d721600 100644 --- a/src/Editor.zig +++ b/src/Editor.zig @@ -188,7 +188,7 @@ pub fn open(self: *Editor, name: []const u8) !void { } pub fn openFile(self: *Editor) !void { - const fname_opt = try self.prompt("File name"); + const fname_opt = try self.prompt(self.allocator, "File name"); if (fname_opt) |fname| { defer self.allocator.free(fname); return self.open(fname); @@ -200,19 +200,20 @@ pub fn processKeypress(self: *Editor) !void { try self.current_state(self, self.buffer, key); } -pub fn prompt(self: *Editor, prompt_str: []const u8) !?[]u8 { - return self.promptEx(void, error{}, prompt_str, null, {}); +pub fn prompt(self: *Editor, allocator: Allocator, prompt_str: []const u8) !?[]u8 { + return self.promptEx(void, error{}, allocator, prompt_str, null, {}); } pub fn promptEx( self: *Editor, comptime CallbackData: type, comptime CallbackError: type, + allocator: Allocator, prompt_str: []const u8, callback: ?PromptCallback(CallbackData, CallbackError), cb_data: CallbackData, ) !?[]u8 { - var buf = ArrayList(u8).init(self.allocator); + var buf = ArrayList(u8).init(allocator); defer buf.deinit(); while (true) { @@ -262,7 +263,7 @@ pub fn promptYN(self: *Editor, prompt_str: []const u8) !bool { const full_prompt = try std.fmt.allocPrint(self.allocator, "{s} (Y/N)", .{prompt_str}); defer self.allocator.free(full_prompt); - var response = try self.prompt(full_prompt); + var response = try self.prompt(self.allocator, full_prompt); defer if (response) |str| self.allocator.free(str); // TODO: This can be improved while (response != null @@ -275,7 +276,7 @@ pub fn promptYN(self: *Editor, prompt_str: []const u8) !bool { ) ) { if (response) |str| self.allocator.free(str); - response = try self.prompt(full_prompt); + response = try self.prompt(self.allocator, full_prompt); } return response != null and (response.?[0] == 'y' or response.?[0] == 'Y'); @@ -361,7 +362,7 @@ pub fn setStatusMessage(self: *Editor, comptime fmt: []const u8, args: anytype) pub fn switchBuffer(self: *Editor) !void { // TODO: completion - const bufname_opt = try self.prompt("Switch to buffer"); + const bufname_opt = try self.prompt(self.allocator, "Switch to buffer"); if (bufname_opt) |bufname| { defer self.allocator.free(bufname); diff --git a/src/search.zig b/src/search.zig index 321f948..6c7dc6a 100644 --- a/src/search.zig +++ b/src/search.zig @@ -37,7 +37,14 @@ pub fn search(editor: *Editor, buffer: *Buffer) !void { data.allocator.free(saved_hl.data); }; - if (try editor.promptEx(*CallbackData, Error, "Search", searchCallback, &data)) |response| { + if (try editor.promptEx( + *CallbackData, + Error, + editor.allocator, + "Search", + searchCallback, + &data, + )) |response| { editor.allocator.free(response); } else { // Cancelled -- cgit v1.2.3