Add permutate_all (and support functions).
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@18126 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -49,3 +49,49 @@ store_string(krb5_storage *sp, const char *str)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
add_list(char ****list, size_t *listlen, char **str, size_t len)
|
||||
{
|
||||
size_t i;
|
||||
*list = erealloc(*list, sizeof(**list) * (*listlen + 1));
|
||||
|
||||
(*list)[*listlen] = ecalloc(len, sizeof(str)/sizeof(str[0]));
|
||||
for (i = 0; i < len; i++)
|
||||
(*list)[*listlen][i] = str[i];
|
||||
(*listlen)++;
|
||||
}
|
||||
|
||||
static void
|
||||
permute(char ****list, size_t *listlen,
|
||||
char **str, const int start, const int len)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
#define SWAP(s,i,j) { char *t = str[i]; str[i] = str[j]; str[j] = t; }
|
||||
|
||||
for (i = start; i < len - 1; i++) {
|
||||
for (j = i+1; j < len; j++) {
|
||||
SWAP(str,i,j);
|
||||
permute(list, listlen, str, i+1, len);
|
||||
SWAP(str,i,j);
|
||||
}
|
||||
}
|
||||
add_list(list, listlen, str, len);
|
||||
}
|
||||
|
||||
char ***
|
||||
permutate_all(struct getarg_strings *strings, size_t *size)
|
||||
{
|
||||
char **list, ***all = NULL;
|
||||
int i;
|
||||
|
||||
*size = 0;
|
||||
|
||||
list = ecalloc(strings->num_strings, sizeof(*list));
|
||||
for (i = 0; i < strings->num_strings; i++)
|
||||
list[i] = strings->strings[i];
|
||||
|
||||
permute(&all, size, list, 0, strings->num_strings);
|
||||
free(list);
|
||||
return all;
|
||||
}
|
||||
|
Reference in New Issue
Block a user