use crate::*;
pub static CMD_SET_BUFFER_ENTRY: cmd_entry = cmd_entry {
name: "set-buffer",
alias: Some("setb"),
args: args_parse::new("ab:t:n:w", 0, 1, None),
usage: "[-aw] [-b buffer-name] [-n new-buffer-name] [-t target-client] data",
flags: cmd_flag::CMD_AFTERHOOK
.union(cmd_flag::CMD_CLIENT_TFLAG)
.union(cmd_flag::CMD_CLIENT_CANFAIL),
exec: cmd_set_buffer_exec,
source: cmd_entry_flag::zeroed(),
target: cmd_entry_flag::zeroed(),
};
pub static CMD_DELETE_BUFFER_ENTRY: cmd_entry = cmd_entry {
name: "delete-buffer",
alias: Some("deleteb"),
args: args_parse::new("b:", 0, 0, None),
usage: "[-b buffer-name]",
flags: cmd_flag::CMD_AFTERHOOK,
exec: cmd_set_buffer_exec,
source: cmd_entry_flag::zeroed(),
target: cmd_entry_flag::zeroed(),
};
unsafe fn cmd_set_buffer_exec(self_: *mut cmd, item: *mut cmdq_item) -> cmd_retval {
unsafe {
let args = cmd_get_args(self_);
let tc = cmdq_get_target_client(item);
let mut pb;
let mut cause = null_mut();
let olddata;
let mut bufname = cstr_to_str_(args_get_(args, 'b'));
if bufname.is_none() {
pb = null_mut();
} else {
pb = paste_get_name(bufname);
}
if std::ptr::eq(cmd_get_entry(self_), &CMD_DELETE_BUFFER_ENTRY) {
if pb.is_null() {
if let Some(bufname) = bufname {
cmdq_error!(item, "unknown buffer: {}", bufname);
return cmd_retval::CMD_RETURN_ERROR;
}
pb = paste_get_top(&raw mut bufname);
}
if pb.is_null() {
cmdq_error!(item, "no buffer");
return cmd_retval::CMD_RETURN_ERROR;
}
paste_free(NonNull::new_unchecked(pb));
return cmd_retval::CMD_RETURN_NORMAL;
}
if args_has(args, 'n') {
if pb.is_null() {
if let Some(bufname) = bufname {
cmdq_error!(item, "unknown buffer: {}", bufname);
return cmd_retval::CMD_RETURN_ERROR;
}
pb = paste_get_top(&raw mut bufname);
}
if pb.is_null() {
cmdq_error!(item, "no buffer");
return cmd_retval::CMD_RETURN_ERROR;
}
if paste_rename(bufname, cstr_to_str_(args_get_(args, 'n')), &raw mut cause) != 0 {
cmdq_error!(item, "{}", _s(cause));
free_(cause);
return cmd_retval::CMD_RETURN_ERROR;
}
return cmd_retval::CMD_RETURN_NORMAL;
}
if args_count(args) != 1 {
cmdq_error!(item, "no data specified");
return cmd_retval::CMD_RETURN_ERROR;
}
let newsize = strlen(args_string(args, 0));
if newsize == 0 {
return cmd_retval::CMD_RETURN_NORMAL;
}
let mut bufsize = 0;
let mut bufdata = null_mut();
if let Some(pb_non_null) = NonNull::new(pb)
&& args_has(args, 'a')
{
olddata = paste_buffer_data_(pb_non_null, &mut bufsize);
bufdata = xmalloc(bufsize).as_ptr().cast();
memcpy_(bufdata, olddata, bufsize);
}
bufdata = xrealloc_(bufdata, bufsize + newsize).as_ptr();
memcpy_(bufdata.add(bufsize), args_string(args, 0), newsize);
bufsize += newsize;
if paste_set(bufdata, bufsize, bufname, &raw mut cause) != 0 {
cmdq_error!(item, "{}", _s(cause));
free_(bufdata);
free_(cause);
return cmd_retval::CMD_RETURN_ERROR;
}
if args_has(args, 'w') && !tc.is_null() {
tty_set_selection(&raw mut (*tc).tty, c!(""), bufdata, bufsize);
}
cmd_retval::CMD_RETURN_NORMAL
}
}