Exemplo n.º 1
0
static int
cmd_try_alias(int *argc, char ***argv)
{
	struct options_entry	 *o;
	int			  old_argc = *argc, new_argc;
	char			**old_argv = *argv, **new_argv;
	u_int			  size, idx;
	int			  i;
	size_t			  wanted;
	const char		 *s, *cp = NULL;

	o = options_get_only(global_options, "command-alias");
	if (o == NULL || options_array_size(o, &size) == -1 || size == 0)
		return (-1);

	wanted = strlen(old_argv[0]);
	for (idx = 0; idx < size; idx++) {
		s = options_array_get(o, idx);
		if (s == NULL)
			continue;

		cp = strchr(s, '=');
		if (cp == NULL || (size_t)(cp - s) != wanted)
			continue;
		if (strncmp(old_argv[0], s, wanted) == 0)
			break;
	}
	if (idx == size)
		return (-1);

	if (cmd_string_split(cp + 1, &new_argc, &new_argv) != 0)
		return (-1);

	*argc = new_argc + old_argc - 1;
	*argv = xcalloc((*argc) + 1, sizeof **argv);

	for (i = 0; i < new_argc; i++)
		(*argv)[i] = xstrdup(new_argv[i]);
	for (i = 1; i < old_argc; i++)
		(*argv)[new_argc + i - 1] = xstrdup(old_argv[i]);

	log_debug("alias: %s=%s", old_argv[0], cp + 1);
	for (i = 0; i < *argc; i++)
		log_debug("alias: argv[%d] = %s", i, (*argv)[i]);

	cmd_free_argv(new_argc, new_argv);
	return (0);
}
Exemplo n.º 2
0
Arquivo: cmd.c Projeto: tmux/tmux
static int
cmd_try_alias(int *argc, char ***argv)
{
	struct options_entry		 *o;
	struct options_array_item	 *a;
	union options_value		 *ov;
	int				  old_argc = *argc, new_argc, i;
	char				**old_argv = *argv, **new_argv;
	size_t				  wanted;
	const char			 *cp = NULL;

	o = options_get_only(global_options, "command-alias");
	if (o == NULL)
		return (-1);
	wanted = strlen(old_argv[0]);

	a = options_array_first(o);
	while (a != NULL) {
		ov = options_array_item_value(a);
		cp = strchr(ov->string, '=');
		if (cp != NULL &&
		    (size_t)(cp - ov->string) == wanted &&
		    strncmp(old_argv[0], ov->string, wanted) == 0)
			break;
		a = options_array_next(a);
	}
	if (a == NULL)
		return (-1);

	if (cmd_string_split(cp + 1, &new_argc, &new_argv) != 0)
		return (-1);

	*argc = new_argc + old_argc - 1;
	*argv = xcalloc((*argc) + 1, sizeof **argv);

	for (i = 0; i < new_argc; i++)
		(*argv)[i] = xstrdup(new_argv[i]);
	for (i = 1; i < old_argc; i++)
		(*argv)[new_argc + i - 1] = xstrdup(old_argv[i]);

	log_debug("alias: %s=%s", old_argv[0], cp + 1);
	for (i = 0; i < *argc; i++)
		log_debug("alias: argv[%d] = %s", i, (*argv)[i]);

	cmd_free_argv(new_argc, new_argv);
	return (0);
}
Exemplo n.º 3
0
struct cmd_list *
cmd_string_parse(const char *s, const char *file, u_int line, char **cause)
{
	struct cmd_list	 *cmdlist = NULL;
	int		  argc;
	char		**argv;

	*cause = NULL;
	if (cmd_string_split(s, &argc, &argv) != 0)
		goto error;
	if (argc != 0) {
		cmdlist = cmd_list_parse(argc, argv, file, line, cause);
		if (cmdlist == NULL) {
			cmd_free_argv(argc, argv);
			goto error;
		}
	}
	cmd_free_argv(argc, argv);
	return (cmdlist);

error:
	xasprintf(cause, "invalid or unknown command: %s", s);
	return (NULL);
}