=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/Attic/cmd-generic.c,v retrieving revision 1.5 retrieving revision 1.6 diff -c -r1.5 -r1.6 *** src/usr.bin/tmux/Attic/cmd-generic.c 2009/07/30 13:45:56 1.5 --- src/usr.bin/tmux/Attic/cmd-generic.c 2009/08/11 12:53:37 1.6 *************** *** 1,4 **** ! /* $OpenBSD: cmd-generic.c,v 1.5 2009/07/30 13:45:56 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-generic.c,v 1.6 2009/08/11 12:53:37 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott *************** *** 26,32 **** int cmd_getopt(int, char **, const char *, uint64_t); int cmd_flags(int, uint64_t, uint64_t *); size_t cmd_print_flags(char *, size_t, size_t, uint64_t); ! int cmd_fill_argument(int, char **, int, char **); size_t cmd_prarg(char *buf, size_t len, const char *prefix, char *arg) --- 26,32 ---- int cmd_getopt(int, char **, const char *, uint64_t); int cmd_flags(int, uint64_t, uint64_t *); size_t cmd_print_flags(char *, size_t, size_t, uint64_t); ! int cmd_fill_argument(int, char **, char **, int, char **); size_t cmd_prarg(char *buf, size_t len, const char *prefix, char *arg) *************** *** 104,112 **** } int ! cmd_fill_argument(int flags, char **arg, int argc, char **argv) { *arg = NULL; if (flags & CMD_ARG1) { if (argc != 1) --- 104,113 ---- } int ! cmd_fill_argument(int flags, char **arg, char **arg2, int argc, char **argv) { *arg = NULL; + *arg2 = NULL; if (flags & CMD_ARG1) { if (argc != 1) *************** *** 123,128 **** --- 124,146 ---- return (0); } + if (flags & CMD_ARG2) { + if (argc != 2) + return (-1); + *arg = xstrdup(argv[0]); + *arg2 = xstrdup(argv[1]); + return (0); + } + + if (flags & CMD_ARG12) { + if (argc != 1 && argc != 2) + return (-1); + *arg = xstrdup(argv[0]); + if (argc == 2) + *arg2 = xstrdup(argv[1]); + return (0); + } + if (argc != 0) return (-1); return (0); *************** *** 165,171 **** argc -= optind; argv += optind; ! if (cmd_fill_argument(self->entry->flags, &data->arg, argc, argv) != 0) goto usage; return (0); --- 183,190 ---- argc -= optind; argv += optind; ! if (cmd_fill_argument( ! self->entry->flags, &data->arg, &data->arg2, argc, argv) != 0) goto usage; return (0); *************** *** 202,207 **** --- 221,228 ---- off += cmd_prarg(buf + off, len - off, " -t ", data->target); if (off < len && data->arg != NULL) off += cmd_prarg(buf + off, len - off, " ", data->arg); + if (off < len && data->arg2 != NULL) + off += cmd_prarg(buf + off, len - off, " ", data->arg2); return (off); } *************** *** 246,252 **** argc -= optind; argv += optind; ! if (cmd_fill_argument(self->entry->flags, &data->arg, argc, argv) != 0) goto usage; return (0); --- 267,274 ---- argc -= optind; argv += optind; ! if (cmd_fill_argument( ! self->entry->flags, &data->arg, &data->arg2, argc, argv) != 0) goto usage; return (0); *************** *** 287,292 **** --- 309,316 ---- off += xsnprintf(buf + off, len - off, " -t %s", data->dst); if (off < len && data->arg != NULL) off += cmd_prarg(buf + off, len - off, " ", data->arg); + if (off < len && data->arg2 != NULL) + off += cmd_prarg(buf + off, len - off, " ", data->arg2); return (off); } *************** *** 338,344 **** argc -= optind; argv += optind; ! if (cmd_fill_argument(self->entry->flags, &data->arg, argc, argv) != 0) goto usage; return (0); --- 362,369 ---- argc -= optind; argv += optind; ! if (cmd_fill_argument( ! self->entry->flags, &data->arg, &data->arg2, argc, argv) != 0) goto usage; return (0); *************** *** 378,469 **** off += cmd_prarg(buf + off, len - off, " -t ", data->target); if (off < len && data->arg != NULL) off += cmd_prarg(buf + off, len - off, " ", data->arg); ! return (off); ! } ! ! void ! cmd_option_init(struct cmd *self, unused int key) ! { ! struct cmd_option_data *data; ! ! self->data = data = xmalloc(sizeof *data); ! data->chflags = 0; ! data->target = NULL; ! data->option = NULL; ! data->value = NULL; ! } ! ! int ! cmd_option_parse(struct cmd *self, int argc, char **argv, char **cause) ! { ! struct cmd_option_data *data; ! const struct cmd_entry *entry = self->entry; ! int opt; ! ! /* Don't use the entry version since it may be dependent on key. */ ! cmd_option_init(self, 0); ! data = self->data; ! ! while ((opt = cmd_getopt(argc, argv, "t:", entry->chflags)) != -1) { ! if (cmd_flags(opt, entry->chflags, &data->chflags) == 0) ! continue; ! switch (opt) { ! case 't': ! if (data->target == NULL) ! data->target = xstrdup(optarg); ! break; ! default: ! goto usage; ! } ! } ! argc -= optind; ! argv += optind; ! ! if (argc == 2) { ! data->option = xstrdup(argv[0]); ! data->value = xstrdup(argv[1]); ! } else if (argc == 1) ! data->option = xstrdup(argv[0]); ! else ! goto usage; ! return (0); ! ! usage: ! xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage); ! ! self->entry->free(self); ! return (-1); ! } ! ! void ! cmd_option_free(struct cmd *self) ! { ! struct cmd_option_data *data = self->data; ! ! if (data->target != NULL) ! xfree(data->target); ! if (data->option != NULL) ! xfree(data->option); ! if (data->value != NULL) ! xfree(data->value); ! xfree(data); ! } ! ! size_t ! cmd_option_print(struct cmd *self, char *buf, size_t len) ! { ! struct cmd_option_data *data = self->data; ! size_t off = 0; ! ! off += xsnprintf(buf, len, "%s", self->entry->name); ! if (data == NULL) ! return (off); ! off += cmd_print_flags(buf, len, off, data->chflags); ! if (off < len && data->target != NULL) ! off += cmd_prarg(buf + off, len - off, " -t ", data->target); ! if (off < len && data->option != NULL) ! off += xsnprintf(buf + off, len - off, " %s", data->option); ! if (off < len && data->value != NULL) ! off += xsnprintf(buf + off, len - off, " %s", data->value); return (off); } --- 403,409 ---- off += cmd_prarg(buf + off, len - off, " -t ", data->target); if (off < len && data->arg != NULL) off += cmd_prarg(buf + off, len - off, " ", data->arg); ! if (off < len && data->arg2 != NULL) ! off += cmd_prarg(buf + off, len - off, " ", data->arg2); return (off); }