summaryrefslogtreecommitdiff
path: root/lib/util/genrand.c
diff options
context:
space:
mode:
authorSteven Danneman <steven.danneman@isilon.com>2009-09-08 12:09:39 -0700
committerSteven Danneman <steven.danneman@isilon.com>2009-09-08 13:43:06 -0700
commit11bd19c0071eb0013bedcfc149199a2f1d4063db (patch)
tree24f79486ba3bccd23cdd9836ce7a7923f70f2c8b /lib/util/genrand.c
parent2b16380a0e22cc455f698e59cd94bfd899c989d0 (diff)
downloadsamba-11bd19c0071eb0013bedcfc149199a2f1d4063db.tar.gz
samba-11bd19c0071eb0013bedcfc149199a2f1d4063db.tar.bz2
samba-11bd19c0071eb0013bedcfc149199a2f1d4063db.zip
lib/util: add unique string generator helper function
Diffstat (limited to 'lib/util/genrand.c')
-rw-r--r--lib/util/genrand.c59
1 files changed, 59 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;
+}