1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

lib/util: add unique string generator helper function

This commit is contained in:
Steven Danneman 2009-09-08 12:09:39 -07:00
parent 2b16380a0e
commit 11bd19c007
2 changed files with 69 additions and 0 deletions

View File

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

View File

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