diff options
Diffstat (limited to 'cmd-capture-pane.c')
-rw-r--r-- | cmd-capture-pane.c | 133 |
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); } |