From 04816acff032c4fbe0272132d9bd61b96e0824e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Wed, 20 Sep 2006 03:32:59 +0000 Subject: [PATCH] Add permutate_all (and support functions). git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@18126 ec53bebd-3082-4978-b11e-865c3cabbd6b --- appl/gssmask/common.c | 46 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/appl/gssmask/common.c b/appl/gssmask/common.c index f1a7201cc..7b7895524 100644 --- a/appl/gssmask/common.c +++ b/appl/gssmask/common.c @@ -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; +}