Annotation of embedaddon/tmux/cmd-paste-buffer.c, revision 1.1
1.1 ! misho 1: /* $OpenBSD$ */
! 2:
! 3: /*
! 4: * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
! 5: *
! 6: * Permission to use, copy, modify, and distribute this software for any
! 7: * purpose with or without fee is hereby granted, provided that the above
! 8: * copyright notice and this permission notice appear in all copies.
! 9: *
! 10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
! 11: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 12: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
! 13: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 14: * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
! 15: * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
! 16: * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 17: */
! 18:
! 19: #include <sys/types.h>
! 20:
! 21: #include <stdlib.h>
! 22: #include <string.h>
! 23:
! 24: #include "tmux.h"
! 25:
! 26: /*
! 27: * Paste paste buffer if present.
! 28: */
! 29:
! 30: static enum cmd_retval cmd_paste_buffer_exec(struct cmd *, struct cmdq_item *);
! 31:
! 32: const struct cmd_entry cmd_paste_buffer_entry = {
! 33: .name = "paste-buffer",
! 34: .alias = "pasteb",
! 35:
! 36: .args = { "db:prs:t:", 0, 0 },
! 37: .usage = "[-dpr] [-s separator] " CMD_BUFFER_USAGE " "
! 38: CMD_TARGET_PANE_USAGE,
! 39:
! 40: .tflag = CMD_PANE,
! 41:
! 42: .flags = CMD_AFTERHOOK,
! 43: .exec = cmd_paste_buffer_exec
! 44: };
! 45:
! 46: static enum cmd_retval
! 47: cmd_paste_buffer_exec(struct cmd *self, struct cmdq_item *item)
! 48: {
! 49: struct args *args = self->args;
! 50: struct window_pane *wp = item->state.tflag.wp;
! 51: struct paste_buffer *pb;
! 52: const char *sepstr, *bufname, *bufdata, *bufend, *line;
! 53: size_t seplen, bufsize;
! 54: int bracket = args_has(args, 'p');
! 55:
! 56: bufname = NULL;
! 57: if (args_has(args, 'b'))
! 58: bufname = args_get(args, 'b');
! 59:
! 60: if (bufname == NULL)
! 61: pb = paste_get_top(NULL);
! 62: else {
! 63: pb = paste_get_name(bufname);
! 64: if (pb == NULL) {
! 65: cmdq_error(item, "no buffer %s", bufname);
! 66: return (CMD_RETURN_ERROR);
! 67: }
! 68: }
! 69:
! 70: if (pb != NULL && ~wp->flags & PANE_INPUTOFF) {
! 71: sepstr = args_get(args, 's');
! 72: if (sepstr == NULL) {
! 73: if (args_has(args, 'r'))
! 74: sepstr = "\n";
! 75: else
! 76: sepstr = "\r";
! 77: }
! 78: seplen = strlen(sepstr);
! 79:
! 80: if (bracket && (wp->screen->mode & MODE_BRACKETPASTE))
! 81: bufferevent_write(wp->event, "\033[200~", 6);
! 82:
! 83: bufdata = paste_buffer_data(pb, &bufsize);
! 84: bufend = bufdata + bufsize;
! 85:
! 86: for (;;) {
! 87: line = memchr(bufdata, '\n', bufend - bufdata);
! 88: if (line == NULL)
! 89: break;
! 90:
! 91: bufferevent_write(wp->event, bufdata, line - bufdata);
! 92: bufferevent_write(wp->event, sepstr, seplen);
! 93:
! 94: bufdata = line + 1;
! 95: }
! 96: if (bufdata != bufend)
! 97: bufferevent_write(wp->event, bufdata, bufend - bufdata);
! 98:
! 99: if (bracket && (wp->screen->mode & MODE_BRACKETPASTE))
! 100: bufferevent_write(wp->event, "\033[201~", 6);
! 101: }
! 102:
! 103: if (pb != NULL && args_has(args, 'd'))
! 104: paste_free(pb);
! 105:
! 106: return (CMD_RETURN_NORMAL);
! 107: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>