Annotation of src/usr.bin/tmux/cmd-list.c, Revision 1.13
1.13 ! nicm 1: /* $OpenBSD: cmd-list.c,v 1.12 2013/03/24 09:54:10 nicm Exp $ */
1.1 nicm 2:
3: /*
4: * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
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:
1.8 nicm 21: #include <stdlib.h>
1.1 nicm 22: #include <string.h>
23:
24: #include "tmux.h"
25:
26: struct cmd_list *
1.12 nicm 27: cmd_list_parse(int argc, char **argv, const char* file, u_int line,
28: char **cause)
1.1 nicm 29: {
30: struct cmd_list *cmdlist;
31: struct cmd *cmd;
32: int i, lastsplit;
33: size_t arglen, new_argc;
1.6 nicm 34: char **copy_argv, **new_argv;
35:
36: copy_argv = cmd_copy_argv(argc, argv);
1.1 nicm 37:
1.12 nicm 38: cmdlist = xcalloc(1, sizeof *cmdlist);
1.5 nicm 39: cmdlist->references = 1;
40: TAILQ_INIT(&cmdlist->list);
1.1 nicm 41:
42: lastsplit = 0;
43: for (i = 0; i < argc; i++) {
1.6 nicm 44: arglen = strlen(copy_argv[i]);
45: if (arglen == 0 || copy_argv[i][arglen - 1] != ';')
1.1 nicm 46: continue;
1.6 nicm 47: copy_argv[i][arglen - 1] = '\0';
1.1 nicm 48:
1.6 nicm 49: if (arglen > 1 && copy_argv[i][arglen - 2] == '\\') {
50: copy_argv[i][arglen - 2] = ';';
1.1 nicm 51: continue;
52: }
53:
54: new_argc = i - lastsplit;
1.6 nicm 55: new_argv = copy_argv + lastsplit;
1.1 nicm 56: if (arglen != 1)
57: new_argc++;
58:
1.12 nicm 59: cmd = cmd_parse(new_argc, new_argv, file, line, cause);
1.1 nicm 60: if (cmd == NULL)
61: goto bad;
1.5 nicm 62: TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry);
1.1 nicm 63:
64: lastsplit = i + 1;
65: }
66:
67: if (lastsplit != argc) {
1.12 nicm 68: cmd = cmd_parse(argc - lastsplit, copy_argv + lastsplit,
69: file, line, cause);
1.1 nicm 70: if (cmd == NULL)
71: goto bad;
1.5 nicm 72: TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry);
1.1 nicm 73: }
74:
1.6 nicm 75: cmd_free_argv(argc, copy_argv);
1.1 nicm 76: return (cmdlist);
77:
78: bad:
79: cmd_list_free(cmdlist);
1.6 nicm 80: cmd_free_argv(argc, copy_argv);
1.1 nicm 81: return (NULL);
82: }
83:
84: void
85: cmd_list_free(struct cmd_list *cmdlist)
86: {
1.12 nicm 87: struct cmd *cmd, *cmd1;
1.1 nicm 88:
1.5 nicm 89: if (--cmdlist->references != 0)
90: return;
91:
1.12 nicm 92: TAILQ_FOREACH_SAFE(cmd, &cmdlist->list, qentry, cmd1) {
1.5 nicm 93: TAILQ_REMOVE(&cmdlist->list, cmd, qentry);
1.11 nicm 94: args_free(cmd->args);
1.12 nicm 95: free(cmd->file);
1.11 nicm 96: free(cmd);
1.1 nicm 97: }
1.12 nicm 98:
1.8 nicm 99: free(cmdlist);
1.1 nicm 100: }
101:
102: size_t
103: cmd_list_print(struct cmd_list *cmdlist, char *buf, size_t len)
104: {
105: struct cmd *cmd;
1.13 ! nicm 106: size_t off, used;
1.1 nicm 107:
108: off = 0;
1.5 nicm 109: TAILQ_FOREACH(cmd, &cmdlist->list, qentry) {
1.1 nicm 110: if (off >= len)
111: break;
112: off += cmd_print(cmd, buf + off, len - off);
113: if (off >= len)
114: break;
1.13 ! nicm 115: if (TAILQ_NEXT(cmd, qentry) != NULL) {
! 116: used = xsnprintf(buf + off, len - off, " ; ");
! 117: if (used > len - off)
! 118: used = len - off;
! 119: off += used;
! 120: }
1.1 nicm 121: }
122: return (off);
123: }