small changes

This commit is contained in:
Martchus 2015-10-06 22:28:33 +02:00
parent 6e1f2d4d56
commit 4e359bdfea
2 changed files with 15 additions and 16 deletions

View File

@ -27,13 +27,12 @@ const char symbols[24] = "!\"$%&/()=?'#*+~-_><.:,;";
/*! /*!
* Generates a random character sequence using the given \a randomizer. * Generates a random character sequence using the given \a randomizer.
*/ */
void generateRandomCharacterSequence(char *result, int length, std::function<int ()> randomizer, int highestRandomNumber, bool useSmallLetters, bool useCapitalLetters, bool useNumbers, bool useSymbols, bool useAtLeastOneOfEachCategory) void generateRandomCharacterSequence(char *result, unsigned int length, std::function<int ()> randomizer, int highestRandomNumber, bool useSmallLetters, bool useCapitalLetters, bool useNumbers, bool useSymbols, bool useAtLeastOneOfEachCategory)
{ {
if(length <= 0) { if(length) {
return; return;
} }
int categoryCount = 0; signed char categoryCount = 0;
int neededCharacters;
bool needSmallLetter = false; bool needSmallLetter = false;
bool needCapitalLetter = false; bool needCapitalLetter = false;
bool needNumber = false; bool needNumber = false;
@ -54,14 +53,14 @@ void generateRandomCharacterSequence(char *result, int length, std::function<int
needSymbol = useAtLeastOneOfEachCategory; needSymbol = useAtLeastOneOfEachCategory;
++categoryCount; ++categoryCount;
} }
neededCharacters = useAtLeastOneOfEachCategory ? categoryCount : 0; signed char neededCharacters = useAtLeastOneOfEachCategory ? categoryCount : 0;
if(categoryCount <= 0) { if(!categoryCount) {
result[0] = '\0'; *result = '\0';
return; return;
} }
for(int i = 0; i < length; ++i) { for(char *i = result, *end = result + length; i < end; ++i) {
int category = -1; int category = -1;
if((neededCharacters > 0 && (randomizer() < (highestRandomNumber / 2.0))) || (neededCharacters + i >= length)) { if((neededCharacters > 0 && (randomizer() < (highestRandomNumber / 2.0))) || ((end - i) >= neededCharacters)) {
if(needSmallLetter) if(needSmallLetter)
category = 0; category = 0;
if(needCapitalLetter && ((category == -1) || (randomizer() < (highestRandomNumber / 2.0)))) if(needCapitalLetter && ((category == -1) || (randomizer() < (highestRandomNumber / 2.0))))
@ -82,28 +81,28 @@ void generateRandomCharacterSequence(char *result, int length, std::function<int
} }
switch(category) { switch(category) {
case 0: case 0:
result[i] = letters[rand() % 26]; *i = letters[rand() % 26];
if(needSmallLetter) { if(needSmallLetter) {
needSmallLetter = false; needSmallLetter = false;
--neededCharacters; --neededCharacters;
} }
break; break;
case 1: case 1:
result[i] = capitalLetters[rand() % 26]; *i = capitalLetters[rand() % 26];
if(needCapitalLetter) { if(needCapitalLetter) {
needCapitalLetter = false; needCapitalLetter = false;
--neededCharacters; --neededCharacters;
} }
break; break;
case 2: case 2:
result[i] = numbers[rand() % 9]; *i = numbers[rand() % 9];
if(needNumber) { if(needNumber) {
needNumber = false; needNumber = false;
--neededCharacters; --neededCharacters;
} }
break; break;
case 3: case 3:
result[i] = symbols[rand() % 22]; *i = symbols[rand() % 22];
if(needSymbol) { if(needSymbol) {
needSymbol = false; needSymbol = false;
--neededCharacters; --neededCharacters;
@ -116,7 +115,7 @@ void generateRandomCharacterSequence(char *result, int length, std::function<int
/*! /*!
* Generates a random character sequence using std::rand(). * Generates a random character sequence using std::rand().
*/ */
void generateRandomCharacterSequence(char *result, int length, bool useSmallLetters, bool useCapitalLetters, bool useNumbers, bool useSymbols, bool useAtLeastOneOfEachCategory) void generateRandomCharacterSequence(char *result, unsigned int length, bool useSmallLetters, bool useCapitalLetters, bool useNumbers, bool useSymbols, bool useAtLeastOneOfEachCategory)
{ {
generateRandomCharacterSequence(result, length, rand, RAND_MAX, useSmallLetters, useCapitalLetters, useNumbers, useSymbols, useAtLeastOneOfEachCategory); generateRandomCharacterSequence(result, length, rand, RAND_MAX, useSmallLetters, useCapitalLetters, useNumbers, useSymbols, useAtLeastOneOfEachCategory);
} }

View File

@ -7,8 +7,8 @@
namespace RandomUtilities { namespace RandomUtilities {
LIB_EXPORT void generateRandomCharacterSequence(char *result, int length, bool useSmallLetters = true, bool useCapitalLetters = true, bool useNumbers = true, bool useSymbols = true, bool useAtLeastOneOfEachCategory = true); LIB_EXPORT void generateRandomCharacterSequence(char *result, unsigned int length, bool useSmallLetters = true, bool useCapitalLetters = true, bool useNumbers = true, bool useSymbols = true, bool useAtLeastOneOfEachCategory = true);
LIB_EXPORT void generateRandomCharacterSequence(char *result, int length, std::function<int ()> randomizer, int maximalRandomNumber, bool useSmallLetters = true, bool useCapitalLetters = true, bool useNumbers = true, bool useSymbols = true, bool useAtLeastOneOfEachCategory = true); LIB_EXPORT void generateRandomCharacterSequence(char *result, unsigned int length, std::function<int ()> randomizer, int maximalRandomNumber, bool useSmallLetters = true, bool useCapitalLetters = true, bool useNumbers = true, bool useSymbols = true, bool useAtLeastOneOfEachCategory = true);
} }