You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
223 lines
5.8 KiB
223 lines
5.8 KiB
/*
|
|
* Copyright 2002-2019 Intel Corporation.
|
|
*
|
|
* This software is provided to you as Sample Source Code as defined in the accompanying
|
|
* End User License Agreement for the Intel(R) Software Development Products ("Agreement")
|
|
* section 1.L.
|
|
*
|
|
* This software and the related documents are provided as is, with no express or implied
|
|
* warranties, other than those that are expressly stated in the License.
|
|
*/
|
|
|
|
|
|
#include "parse_control.H"
|
|
#include "control_chain.H"
|
|
#include "util/strings.hpp"
|
|
|
|
using namespace std;
|
|
|
|
namespace CONTROLLER
|
|
{
|
|
/// @cond INTERNAL_DOXYGEN
|
|
unsigned int PARSER::SplitArgs(const string sep,
|
|
const string& input,
|
|
vector<string>& output_array)
|
|
{
|
|
// returns the number of args
|
|
// rip off the separator characters and split the src
|
|
// string based on separators.
|
|
|
|
// find the string between last_pos and pos. pos is after last_pos
|
|
size_t last_pos = input.find_first_not_of(sep, 0);
|
|
size_t pos = input.find_first_of(sep, last_pos);
|
|
|
|
int i=0;
|
|
while( pos != string::npos && last_pos != string::npos )
|
|
{
|
|
string a = input.substr(last_pos, pos-last_pos);
|
|
output_array.push_back(a);
|
|
|
|
last_pos = input.find_first_not_of(sep, pos);
|
|
pos = input.find_first_of(sep, last_pos);
|
|
i++;
|
|
}
|
|
if (last_pos != string::npos && pos == string::npos)
|
|
{
|
|
|
|
string a = input.substr(last_pos); // get the rest of the string
|
|
output_array.push_back(a);
|
|
i++;
|
|
}
|
|
return i;
|
|
}
|
|
|
|
BOOL PARSER::ConfigToken(const string& control_str){
|
|
vector<string> tokens;
|
|
SplitArgs(":",control_str,tokens);
|
|
if (tokens[0] == "repeat" ||
|
|
tokens[0] == "name" ||
|
|
tokens[0] == "waitfor"){
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL PARSER::UniformToken(vector<string>& tokens){
|
|
if (tokens[0] == "uniform"){
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
VOID PARSER::ParseConfigTokens(const string& control_str, CONTROL_CHAIN* chain){
|
|
vector<string> tokens;
|
|
SplitArgs(":",control_str,tokens);
|
|
if (tokens[0] == "repeat"){
|
|
if (tokens.size() == 1){
|
|
chain->SetRepeat(REPEAT_INDEFINITELY);
|
|
}
|
|
else{
|
|
UINT32 repeat = StringToUint32(tokens[1]);
|
|
chain->SetRepeat(repeat);
|
|
}
|
|
}
|
|
else if (tokens[0] == "name"){
|
|
chain->SetName(tokens[1]);
|
|
}
|
|
else if (tokens[0] == "waitfor"){
|
|
chain->SetWaitFor(tokens[1]);
|
|
}
|
|
else {
|
|
ASSERT(FALSE,"Unexpected config token");
|
|
}
|
|
}
|
|
|
|
BOOL PARSER::ParseBcastToken(const string& str, BOOL* bcast){
|
|
string bcast_str = "bcast";
|
|
|
|
if (str.compare(0,bcast_str.length(),bcast_str) == 0){
|
|
*bcast = TRUE;
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
UINT32 PARSER::GetTIDToken(const string& str){
|
|
string tid_str = "tid";
|
|
|
|
if (str.compare(0,tid_str.length(),tid_str) == 0){
|
|
string s = str.substr(tid_str.length());
|
|
return StringToUint32(s);
|
|
}
|
|
ASSERT(FALSE,"failed to parse tid token");
|
|
return 0;
|
|
}
|
|
|
|
|
|
BOOL PARSER::ParseTIDToken(const string& str, UINT32* tid){
|
|
string tid_str = "tid";
|
|
|
|
if (str.compare(0,tid_str.length(),tid_str) == 0){
|
|
string s = str.substr(tid_str.length());
|
|
*tid = StringToUint32(s);
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL PARSER::ParseGlobalToken(const string& str, BOOL* global_count){
|
|
string global_str = "global";
|
|
|
|
if (str.compare(0,global_str.length(),global_str) == 0){
|
|
*global_count = TRUE;
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL PARSER::ParseRepeatToken(const string& str)
|
|
{
|
|
string repeat_str = "repeat";
|
|
|
|
if (str.compare(0,repeat_str.length(),repeat_str) == 0){
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL PARSER::ParseCountToken(const string& str, UINT64* count){
|
|
string count_str = "count";
|
|
|
|
if (str.compare(0,count_str.length(),count_str) == 0){
|
|
string c = str.substr(count_str.length());
|
|
ASSERT(!c.empty(),"count must have a numeric value");
|
|
*count = StringToUint64(c);
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
UINT32 PARSER::StringToUint32(const string& s){
|
|
UINT32 val = 0;
|
|
string::const_iterator it;
|
|
it = UTIL::ParseUnsigned(s.begin(), s.end(), 0, &val);
|
|
|
|
if (it != s.end())
|
|
ASSERT(FALSE,"failed converting string to int:" + s);
|
|
|
|
return val;
|
|
}
|
|
|
|
UINT64 PARSER::StringToUint64(const string& s){
|
|
UINT64 val = 0;
|
|
string::const_iterator it;
|
|
it = UTIL::ParseUnsigned(s.begin(), s.end(), 0, &val);
|
|
|
|
if (it != s.end())
|
|
ASSERT(FALSE,"failed converting string to int:" + s);
|
|
|
|
return val;
|
|
}
|
|
|
|
static UINT8 convert_nibble(UINT8 n) {
|
|
if (n >= '0' && n <= '9') return n -'0';
|
|
if (n >= 'a' && n <= 'f') return n -'a'+10;
|
|
if (n >= 'A' && n <= 'F') return n -'A'+10;
|
|
cerr << "Bad nibble in hex string: " << (char)n << endl;
|
|
ASSERTX(0);
|
|
return 0;
|
|
}
|
|
|
|
VOID PARSER::str2hex(const char* in, unsigned char* out, size_t len) {
|
|
size_t i=0, j=0;
|
|
for(i=0;i<len;i+=2)
|
|
out[j++] = convert_nibble(in[i])*16+ convert_nibble(in[i+1]);
|
|
}
|
|
|
|
VOID PARSER::ParseOldConfigTokens(const string& str, string& value,
|
|
string& count, string& tid, BOOL& repeat)
|
|
{
|
|
//parsing old controller tokens: [:<int>][:tid<tid>][:repeat]
|
|
vector<string> tokens;
|
|
SplitArgs(":",str,tokens);
|
|
value = tokens[0];
|
|
if (tokens.size() > 1){
|
|
for (UINT32 i = 1; i < tokens.size(); i++){
|
|
if (tokens[i] == "repeat"){
|
|
repeat = TRUE;
|
|
}
|
|
else if (tokens[i].substr(0,3) == "tid"){
|
|
tid = tokens[i];
|
|
}
|
|
else{
|
|
//this must be a count token -> simple int
|
|
count = tokens[i];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/// @endcond
|
|
|
|
}; //namespace
|
|
|