aboutsummaryrefslogtreecommitdiff
path: root/vis.c
diff options
context:
space:
mode:
authorRandy Palamar <randy@rnpnr.xyz>2025-12-01 22:08:13 -0700
committerRandy Palamar <randy@rnpnr.xyz>2025-12-16 11:28:44 -0700
commit65dd46e0bba74948c824370a06e509cba462cd72 (patch)
treeb6055982318341cffa5d357b8e252f4a3661da6c /vis.c
parenta98a1850640ca709ed68df3ca57f0404bbc4d3fc (diff)
downloadvis-65dd46e0bba74948c824370a06e509cba462cd72.tar.gz
vis-65dd46e0bba74948c824370a06e509cba462cd72.tar.xz
main: make vis instance into a global
This might be controversial to some but for the purposes of the editor there will never be more than one instance of vis. This allows the compiler to use more efficient rip relative addressing in the places where it knows the code is referring to the global instance. Once the code is compiling in a single translation unit with all functions declared static this will allow for much better optimization. From the perspective that vis is meant to be a library, which is what Marc clearly intended, changing vis_new() to vis_init() and vis_free() to vis_cleanup() is still better design. The library user should be allowed to place the vis instance wherever they want in memory.
Diffstat (limited to 'vis.c')
-rw-r--r--vis.c22
1 files changed, 9 insertions, 13 deletions
diff --git a/vis.c b/vis.c
index 08ee6b2..30d88b0 100644
--- a/vis.c
+++ b/vis.c
@@ -564,15 +564,11 @@ void vis_window_close(Win *win) {
vis_draw(vis);
}
-Vis *vis_new(void) {
- Vis *vis = calloc(1, sizeof(Vis));
- if (!vis)
- return NULL;
+bool vis_init(Vis *vis)
+{
vis->exit_status = -1;
- if (!ui_terminal_init(&vis->ui)) {
- free(vis);
- return NULL;
- }
+ if (!ui_terminal_init(&vis->ui))
+ return false;
ui_init(&vis->ui, vis);
vis->change_colors = true;
for (size_t i = 0; i < LENGTH(vis->registers); i++)
@@ -611,13 +607,14 @@ Vis *vis_new(void) {
vis->mode_prev = vis->mode = &vis_modes[VIS_MODE_NORMAL];
vis_modes[VIS_MODE_INSERT].input = vis_event_mode_insert_input;
vis_modes[VIS_MODE_REPLACE].input = vis_event_mode_replace_input;
- return vis;
+ return true;
err:
- vis_free(vis);
- return NULL;
+ vis_cleanup(vis);
+ return false;
}
-void vis_free(Vis *vis) {
+void vis_cleanup(Vis *vis)
+{
if (!vis)
return;
while (vis->windows)
@@ -656,7 +653,6 @@ void vis_free(Vis *vis) {
vis_action_free(vis, array_get_ptr(&vis->actions_user, 0));
array_release(&vis->actions_user);
free(vis->shell);
- free(vis);
}
void vis_insert(Vis *vis, size_t pos, const char *data, size_t len) {