version 1.7, 2009/08/26 18:09:52 |
version 1.8, 2009/11/13 19:53:29 |
|
|
|
|
#include "tmux.h" |
#include "tmux.h" |
|
|
int cmd_getopt(int, char **, const char *, uint64_t); |
int cmd_getopt(int, char **, const char *, const char *); |
int cmd_flags(int, uint64_t, uint64_t *); |
int cmd_parse_flags(int, const char *, uint64_t *); |
size_t cmd_print_flags(char *, size_t, size_t, uint64_t); |
size_t cmd_print_flags(char *, size_t, size_t, uint64_t); |
int cmd_fill_argument(int, char **, char **, int, char **); |
int cmd_fill_argument(int, char **, char **, int, char **); |
|
|
|
|
return (xsnprintf(buf, len, "%s%s", prefix, arg)); |
return (xsnprintf(buf, len, "%s%s", prefix, arg)); |
} |
} |
|
|
/* Prepend flags from chflags onto flagstr and call getopt. */ |
/* Append two flag strings together and call getopt. */ |
int |
int |
cmd_getopt(int argc, char **argv, const char *flagstr, uint64_t chflags) |
cmd_getopt(int argc, char **argv, const char *flagstr, const char *chflagstr) |
{ |
{ |
u_char ch; |
char tmp[BUFSIZ]; |
char buf[128]; |
|
size_t len, off; |
|
|
|
*buf = '\0'; |
if (strlcpy(tmp, flagstr, sizeof tmp) >= sizeof tmp) |
|
fatalx("strlcpy overflow"); |
|
if (strlcat(tmp, chflagstr, sizeof tmp) >= sizeof tmp) |
|
fatalx("strlcat overflow"); |
|
return (getopt(argc, argv, tmp)); |
|
} |
|
|
len = sizeof buf; |
/* Return if flag character is set. */ |
off = 0; |
int |
|
cmd_check_flag(uint64_t chflags, int flag) |
|
{ |
|
if (flag >= 'A' && flag <= 'Z') |
|
flag = 26 + flag - 'A'; |
|
else if (flag >= 'a' && flag <= 'z') |
|
flag = flag - 'a'; |
|
else |
|
return (0); |
|
return ((chflags & (1ULL << flag)) != 0); |
|
} |
|
|
for (ch = 0; ch < 26; ch++) { |
/* Set flag character. */ |
if (chflags & CMD_CHFLAG('a' + ch)) |
void |
off += xsnprintf(buf + off, len - off, "%c", 'a' + ch); |
cmd_set_flag(uint64_t *chflags, int flag) |
if (chflags & CMD_CHFLAG('A' + ch)) |
{ |
off += xsnprintf(buf + off, len - off, "%c", 'A' + ch); |
if (flag >= 'A' && flag <= 'Z') |
} |
flag = 26 + flag - 'A'; |
|
else if (flag >= 'a' && flag <= 'z') |
strlcat(buf, flagstr, sizeof buf); |
flag = flag - 'a'; |
|
else |
return (getopt(argc, argv, buf)); |
return; |
|
(*chflags) |= (1ULL << flag); |
} |
} |
|
|
/* |
/* If this option is expected, set it in chflags, otherwise return -1. */ |
* If this option is expected (in ichflags), set it in ochflags, otherwise |
|
* return -1. |
|
*/ |
|
int |
int |
cmd_flags(int opt, uint64_t ichflags, uint64_t *ochflags) |
cmd_parse_flags(int opt, const char *chflagstr, uint64_t *chflags) |
{ |
{ |
u_char ch; |
if (strchr(chflagstr, opt) == NULL) |
|
return (-1); |
for (ch = 0; ch < 26; ch++) { |
cmd_set_flag(chflags, opt); |
if (opt == 'a' + ch && ichflags & CMD_CHFLAG(opt)) { |
return (0); |
(*ochflags) |= CMD_CHFLAG(opt); |
|
return (0); |
|
} |
|
if (opt == 'A' + ch && ichflags & CMD_CHFLAG(opt)) { |
|
(*ochflags) |= CMD_CHFLAG(opt); |
|
return (0); |
|
} |
|
} |
|
return (-1); |
|
} |
} |
|
|
/* Print the flags supported in chflags. */ |
/* Print the flags supported in chflags. */ |
|
|
off += xsnprintf(buf + off, len - off, " -"); |
off += xsnprintf(buf + off, len - off, " -"); |
|
|
for (ch = 0; ch < 26; ch++) { |
for (ch = 0; ch < 26; ch++) { |
if (chflags & CMD_CHFLAG('a' + ch)) |
if (cmd_check_flag(chflags, 'a' + ch)) |
off += xsnprintf(buf + off, len - off, "%c", 'a' + ch); |
off += xsnprintf(buf + off, len - off, "%c", 'a' + ch); |
if (chflags & CMD_CHFLAG('A' + ch)) |
if (cmd_check_flag(chflags, 'A' + ch)) |
off += xsnprintf(buf + off, len - off, "%c", 'A' + ch); |
off += xsnprintf(buf + off, len - off, "%c", 'A' + ch); |
} |
} |
return (off - boff); |
return (off - boff); |
|
|
data = self->data; |
data = self->data; |
|
|
while ((opt = cmd_getopt(argc, argv, "t:", entry->chflags)) != -1) { |
while ((opt = cmd_getopt(argc, argv, "t:", entry->chflags)) != -1) { |
if (cmd_flags(opt, entry->chflags, &data->chflags) == 0) |
if (cmd_parse_flags(opt, entry->chflags, &data->chflags) == 0) |
continue; |
continue; |
switch (opt) { |
switch (opt) { |
case 't': |
case 't': |
|
|
data = self->data; |
data = self->data; |
|
|
while ((opt = cmd_getopt(argc, argv, "s:t:", entry->chflags)) != -1) { |
while ((opt = cmd_getopt(argc, argv, "s:t:", entry->chflags)) != -1) { |
if (cmd_flags(opt, entry->chflags, &data->chflags) == 0) |
if (cmd_parse_flags(opt, entry->chflags, &data->chflags) == 0) |
continue; |
continue; |
switch (opt) { |
switch (opt) { |
case 's': |
case 's': |
|
|
data = self->data; |
data = self->data; |
|
|
while ((opt = cmd_getopt(argc, argv, "b:t:", entry->chflags)) != -1) { |
while ((opt = cmd_getopt(argc, argv, "b:t:", entry->chflags)) != -1) { |
if (cmd_flags(opt, entry->chflags, &data->chflags) == 0) |
if (cmd_parse_flags(opt, entry->chflags, &data->chflags) == 0) |
continue; |
continue; |
switch (opt) { |
switch (opt) { |
case 'b': |
case 'b': |