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;
|
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