Skip to content

Commit

Permalink
remove duplicated read_buffer functions
Browse files Browse the repository at this point in the history
When you take a pointer to a function in C that function is going
to appear in full in the final binary. This means that there were
3 sections of the final binary with the exact same code.

You could argue that in very high performance programs having that
function closer to the current instruction when it is needed will
give a performance boost but there are so many other places to
gain more significant speed ups in vis before that would be
remotely relevant.

In fact, removing these allows the buffer_append call to inlined
so that buffer_insert can be hopped to directly instead of
including a useless hop in the middle.
  • Loading branch information
rnpnr committed Jan 5, 2025
1 parent 6d362f2 commit 1e52d33
Show file tree
Hide file tree
Showing 6 changed files with 17 additions and 22 deletions.
5 changes: 5 additions & 0 deletions buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,3 +182,8 @@ char *buffer_move(Buffer *buf) {
buffer_init(buf);
return data;
}

ssize_t read_into_buffer(void *context, char *data, size_t len) {
buffer_append(context, data, len);
return len;
}
3 changes: 3 additions & 0 deletions buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,4 +80,7 @@ const char *buffer_content(Buffer*);
*/
char *buffer_move(Buffer*);

/** ``read(3p)`` like interface for reading into a Buffer (``context``) */
ssize_t read_into_buffer(void *context, char *data, size_t len);

#endif
11 changes: 4 additions & 7 deletions sam.c
Original file line number Diff line number Diff line change
Expand Up @@ -1743,11 +1743,6 @@ static bool cmd_write(Vis *vis, Win *win, Command *cmd, const char *argv[], Sele
return true;
}

static ssize_t read_buffer(void *context, char *data, size_t len) {
buffer_append(context, data, len);
return len;
}

static bool cmd_filter(Vis *vis, Win *win, Command *cmd, const char *argv[], Selection *sel, Filerange *range) {
if (!win)
return false;
Expand All @@ -1756,7 +1751,8 @@ static bool cmd_filter(Vis *vis, Win *win, Command *cmd, const char *argv[], Sel
buffer_init(&bufout);
buffer_init(&buferr);

int status = vis_pipe(vis, win->file, range, &argv[1], &bufout, read_buffer, &buferr, read_buffer, false);
int status = vis_pipe(vis, win->file, range, &argv[1], &bufout, read_into_buffer, &buferr,
read_into_buffer, false);

if (vis->interrupted) {
vis_info_show(vis, "Command cancelled");
Expand Down Expand Up @@ -1796,7 +1792,8 @@ static bool cmd_pipeout(Vis *vis, Win *win, Command *cmd, const char *argv[], Se
Buffer buferr;
buffer_init(&buferr);

int status = vis_pipe(vis, win->file, range, (const char*[]){ argv[1], NULL }, NULL, NULL, &buferr, read_buffer, false);
int status = vis_pipe(vis, win->file, range, (const char*[]){ argv[1], NULL }, NULL, NULL,
&buferr, read_into_buffer, false);

if (vis->interrupted)
vis_info_show(vis, "Command cancelled");
Expand Down
2 changes: 1 addition & 1 deletion vis-cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ static const char *file_open_dialog(Vis *vis, const char *pattern) {
Filerange empty = text_range_new(0,0);
int status = vis_pipe(vis, vis->win->file, &empty,
(const char*[]){ buffer_content0(&bufcmd), NULL },
&bufout, read_buffer, &buferr, read_buffer, false);
&bufout, read_into_buffer, &buferr, read_into_buffer, false);

if (status == 0)
strncpy(name, buffer_content0(&bufout), sizeof(name)-1);
Expand Down
9 changes: 2 additions & 7 deletions vis-registers.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,6 @@ static Buffer *register_buffer(Register *reg, size_t slot) {
return array_get(&reg->values, slot);
}

static ssize_t read_buffer(void *context, char *data, size_t len) {
buffer_append(context, data, len);
return len;
}

bool register_init(Register *reg) {
Buffer buf;
buffer_init(&buf);
Expand Down Expand Up @@ -83,7 +78,7 @@ const char *register_slot_get(Vis *vis, Register *reg, size_t slot, size_t *len)
cmd[3] = "clipboard";
int status = vis_pipe(vis, vis->win->file,
&(Filerange){ .start = 0, .end = 0 },
cmd, buf, read_buffer, &buferr, read_buffer, false);
cmd, buf, read_into_buffer, &buferr, read_into_buffer, false);

if (status != 0)
vis_info_show(vis, "Command failed %s", buffer_content0(&buferr));
Expand Down Expand Up @@ -167,7 +162,7 @@ bool register_slot_put_range(Vis *vis, Register *reg, size_t slot, Text *txt, Fi
cmd[3] = "clipboard";

int status = vis_pipe(vis, vis->win->file, range,
cmd, NULL, NULL, &buferr, read_buffer, false);
cmd, NULL, NULL, &buferr, read_into_buffer, false);

if (status != 0)
vis_info_show(vis, "Command failed %s", buffer_content0(&buferr));
Expand Down
9 changes: 2 additions & 7 deletions vis.c
Original file line number Diff line number Diff line change
Expand Up @@ -1854,18 +1854,13 @@ int vis_pipe_buf(Vis *vis, const char* buf, const char *argv[],
return _vis_pipe(vis, NULL, NULL, buf, argv, stdout_context, read_stdout, stderr_context, read_stderr, fullscreen);
}

static ssize_t read_buffer(void *context, char *data, size_t len) {
buffer_append(context, data, len);
return len;
}

static int _vis_pipe_collect(Vis *vis, File *file, Filerange *range, const char* buf, const char *argv[], char **out, char **err, bool fullscreen) {
Buffer bufout, buferr;
buffer_init(&bufout);
buffer_init(&buferr);
int status = _vis_pipe(vis, file, range, buf, argv,
&bufout, out ? read_buffer : NULL,
&buferr, err ? read_buffer : NULL,
&bufout, out ? read_into_buffer : NULL,
&buferr, err ? read_into_buffer : NULL,
fullscreen);
buffer_terminate(&bufout);
buffer_terminate(&buferr);
Expand Down

0 comments on commit 1e52d33

Please sign in to comment.