diff options
-rw-r--r-- | lib/util/genrand.c | 59 | ||||
-rw-r--r-- | lib/util/util.h | 10 |
2 files changed, 69 insertions, 0 deletions
diff --git a/lib/util/genrand.c b/lib/util/genrand.c index 5b8456547a..1519931222 100644 --- a/lib/util/genrand.c +++ b/lib/util/genrand.c @@ -360,3 +360,62 @@ again: return retstr; } + +/** + * Define our own pow() function to avoid linking in libm + */ +static double s_pow(double x, double y) +{ + int i; + double ret = x; + + if (y == 0) + return 1; + + for (i = 1; i < y; i++) + ret *= x; + + return ret; +} + + +/** + * Generate an array of unique text strings all of the same length. + * The returned string will be allocated. + * Returns NULL if the number of unique combinations cannot be created. + * + * Characters used are: abcdefghijklmnopqrstuvwxyz0123456789+_-#., + */ +_PUBLIC_ char** generate_unique_strs(TALLOC_CTX *mem_ctx, size_t len, + uint32_t num) +{ + const char *c_list = "abcdefghijklmnopqrstuvwxyz0123456789+_-#.,"; + const int c_size = 42; + int i, j, rem; + long long place; + char ** strs = NULL; + + if (num == 0 || len == 0) + return NULL; + + /* We'll never return more than UINT32_MAX strings. Since 42^6 is more + * than UINT32_MAX, we only have to check if we've been asked to return + * more than the total number of permutations for lengths less than 6.*/ + if ((len < 6) && (num > s_pow(c_size, len))) + return NULL; + + strs = talloc_array(mem_ctx, char *, num); + + for (i = 0; i < num; i++) { + char *retstr = talloc_zero_size(mem_ctx, len + 1); + rem = i; + for (j = len - 1; j >= 0; j--) { + place = s_pow(c_size, j); + retstr[j] = c_list[rem / place]; + rem = rem % place; + } + strs[i] = retstr; + } + + return strs; +} diff --git a/lib/util/util.h b/lib/util/util.h index 20050d2f0a..aa9f91ef96 100644 --- a/lib/util/util.h +++ b/lib/util/util.h @@ -192,6 +192,16 @@ _PUBLIC_ char *generate_random_str_list(TALLOC_CTX *mem_ctx, size_t len, const c */ _PUBLIC_ char *generate_random_str(TALLOC_CTX *mem_ctx, size_t len); +/** + * Generate an array of unique text strings all of the same length. + * The returned strings will be allocated. + * Returns NULL if the number of unique combinations cannot be created. + * + * Characters used are: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+_-#., + */ +_PUBLIC_ char** generate_unique_strs(TALLOC_CTX *mem_ctx, size_t len, + uint32_t num); + /* The following definitions come from lib/util/dprintf.c */ #if _SAMBA_BUILD_ == 4 |