2016-08-29 15:35:48 +02:00
|
|
|
#include "./random.h"
|
|
|
|
|
2017-05-01 03:13:11 +02:00
|
|
|
#include <cassert>
|
2016-08-29 15:35:48 +02:00
|
|
|
#include <cmath>
|
|
|
|
#include <cstdlib>
|
2017-05-01 03:13:11 +02:00
|
|
|
#include <iomanip>
|
|
|
|
#include <sstream>
|
|
|
|
#include <string>
|
2016-08-29 15:35:48 +02:00
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \namespace RandomUtilities
|
|
|
|
* \brief Contains utility functions for generating random character sequences.
|
2017-02-03 00:54:44 +01:00
|
|
|
* \deprecated Might be removed in future release because API is bad and it is not used anymore anyways.
|
2016-08-29 15:35:48 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
namespace RandomUtilities {
|
|
|
|
|
|
|
|
//! @cond
|
|
|
|
const char letters[28] = "qwertzuiopasdfghjklyxcvbnm";
|
|
|
|
const char capitalLetters[28] = "QWERTZUIOPASDFGHJKLYXCVBNM";
|
|
|
|
const char numbers[11] = "1234567890";
|
|
|
|
const char symbols[24] = "!\"$%&/()=?'#*+~-_><.:,;";
|
|
|
|
//! @endcond
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Generates a random character sequence using the given \a randomizer.
|
2017-02-03 00:54:44 +01:00
|
|
|
* \deprecated Might be removed in future release because API is bad and it is not used anymore anyways.
|
2016-08-29 15:35:48 +02:00
|
|
|
*/
|
2017-05-01 03:13:11 +02:00
|
|
|
void generateRandomCharacterSequence(char *result, unsigned int length, std::function<int()> randomizer, int highestRandomNumber,
|
|
|
|
bool useSmallLetters, bool useCapitalLetters, bool useNumbers, bool useSymbols, bool useAtLeastOneOfEachCategory)
|
2016-08-29 15:35:48 +02:00
|
|
|
{
|
2017-05-01 03:13:11 +02:00
|
|
|
if (length) {
|
2016-08-29 15:35:48 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
signed char categoryCount = 0;
|
|
|
|
bool needSmallLetter = false;
|
|
|
|
bool needCapitalLetter = false;
|
|
|
|
bool needNumber = false;
|
|
|
|
bool needSymbol = false;
|
2017-05-01 03:13:11 +02:00
|
|
|
if (useSmallLetters) {
|
2016-08-29 15:35:48 +02:00
|
|
|
needSmallLetter = useAtLeastOneOfEachCategory;
|
|
|
|
++categoryCount;
|
|
|
|
}
|
2017-05-01 03:13:11 +02:00
|
|
|
if (useCapitalLetters) {
|
2016-08-29 15:35:48 +02:00
|
|
|
needCapitalLetter = useAtLeastOneOfEachCategory;
|
|
|
|
++categoryCount;
|
|
|
|
}
|
2017-05-01 03:13:11 +02:00
|
|
|
if (useNumbers) {
|
2016-08-29 15:35:48 +02:00
|
|
|
needNumber = useAtLeastOneOfEachCategory;
|
|
|
|
++categoryCount;
|
|
|
|
}
|
2017-05-01 03:13:11 +02:00
|
|
|
if (useSymbols) {
|
2016-08-29 15:35:48 +02:00
|
|
|
needSymbol = useAtLeastOneOfEachCategory;
|
|
|
|
++categoryCount;
|
|
|
|
}
|
|
|
|
signed char neededCharacters = useAtLeastOneOfEachCategory ? categoryCount : 0;
|
2017-05-01 03:13:11 +02:00
|
|
|
if (!categoryCount) {
|
2016-08-29 15:35:48 +02:00
|
|
|
*result = '\0';
|
|
|
|
return;
|
|
|
|
}
|
2017-05-01 03:13:11 +02:00
|
|
|
for (char *i = result, *end = result + length; i < end; ++i) {
|
2016-08-29 15:35:48 +02:00
|
|
|
int category = -1;
|
2017-05-01 03:13:11 +02:00
|
|
|
if ((neededCharacters > 0 && (randomizer() < (highestRandomNumber / 2.0))) || ((end - i) >= neededCharacters)) {
|
|
|
|
if (needSmallLetter)
|
2016-08-29 15:35:48 +02:00
|
|
|
category = 0;
|
2017-05-01 03:13:11 +02:00
|
|
|
if (needCapitalLetter && ((category == -1) || (randomizer() < (highestRandomNumber / 2.0))))
|
2016-08-29 15:35:48 +02:00
|
|
|
category = 1;
|
2017-05-01 03:13:11 +02:00
|
|
|
if (needNumber && ((category == -1) || (randomizer() < (highestRandomNumber / 4.0))))
|
2016-08-29 15:35:48 +02:00
|
|
|
category = 2;
|
2017-05-01 03:13:11 +02:00
|
|
|
if (needSymbol && ((category == -1) || (randomizer() < (highestRandomNumber / 8.0))))
|
|
|
|
category = 3;
|
2016-08-29 15:35:48 +02:00
|
|
|
} else {
|
2017-05-01 03:13:11 +02:00
|
|
|
if (useSmallLetters)
|
2016-08-29 15:35:48 +02:00
|
|
|
category = 0;
|
2017-05-01 03:13:11 +02:00
|
|
|
if (useCapitalLetters && ((category == -1) || (randomizer() < (highestRandomNumber / 2.0))))
|
2016-08-29 15:35:48 +02:00
|
|
|
category = 1;
|
2017-05-01 03:13:11 +02:00
|
|
|
if (useNumbers && ((category == -1) || (randomizer() < (highestRandomNumber / 4.0))))
|
2016-08-29 15:35:48 +02:00
|
|
|
category = 2;
|
2017-05-01 03:13:11 +02:00
|
|
|
if (useSymbols && ((category == -1) || (randomizer() < (highestRandomNumber / 8.0))))
|
|
|
|
category = 3;
|
2016-08-29 15:35:48 +02:00
|
|
|
}
|
2017-05-01 03:13:11 +02:00
|
|
|
switch (category) {
|
2016-08-29 15:35:48 +02:00
|
|
|
case 0:
|
|
|
|
*i = letters[rand() % 26];
|
2017-05-01 03:13:11 +02:00
|
|
|
if (needSmallLetter) {
|
2016-08-29 15:35:48 +02:00
|
|
|
needSmallLetter = false;
|
|
|
|
--neededCharacters;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
*i = capitalLetters[rand() % 26];
|
2017-05-01 03:13:11 +02:00
|
|
|
if (needCapitalLetter) {
|
2016-08-29 15:35:48 +02:00
|
|
|
needCapitalLetter = false;
|
|
|
|
--neededCharacters;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
*i = numbers[rand() % 9];
|
2017-05-01 03:13:11 +02:00
|
|
|
if (needNumber) {
|
2016-08-29 15:35:48 +02:00
|
|
|
needNumber = false;
|
|
|
|
--neededCharacters;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
*i = symbols[rand() % 22];
|
2017-05-01 03:13:11 +02:00
|
|
|
if (needSymbol) {
|
2016-08-29 15:35:48 +02:00
|
|
|
needSymbol = false;
|
|
|
|
--neededCharacters;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Generates a random character sequence using std::rand().
|
2017-02-03 00:54:44 +01:00
|
|
|
* \deprecated Might be removed in future release because API is bad and it is not used anymore anyways.
|
2016-08-29 15:35:48 +02:00
|
|
|
*/
|
2017-05-01 03:13:11 +02:00
|
|
|
void generateRandomCharacterSequence(char *result, unsigned int length, bool useSmallLetters, bool useCapitalLetters, bool useNumbers,
|
|
|
|
bool useSymbols, bool useAtLeastOneOfEachCategory)
|
2016-08-29 15:35:48 +02:00
|
|
|
{
|
2017-05-01 03:13:11 +02:00
|
|
|
generateRandomCharacterSequence(
|
|
|
|
result, length, rand, RAND_MAX, useSmallLetters, useCapitalLetters, useNumbers, useSymbols, useAtLeastOneOfEachCategory);
|
2016-08-29 15:35:48 +02:00
|
|
|
}
|
2017-09-17 21:45:23 +02:00
|
|
|
} // namespace RandomUtilities
|