Merge branch 'obsd-master'

pull/221/head
Thomas Adam 2015-11-27 15:41:28 +00:00
commit 9fe8b28746
6 changed files with 81 additions and 86 deletions

View File

@ -127,77 +127,73 @@ args_free(struct args *args)
free(args); free(args);
} }
/* Print a set of arguments. */ /* Add to string. */
size_t static void printflike(3, 4)
args_print(struct args *args, char *buf, size_t len) args_print_add(char **buf, size_t *len, const char *fmt, ...)
{ {
size_t off, used; va_list ap;
char *s;
size_t slen;
va_start(ap, fmt);
slen = xvasprintf(&s, fmt, ap);
va_end(ap);
*len += slen;
*buf = xrealloc(*buf, *len);
strlcat(*buf, s, *len);
free(s);
}
/* Print a set of arguments. */
char *
args_print(struct args *args)
{
size_t len;
char *buf;
int i; int i;
const char *quotes;
struct args_entry *entry; struct args_entry *entry;
/* There must be at least one byte at the start. */ len = 1;
if (len == 0) buf = xcalloc(1, len);
return (0);
off = 0;
/* Process the flags first. */ /* Process the flags first. */
buf[off++] = '-';
RB_FOREACH(entry, args_tree, &args->tree) { RB_FOREACH(entry, args_tree, &args->tree) {
if (entry->value != NULL) if (entry->value != NULL)
continue; continue;
if (off == len - 1) { if (*buf == '\0')
buf[off] = '\0'; args_print_add(&buf, &len, "-");
return (len); args_print_add(&buf, &len, "%c", entry->flag);
}
buf[off++] = entry->flag;
buf[off] = '\0';
} }
if (off == 1)
buf[--off] = '\0';
/* Then the flags with arguments. */ /* Then the flags with arguments. */
RB_FOREACH(entry, args_tree, &args->tree) { RB_FOREACH(entry, args_tree, &args->tree) {
if (entry->value == NULL) if (entry->value == NULL)
continue; continue;
if (off >= len) { if (*buf != '\0')
/* snprintf will have zero terminated. */ args_print_add(&buf, &len, " -%c ", entry->flag);
return (len);
}
if (strchr(entry->value, ' ') != NULL)
quotes = "\"";
else else
quotes = ""; args_print_add(&buf, &len, "-%c ", entry->flag);
used = xsnprintf(buf + off, len - off, "%s-%c %s%s%s", if (strchr(entry->value, ' ') != NULL)
off != 0 ? " " : "", entry->flag, quotes, entry->value, args_print_add(&buf, &len, "\"%s\"", entry->value);
quotes); else
if (used > len - off) args_print_add(&buf, &len, "%s", entry->value);
used = len - off;
off += used;
} }
/* And finally the argument vector. */ /* And finally the argument vector. */
for (i = 0; i < args->argc; i++) { for (i = 0; i < args->argc; i++) {
if (off >= len) { if (*buf != '\0')
/* snprintf will have zero terminated. */ args_print_add(&buf, &len, " ");
return (len);
}
if (strchr(args->argv[i], ' ') != NULL) if (strchr(args->argv[i], ' ') != NULL)
quotes = "\""; args_print_add(&buf, &len, "\"%s\"", args->argv[i]);
else else
quotes = ""; args_print_add(&buf, &len, "%s", args->argv[i]);
used = xsnprintf(buf + off, len - off, "%s%s%s%s",
off != 0 ? " " : "", quotes, args->argv[i], quotes);
if (used > len - off)
used = len - off;
off += used;
} }
return (off); return (buf);
} }
/* Return if an argument is present. */ /* Return if an argument is present. */

View File

@ -56,7 +56,6 @@ cmd_list_keys_exec(struct cmd *self, struct cmd_q *cmdq)
struct key_binding *bd; struct key_binding *bd;
const char *key, *tablename, *r; const char *key, *tablename, *r;
char *cp, tmp[BUFSIZ]; char *cp, tmp[BUFSIZ];
size_t used;
int repeat, width, tablewidth, keywidth; int repeat, width, tablewidth, keywidth;
if (self->entry == &cmd_list_commands_entry) if (self->entry == &cmd_list_commands_entry)
@ -115,11 +114,9 @@ cmd_list_keys_exec(struct cmd *self, struct cmd_q *cmdq)
strlcat(tmp, " ", sizeof tmp); strlcat(tmp, " ", sizeof tmp);
free(cp); free(cp);
used = strlen(tmp); cp = cmd_list_print(bd->cmdlist);
if (used < (sizeof tmp) - 1) { strlcat(tmp, cp, sizeof tmp);
cmd_list_print(bd->cmdlist, tmp + used, free(cp);
(sizeof tmp) - used);
}
cmdq_print(cmdq, "bind-key %s", tmp); cmdq_print(cmdq, "bind-key %s", tmp);
} }

View File

@ -99,25 +99,28 @@ cmd_list_free(struct cmd_list *cmdlist)
free(cmdlist); free(cmdlist);
} }
size_t char *
cmd_list_print(struct cmd_list *cmdlist, char *buf, size_t len) cmd_list_print(struct cmd_list *cmdlist)
{ {
struct cmd *cmd; struct cmd *cmd;
size_t off, used; char *buf, *this;
size_t len;
len = 1;
buf = xcalloc(1, len);
off = 0;
TAILQ_FOREACH(cmd, &cmdlist->list, qentry) { TAILQ_FOREACH(cmd, &cmdlist->list, qentry) {
if (off >= len) this = cmd_print(cmd);
break;
off += cmd_print(cmd, buf + off, len - off); len += strlen(this) + 3;
if (off >= len) buf = xrealloc(buf, len);
break;
if (TAILQ_NEXT(cmd, qentry) != NULL) { strlcat(buf, this, len);
used = xsnprintf(buf + off, len - off, " ; "); if (TAILQ_NEXT(cmd, qentry) != NULL)
if (used > len - off) strlcat(buf, " ; ", len);
used = len - off;
off += used; free(this);
}
} }
return (off);
return (buf);
} }

View File

@ -184,11 +184,12 @@ cmdq_continue_one(struct cmd_q *cmdq)
{ {
struct cmd *cmd = cmdq->cmd; struct cmd *cmd = cmdq->cmd;
enum cmd_retval retval; enum cmd_retval retval;
char tmp[1024]; char *s;
int flags = !!(cmd->flags & CMD_CONTROL); int flags = !!(cmd->flags & CMD_CONTROL);
cmd_print(cmd, tmp, sizeof tmp); s = cmd_print(cmd);
log_debug("cmdq %p: %s", cmdq, tmp); log_debug("cmdq %p: %s", cmdq, s);
free(s);
cmdq->time = time(NULL); cmdq->time = time(NULL);
cmdq->number++; cmdq->number++;

24
cmd.c
View File

@ -383,21 +383,19 @@ usage:
return (NULL); return (NULL);
} }
size_t char *
cmd_print(struct cmd *cmd, char *buf, size_t len) cmd_print(struct cmd *cmd)
{ {
size_t off, used; char *out, *s;
off = xsnprintf(buf, len, "%s ", cmd->entry->name); s = args_print(cmd->args);
if (off + 1 < len) { if (*s != '\0')
used = args_print(cmd->args, buf + off, len - off - 1); xasprintf(&out, "%s %s", cmd->entry->name, s);
if (used == 0) else
off--; out = xstrdup(cmd->entry->name);
else free(s);
off += used;
buf[off] = '\0'; return (out);
}
return (off);
} }
/* Adjust current mouse position for a pane. */ /* Adjust current mouse position for a pane. */

6
tmux.h
View File

@ -1667,7 +1667,7 @@ RB_PROTOTYPE(args_tree, args_entry, entry, args_cmp);
struct args *args_create(int, ...); struct args *args_create(int, ...);
struct args *args_parse(const char *, int, char **); struct args *args_parse(const char *, int, char **);
void args_free(struct args *); void args_free(struct args *);
size_t args_print(struct args *, char *, size_t); char *args_print(struct args *);
int args_has(struct args *, u_char); int args_has(struct args *, u_char);
void args_set(struct args *, u_char, const char *); void args_set(struct args *, u_char, const char *);
const char *args_get(struct args *, u_char); const char *args_get(struct args *, u_char);
@ -1696,7 +1696,7 @@ char **cmd_copy_argv(int, char **);
void cmd_free_argv(int, char **); void cmd_free_argv(int, char **);
char *cmd_stringify_argv(int, char **); char *cmd_stringify_argv(int, char **);
struct cmd *cmd_parse(int, char **, const char *, u_int, char **); struct cmd *cmd_parse(int, char **, const char *, u_int, char **);
size_t cmd_print(struct cmd *, char *, size_t); char *cmd_print(struct cmd *);
int cmd_mouse_at(struct window_pane *, struct mouse_event *, int cmd_mouse_at(struct window_pane *, struct mouse_event *,
u_int *, u_int *, int); u_int *, u_int *, int);
struct winlink *cmd_mouse_window(struct mouse_event *, struct session **); struct winlink *cmd_mouse_window(struct mouse_event *, struct session **);
@ -1712,7 +1712,7 @@ enum cmd_retval cmd_attach_session(struct cmd_q *, const char *, int, int,
/* cmd-list.c */ /* cmd-list.c */
struct cmd_list *cmd_list_parse(int, char **, const char *, u_int, char **); struct cmd_list *cmd_list_parse(int, char **, const char *, u_int, char **);
void cmd_list_free(struct cmd_list *); void cmd_list_free(struct cmd_list *);
size_t cmd_list_print(struct cmd_list *, char *, size_t); char *cmd_list_print(struct cmd_list *);
/* cmd-queue.c */ /* cmd-queue.c */
struct cmd_q *cmdq_new(struct client *); struct cmd_q *cmdq_new(struct client *);