aboutsummaryrefslogtreecommitdiff
path: root/cmd-capture-pane.c
diff options
context:
space:
mode:
Diffstat (limited to 'cmd-capture-pane.c')
-rw-r--r--cmd-capture-pane.c133
1 files changed, 27 insertions, 106 deletions
diff --git a/cmd-capture-pane.c b/cmd-capture-pane.c
index c711db42..6efbfe97 100644
--- a/cmd-capture-pane.c
+++ b/cmd-capture-pane.c
@@ -27,93 +27,30 @@
* Write the entire contents of a pane to a buffer.
*/
-int cmd_capture_pane_parse(struct cmd *, int, char **, char **);
int cmd_capture_pane_exec(struct cmd *, struct cmd_ctx *);
-void cmd_capture_pane_free(struct cmd *);
-void cmd_capture_pane_init(struct cmd *, int);
-size_t cmd_capture_pane_print(struct cmd *, char *, size_t);
-
-struct cmd_capture_pane_data {
- char *target;
- int buffer;
-};
const struct cmd_entry cmd_capture_pane_entry = {
"capture-pane", "capturep",
+ "b:t:", 0, 0,
"[-b buffer-index] [-t target-pane]",
- 0, "",
- cmd_capture_pane_init,
- cmd_capture_pane_parse,
- cmd_capture_pane_exec,
- cmd_capture_pane_free,
- cmd_capture_pane_print
+ 0,
+ NULL,
+ NULL,
+ cmd_capture_pane_exec
};
-/* ARGSUSED */
-void
-cmd_capture_pane_init(struct cmd *self, unused int arg)
-{
- struct cmd_capture_pane_data *data;
-
- self->data = data = xmalloc(sizeof *data);
- data->buffer = -1;
- data->target = NULL;
-}
-
-int
-cmd_capture_pane_parse(struct cmd *self, int argc, char **argv, char **cause)
-{
- struct cmd_capture_pane_data *data;
- const char *errstr;
- int n, opt;
-
- self->entry->init(self, KEYC_NONE);
- data = self->data;
-
- while ((opt = getopt(argc, argv, "b:t:")) != -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 't':
- if (data->target == NULL)
- data->target = xstrdup(optarg);
- 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_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
{
- struct cmd_capture_pane_data *data = self->data;
- struct window_pane *wp;
- char *buf, *line;
- struct screen *s;
- u_int i, limit;
- size_t len, linelen;
-
- if (cmd_find_pane(ctx, data->target, NULL, &wp) == NULL)
+ struct args *args = self->args;
+ struct window_pane *wp;
+ char *buf, *line, *cause;
+ struct screen *s;
+ int buffer;
+ u_int i, limit;
+ size_t len, linelen;
+
+ if (cmd_find_pane(ctx, args_get(args, 't'), NULL, &wp) == NULL)
return (-1);
s = &wp->base;
@@ -133,40 +70,24 @@ cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
}
limit = options_get_number(&global_options, "buffer-limit");
- if (data->buffer == -1) {
+
+ if (!args_has(args, 'b')) {
paste_add(&global_buffers, buf, len, limit);
return (0);
}
- if (paste_replace(&global_buffers, data->buffer, buf, len) != 0) {
- ctx->error(ctx, "no buffer %d", data->buffer);
- xfree(buf);
+
+ buffer = args_strtonum(args, 'b', 0, INT_MAX, &cause);
+ if (cause != NULL) {
+ ctx->error(ctx, "buffer %s", cause);
+ xfree(cause);
return (-1);
}
- return (0);
-}
-
-void
-cmd_capture_pane_free(struct cmd *self)
-{
- struct cmd_capture_pane_data *data = self->data;
- if (data->target != NULL)
- xfree(data->target);
- xfree(data);
-}
+ if (paste_replace(&global_buffers, buffer, buf, len) != 0) {
+ ctx->error(ctx, "no buffer %d", buffer);
+ xfree(buf);
+ return (-1);
+ }
-size_t
-cmd_capture_pane_print(struct cmd *self, char *buf, size_t len)
-{
- struct cmd_capture_pane_data *data = self->data;
- size_t off = 0;
-
- off += xsnprintf(buf, len, "%s", self->entry->name);
- if (data == NULL)
- return (off);
- if (off < len && data->buffer != -1)
- off += xsnprintf(buf + off, len - off, " -b %d", data->buffer);
- if (off < len && data->target != NULL)
- off += xsnprintf(buf + off, len - off, " -t %s", data->target);
- return (off);
+ return (0);
}