summaryrefslogtreecommitdiffstats
path: root/cmd-paste-buffer.c
diff options
context:
space:
mode:
authorTiago Cunha <tcunha@gmx.com>2011-01-07 14:45:34 +0000
committerTiago Cunha <tcunha@gmx.com>2011-01-07 14:45:34 +0000
commit1df427bc7b1a458f4d3fe6f9255010708a8d8634 (patch)
tree6d47a72a426bb3e18146c682591d398607a8a211 /cmd-paste-buffer.c
parent219442cff707a1febb6a75ba2cfe48b02ae0a22e (diff)
Sync OpenBSD patchset 829:
Clean up and simplify tmux command argument parsing. Originally, tmux commands were parsed in the client process into a struct with the command data which was then serialised and sent to the server to be executed. The parsing was later moved into the server (an argv was sent from the client), but the parse step and intermediate struct was kept. This change removes that struct and the separate parse step. Argument parsing and printing is now common to all commands (in arguments.c) with each command left with just an optional check function (to validate the arguments at parse time), the exec function and a function to set up any key bindings (renamed from the old init function). This is overall more simple and consistent. There should be no changes to any commands behaviour or syntax although as this touches every command please watch for any unexpected changes.
Diffstat (limited to 'cmd-paste-buffer.c')
-rw-r--r--cmd-paste-buffer.c192
1 files changed, 45 insertions, 147 deletions
diff --git a/cmd-paste-buffer.c b/cmd-paste-buffer.c
index d23b3b90..bfc90049 100644
--- a/cmd-paste-buffer.c
+++ b/cmd-paste-buffer.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-paste-buffer.c,v 1.30 2010-12-30 22:39:49 tcunha Exp $ */
+/* $Id: cmd-paste-buffer.c,v 1.31 2011-01-07 14:45:34 tcunha Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -27,132 +27,73 @@
* Paste paste buffer if present.
*/
-struct cmd_paste_buffer_data {
- char *target;
- int buffer;
-
- int flag_delete;
- char *sepstr;
-};
-
-void cmd_paste_buffer_init(struct cmd *, int);
-int cmd_paste_buffer_parse(struct cmd *, int, char **, char **);
int cmd_paste_buffer_exec(struct cmd *, struct cmd_ctx *);
+
void cmd_paste_buffer_filter(
- struct window_pane *, const char *, size_t, char *);
-void cmd_paste_buffer_free(struct cmd *);
-size_t cmd_paste_buffer_print(struct cmd *, char *, size_t);
+ struct window_pane *, const char *, size_t, const char *);
const struct cmd_entry cmd_paste_buffer_entry = {
"paste-buffer", "pasteb",
+ "db:rs:t:", 0, 0,
"[-dr] [-s separator] [-b buffer-index] [-t target-pane]",
- 0, "",
- cmd_paste_buffer_init,
- cmd_paste_buffer_parse,
- cmd_paste_buffer_exec,
- cmd_paste_buffer_free,
- cmd_paste_buffer_print
+ 0,
+ NULL,
+ NULL,
+ cmd_paste_buffer_exec
};
-/* ARGSUSED */
-void
-cmd_paste_buffer_init(struct cmd *self, unused int arg)
-{
- struct cmd_paste_buffer_data *data;
-
- self->data = data = xmalloc(sizeof *data);
- data->target = NULL;
- data->buffer = -1;
- data->flag_delete = 0;
- data->sepstr = xstrdup("\r");
-}
-
-int
-cmd_paste_buffer_parse(struct cmd *self, int argc, char **argv, char **cause)
-{
- struct cmd_paste_buffer_data *data;
- int opt, n;
- const char *errstr;
-
- cmd_paste_buffer_init(self, 0);
- data = self->data;
-
- while ((opt = getopt(argc, argv, "b:ds:t:r")) != -1) {
- switch (opt) {
- case 'b':
- if (data->buffer == -1) {
- n = strtonum(optarg, 0, INT_MAX, &errstr);
- if (errstr != NULL) {
- xasprintf(cause, "buffer %s", errstr);
- goto error;
- }
- data->buffer = n;
- }
- break;
- case 'd':
- data->flag_delete = 1;
- break;
- case 's':
- if (data->sepstr != NULL)
- xfree(data->sepstr);
- data->sepstr = xstrdup(optarg);
- break;
- case 't':
- if (data->target == NULL)
- data->target = xstrdup(optarg);
- break;
- case 'r':
- if (data->sepstr != NULL)
- xfree(data->sepstr);
- data->sepstr = xstrdup("\n");
- break;
- default:
- goto usage;
- }
- }
- argc -= optind;
- argv += optind;
-
- return (0);
-
-usage:
- xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage);
-
-error:
- self->entry->free(self);
- return (-1);
-}
-
int
cmd_paste_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
{
- struct cmd_paste_buffer_data *data = self->data;
- struct window_pane *wp;
- struct session *s;
- struct paste_buffer *pb;
-
- if (cmd_find_pane(ctx, data->target, &s, &wp) == NULL)
+ struct args *args = self->args;
+ struct window_pane *wp;
+ struct session *s;
+ struct paste_buffer *pb;
+ const char *sepstr;
+ char *cause;
+ int buffer;
+
+ if (cmd_find_pane(ctx, args_get(args, 't'), &s, &wp) == NULL)
return (-1);
- if (data->buffer == -1)
+ if (!args_has(args, 'b'))
+ buffer = -1;
+ else {
+ buffer = args_strtonum(args, 'b', 0, INT_MAX, &cause);
+ if (cause != NULL) {
+ ctx->error(ctx, "buffer %s", cause);
+ xfree(cause);
+ return (-1);
+ }
+ }
+
+ if (buffer == -1)
pb = paste_get_top(&global_buffers);
else {
- pb = paste_get_index(&global_buffers, data->buffer);
+ pb = paste_get_index(&global_buffers, buffer);
if (pb == NULL) {
- ctx->error(ctx, "no buffer %d", data->buffer);
+ ctx->error(ctx, "no buffer %d", buffer);
return (-1);
}
}
- if (pb != NULL)
- cmd_paste_buffer_filter(wp, pb->data, pb->size, data->sepstr);
+ if (pb != NULL) {
+ sepstr = args_get(args, 's');
+ if (sepstr == NULL) {
+ if (args_has(args, 'r'))
+ sepstr = "\n";
+ else
+ sepstr = "\r";
+ }
+ cmd_paste_buffer_filter(wp, pb->data, pb->size, sepstr);
+ }
/* Delete the buffer if -d. */
- if (data->flag_delete) {
- if (data->buffer == -1)
+ if (args_has(args, 'd')) {
+ if (buffer == -1)
paste_free_top(&global_buffers);
else
- paste_free_index(&global_buffers, data->buffer);
+ paste_free_index(&global_buffers, buffer);
}
return (0);
@@ -161,7 +102,7 @@ cmd_paste_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
/* Add bytes to a buffer and filter '\n' according to separator. */
void
cmd_paste_buffer_filter(
- struct window_pane *wp, const char *data, size_t size, char *sep)
+ struct window_pane *wp, const char *data, size_t size, const char *sep)
{
const char *end = data + size;
const char *lf;
@@ -178,46 +119,3 @@ cmd_paste_buffer_filter(
if (end != data)
bufferevent_write(wp->event, data, end - data);
}
-
-void
-cmd_paste_buffer_free(struct cmd *self)
-{
- struct cmd_paste_buffer_data *data = self->data;
-
- if (data->target != NULL)
- xfree(data->target);
- if (data->sepstr != NULL)
- xfree(data->sepstr);
- xfree(data);
-}
-
-size_t
-cmd_paste_buffer_print(struct cmd *self, char *buf, size_t len)
-{
- struct cmd_paste_buffer_data *data = self->data;
- size_t off = 0;
- char tmp[BUFSIZ];
- int r_flag;
-
- r_flag = 0;
- if (data->sepstr != NULL)
- r_flag = (data->sepstr[0] == '\n' && data->sepstr[1] == '\0');
-
- off += xsnprintf(buf, len, "%s", self->entry->name);
- if (data == NULL)
- return (off);
- if (off < len && data->flag_delete)
- off += xsnprintf(buf + off, len - off, " -d");
- if (off < len && r_flag)
- off += xsnprintf(buf + off, len - off, " -r");
- if (off < len && data->buffer != -1)
- off += xsnprintf(buf + off, len - off, " -b %d", data->buffer);
- if (off < len && data->sepstr != NULL && !r_flag) {
- strnvis(
- tmp, data->sepstr, sizeof tmp, VIS_OCTAL|VIS_TAB|VIS_NL);
- off += cmd_prarg(buf + off, len - off, " -s ", tmp);
- }
- if (off < len && data->target != NULL)
- off += cmd_prarg(buf + off, len - off, " -t ", data->target);
- return (off);
-}