=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd.c,v retrieving revision 1.48 retrieving revision 1.49 diff -c -r1.48 -r1.49 *** src/usr.bin/tmux/cmd.c 2010/12/30 23:16:18 1.48 --- src/usr.bin/tmux/cmd.c 2011/01/04 00:42:47 1.49 *************** *** 1,4 **** ! /* $OpenBSD: cmd.c,v 1.48 2010/12/30 23:16:18 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd.c,v 1.49 2011/01/04 00:42:47 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 167,173 **** } char ** ! cmd_copy_argv(int argc, char **argv) { char **new_argv; int i; --- 167,173 ---- } char ** ! cmd_copy_argv(int argc, char *const *argv) { char **new_argv; int i; *************** *** 201,208 **** { const struct cmd_entry **entryp, *entry; struct cmd *cmd; char s[BUFSIZ]; ! int opt, ambiguous = 0; *cause = NULL; if (argc == 0) { --- 201,209 ---- { const struct cmd_entry **entryp, *entry; struct cmd *cmd; + struct args *args; char s[BUFSIZ]; ! int ambiguous = 0; *cause = NULL; if (argc == 0) { *************** *** 236,265 **** return (NULL); } ! optreset = 1; ! optind = 1; ! if (entry->parse == NULL) { ! while ((opt = getopt(argc, argv, "")) != -1) { ! switch (opt) { ! default: ! goto usage; ! } ! } ! argc -= optind; ! argv += optind; ! if (argc != 0) ! goto usage; ! } cmd = xmalloc(sizeof *cmd); cmd->entry = entry; ! cmd->data = NULL; ! if (entry->parse != NULL) { ! if (entry->parse(cmd, argc, argv, cause) != 0) { ! xfree(cmd); ! return (NULL); ! } ! } return (cmd); ambiguous: --- 237,255 ---- return (NULL); } ! args = args_parse(entry->args_template, argc, argv); ! if (args == NULL) ! goto usage; ! if (entry->args_lower != -1 && args->argc < entry->args_lower) ! goto usage; ! if (entry->args_upper != -1 && args->argc > entry->args_upper) ! goto usage; ! if (entry->check != NULL && entry->check(args) != 0) ! goto usage; cmd = xmalloc(sizeof *cmd); cmd->entry = entry; ! cmd->args = args; return (cmd); ambiguous: *************** *** 277,282 **** --- 267,274 ---- return (NULL); usage: + if (args != NULL) + args_free(args); xasprintf(cause, "usage: %s %s", entry->name, entry->usage); return (NULL); } *************** *** 290,306 **** void cmd_free(struct cmd *cmd) { ! if (cmd->data != NULL && cmd->entry->free != NULL) ! cmd->entry->free(cmd); xfree(cmd); } size_t cmd_print(struct cmd *cmd, char *buf, size_t len) { ! if (cmd->entry->print == NULL) ! return (xsnprintf(buf, len, "%s", cmd->entry->name)); ! return (cmd->entry->print(cmd, buf, len)); } /* --- 282,308 ---- void cmd_free(struct cmd *cmd) { ! if (cmd->args != NULL) ! args_free(cmd->args); xfree(cmd); } size_t cmd_print(struct cmd *cmd, char *buf, size_t len) { ! size_t off, used; ! ! off = xsnprintf(buf, len, "%s ", cmd->entry->name); ! if (off < len) { ! used = args_print(cmd->args, buf + off, len - off); ! if (used == 0) ! buf[off - 1] = '\0'; ! else { ! off += used; ! buf[off] = '\0'; ! } ! } ! return (off); } /*