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:
parent
2b16380a0e
commit
11bd19c007
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user