ENH: Add command to generate random strings

This commit is contained in:
Ken Martin
2007-04-23 11:04:12 -04:00
parent e9361e41f3
commit c4fc2c19c7
2 changed files with 79 additions and 1 deletions

View File

@@ -66,6 +66,10 @@ bool cmStringCommand::InitialPass(std::vector<std::string> const& args)
{
return this->HandleSubstringCommand(args);
}
else if(subCommand == "RANDOM")
{
return this->HandleRandomCommand(args);
}
std::string e = "does not recognize sub-command "+subCommand;
this->SetError(e.c_str());
@@ -606,3 +610,71 @@ bool cmStringCommand
this->Makefile->AddDefinition(variableName.c_str(), buffer);
return true;
}
//----------------------------------------------------------------------------
bool cmStringCommand
::HandleRandomCommand(std::vector<std::string> const& args)
{
if(args.size() < 2 || args.size() == 3 || args.size() == 5)
{
this->SetError("sub-command RANDOM requires at least one argument.");
return false;
}
int length = 5;
const char cmStringCommandDefaultAlphabet[] = "qwertyuiopasdfghjklzxcvbnm"
"QWERTYUIOPASDFGHJKLZXCVBNM"
"0123456789";
std::string alphabet;
if ( args.size() > 3 )
{
size_t i = 1;
size_t stopAt = args.size() - 2;
for ( ; i < stopAt; ++i )
{
if ( args[i] == "LENGTH" )
{
++i;
length = atoi(args[i].c_str());
}
else if ( args[i] == "ALPHABET" )
{
++i;
alphabet = args[i];
}
}
}
if ( !alphabet.size() )
{
alphabet = cmStringCommandDefaultAlphabet;
}
double sizeofAlphabet = alphabet.size();
if ( sizeofAlphabet < 1 )
{
this->SetError("sub-command RANDOM invoked with bad alphabet.");
return false;
}
if ( length < 1 )
{
this->SetError("sub-command RANDOM invoked with bad length.");
return false;
}
const std::string& variableName = args[args.size()-1];
std::vector<char> result;
srand((int)time(NULL));
const char* alphaPtr = alphabet.c_str();
int cc;
for ( cc = 0; cc < length; cc ++ )
{
int idx=(int) (sizeofAlphabet* rand()/(RAND_MAX+1.0));
result.push_back(*(alphaPtr + idx));
}
result.push_back(0);
this->Makefile->AddDefinition(variableName.c_str(), &*result.begin());
return true;
}