mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Complete option names as well.
This commit is contained in:
		
							
								
								
									
										53
									
								
								cmd.c
									
									
									
									
									
								
							
							
						
						
									
										53
									
								
								cmd.c
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: cmd.c,v 1.67 2008-12-15 21:21:56 nicm Exp $ */
 | 
			
		||||
/* $Id: cmd.c,v 1.68 2009-01-06 17:04:56 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -74,57 +74,6 @@ const struct cmd_entry *cmd_table[] = {
 | 
			
		||||
	NULL
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
char *
 | 
			
		||||
cmd_complete(const char *s)
 | 
			
		||||
{
 | 
			
		||||
	const struct cmd_entry 	      **entryp;
 | 
			
		||||
	ARRAY_DECL(, const char *)	list;
 | 
			
		||||
	char			       *prefix, *s2;
 | 
			
		||||
	u_int			 	i;
 | 
			
		||||
	size_t			 	j;
 | 
			
		||||
 | 
			
		||||
	if (*s == '\0')
 | 
			
		||||
		return (xstrdup(s));
 | 
			
		||||
 | 
			
		||||
	/* First, build a list of all the possible matches. */
 | 
			
		||||
	ARRAY_INIT(&list);
 | 
			
		||||
	for (entryp = cmd_table; *entryp != NULL; entryp++) {
 | 
			
		||||
		if (strncmp((*entryp)->name, s, strlen(s)) != 0)
 | 
			
		||||
			continue;
 | 
			
		||||
		ARRAY_ADD(&list, (*entryp)->name);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* If none, bail now with the original string. */
 | 
			
		||||
	if (ARRAY_LENGTH(&list) == 0) {
 | 
			
		||||
		ARRAY_FREE(&list);
 | 
			
		||||
		return (xstrdup(s));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* If an exact match, return it, with a trailing space. */
 | 
			
		||||
	if (ARRAY_LENGTH(&list) == 1) {
 | 
			
		||||
		xasprintf(&s2, "%s ", ARRAY_FIRST(&list));
 | 
			
		||||
		ARRAY_FREE(&list);
 | 
			
		||||
		return (s2);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Now loop through the list and find the longest common prefix. */
 | 
			
		||||
	prefix = xstrdup(ARRAY_FIRST(&list));
 | 
			
		||||
	for (i = 1; i < ARRAY_LENGTH(&list); i++) {
 | 
			
		||||
		s = ARRAY_ITEM(&list, i);
 | 
			
		||||
 | 
			
		||||
		j = strlen(s);
 | 
			
		||||
		if (j > strlen(prefix))
 | 
			
		||||
			j = strlen(prefix);
 | 
			
		||||
		for (; j > 0; j--) {
 | 
			
		||||
			if (prefix[j - 1] != s[j - 1])
 | 
			
		||||
				prefix[j - 1] = '\0';
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ARRAY_FREE(&list);
 | 
			
		||||
	return (prefix);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct cmd *
 | 
			
		||||
cmd_parse(int argc, char **argv, char **cause)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user