/**
\file parse_options.cpp
\author michael.zohner@ec-spride.de
\copyright ABY - A Framework for Efficient Mixed-protocol Secure Two-party Computation
Copyright (C) 2019 ENCRYPTO Group, TU Darmstadt
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ABY is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see .
\brief Parse Options Implementation
*/
#include "parse_options.h"
#include
#include
/**
* takes a string in the Format "c i i i ..."
* (1 char followed by potentially many integers) and returns a vector of all i
* @param str the string to tokenize
* @param tokens the result vector of wire id
*/
void tokenize_verilog(const std::string& str, std::vector& tokens, const std::string& delimiters) {
tokens.clear();
// Skip delimiters at beginning. Skip first two characters (1 Char + 1 Space)
std::string::size_type lastPos = str.find_first_not_of(delimiters, 2);
// Find first "non-delimiter".
std::string::size_type pos = str.find_first_of(delimiters, lastPos);
while (std::string::npos != pos || std::string::npos != lastPos) {
// Found a token, add it to the vector.
tokens.push_back(atoi(str.substr(lastPos, pos - lastPos).c_str()));
// Skip delimiters. Note the "not_of"
lastPos = str.find_first_not_of(delimiters, pos);
// Find next "non-delimiter"
pos = str.find_first_of(delimiters, lastPos);
}
}
/**
* takes a string in the Format "i|i|i|..."
* (integers separated by '|') and returns a vector of all integers
* @param str the string to tokenize
* @param tokens the result vector of wire id
*/
void tokenize(const std::string& str, std::vector& tokens, const std::string& delimiters) {
tokens.clear();
// Skip delimiters at beginning
std::string::size_type lastPos = str.find_first_not_of(delimiters, 0);
// Find first "non-delimiter".
std::string::size_type pos = str.find_first_of(delimiters, lastPos);
while (std::string::npos != pos || std::string::npos != lastPos) {
// Found a token, add it to the vector.
tokens.push_back(atoi(str.substr(lastPos, pos - lastPos).c_str()));
// Skip delimiters. Note the "not_of"
lastPos = str.find_first_not_of(delimiters, pos);
// Find next "non-delimiter"
pos = str.find_first_of(delimiters, lastPos);
}
}
int32_t parse_options(int32_t* argcp, char*** argvp, parsing_ctx* options, uint32_t nops) {
int result = 0;
bool skip;
uint32_t i;
if(*argcp < 2)
return 0;
while ((*argcp) > 1) {
if ((*argvp)[1][0] != '-' || (*argvp)[1][1] == '\0' || (*argvp)[1][2] != '\0'){
return result;
}
skip=false;
for (i = 0, skip = false; i < nops && !skip; i++) {
if (strncmp(&((*argvp)[1][1]), options[i].opt_name.c_str(), options[i].opt_name.size()) == 0
&& (strlen((*argvp)[1])-1 == options[i].opt_name.size())) {
switch (options[i].type) {
case T_NUM:
if (isdigit((*argvp)[2][0])) {
++*argvp;
--*argcp;
*((uint32_t*) options[i].val) = atoi((*argvp)[1]);
} else {
std::cerr << "Argument for parameter wrong. " << std::endl;
return 0;
}
break;
case T_DOUBLE:
++*argvp;
--*argcp;
*((double*) options[i].val) = atof((*argvp)[1]);
break;
case T_STR:
++*argvp;
--*argcp;
*((std::string*) options[i].val) = (*argvp)[1];
break;
case T_FLAG:
*((bool*) options[i].val) = true;
break;
}
++result;
++*argvp;
--*argcp;
options[i].set = true;
skip = true;
}
}
if(skip == false) {
std::cerr << "Parameter not recognized. " << std::endl;
return 0;
}
}
for (i = 0; i < nops; i++) {
if (options[i].required && !options[i].set)
return 0;
}
return 1;
}
void print_usage(std::string progname, parsing_ctx* options, uint32_t nops) {
uint32_t i;
std::cout << "Usage: " << progname << std::endl;
for (i = 0; i < nops; i++) {
std::cout << " -" << options[i].opt_name << " [" << options[i].help_str << (options[i].required ? ", required" : ", optional") << "]" << std::endl;
}
std::cout << std::endl << "Program exiting" << std::endl;
}