2019-06-13 15:42:39 -05:00
|
|
|
#ifndef VTR_UTIL_H
|
|
|
|
#define VTR_UTIL_H
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
#include <string>
|
|
|
|
#include <cstdarg>
|
|
|
|
#include <array>
|
|
|
|
|
|
|
|
namespace vtr {
|
|
|
|
|
2020-01-03 17:14:42 -06:00
|
|
|
//Splits the string 'text' along the specified delimiter characters in 'delims'
|
|
|
|
//The split strings (excluding the delimiters) are returned
|
|
|
|
std::vector<std::string> split(const char* text, const std::string delims = " \t\n");
|
|
|
|
std::vector<std::string> split(const std::string& text, const std::string delims = " \t\n");
|
|
|
|
|
|
|
|
//Returns 'input' with the first instance of 'search' replaced with 'replace'
|
|
|
|
std::string replace_first(const std::string& input, const std::string& search, const std::string& replace);
|
|
|
|
|
|
|
|
//Returns 'input' with all instances of 'search' replaced with 'replace'
|
|
|
|
std::string replace_all(const std::string& input, const std::string& search, const std::string& replace);
|
|
|
|
|
|
|
|
//Retruns true if str starts with prefix
|
|
|
|
bool starts_with(std::string str, std::string prefix);
|
|
|
|
|
|
|
|
//Returns a std::string formatted using a printf-style format string
|
|
|
|
std::string string_fmt(const char* fmt, ...);
|
|
|
|
|
|
|
|
//Returns a std::string formatted using a printf-style format string taking
|
|
|
|
//an explicit va_list
|
|
|
|
std::string vstring_fmt(const char* fmt, va_list args);
|
|
|
|
|
|
|
|
//Joins a sequence by a specified delimeter
|
|
|
|
// For example the sequence {"home", "user", "my_files", "test.blif"} with delim="/"
|
|
|
|
// would return "home/user/my_files/test.blif"
|
|
|
|
template<typename Iter>
|
|
|
|
std::string join(Iter begin, Iter end, std::string delim);
|
|
|
|
|
|
|
|
template<typename Container>
|
|
|
|
std::string join(Container container, std::string delim);
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
std::string join(std::initializer_list<T> list, std::string delim);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Legacy c-style function replacements, typically these add extra error checking
|
|
|
|
* and/or correct 'unexpected' behaviour of the standard c-functions
|
|
|
|
*/
|
|
|
|
constexpr size_t bufsize = 32768; /* Maximum line length for various parsing proc. */
|
|
|
|
char* strncpy(char* dest, const char* src, size_t size);
|
|
|
|
char* strdup(const char* str);
|
|
|
|
char* strtok(char* ptr, const char* tokens, FILE* fp, char* buf);
|
|
|
|
FILE* fopen(const char* fname, const char* flag);
|
|
|
|
int fclose(FILE* f);
|
|
|
|
char* fgets(char* buf, int max_size, FILE* fp);
|
|
|
|
|
|
|
|
int atoi(const std::string& value);
|
|
|
|
unsigned atou(const std::string& value);
|
|
|
|
float atof(const std::string& value);
|
|
|
|
double atod(const std::string& value);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* File utilities
|
|
|
|
*/
|
|
|
|
int get_file_line_number_of_last_opened_file();
|
|
|
|
bool file_exists(const char* filename);
|
|
|
|
bool check_file_name_extension(const char* file_name,
|
|
|
|
const char* file_extension);
|
|
|
|
|
|
|
|
extern std::string out_file_prefix;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Legacy ReadLine Tokening
|
|
|
|
*/
|
|
|
|
std::vector<std::string> ReadLineTokens(FILE* InFile, int* LineNum);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Template implementations
|
|
|
|
*/
|
|
|
|
template<typename Iter>
|
|
|
|
std::string join(Iter begin, Iter end, std::string delim) {
|
|
|
|
std::string joined_str;
|
|
|
|
for (auto iter = begin; iter != end; ++iter) {
|
|
|
|
joined_str += *iter;
|
|
|
|
if (iter != end - 1) {
|
|
|
|
joined_str += delim;
|
2019-06-13 15:42:39 -05:00
|
|
|
}
|
|
|
|
}
|
2020-01-03 17:14:42 -06:00
|
|
|
return joined_str;
|
|
|
|
}
|
2019-06-13 15:42:39 -05:00
|
|
|
|
2020-01-03 17:14:42 -06:00
|
|
|
template<typename Container>
|
|
|
|
std::string join(Container container, std::string delim) {
|
|
|
|
return join(std::begin(container), std::end(container), delim);
|
|
|
|
}
|
2019-06-13 15:42:39 -05:00
|
|
|
|
2020-01-03 17:14:42 -06:00
|
|
|
template<typename T>
|
|
|
|
std::string join(std::initializer_list<T> list, std::string delim) {
|
|
|
|
return join(list.begin(), list.end(), delim);
|
2019-06-13 15:42:39 -05:00
|
|
|
}
|
2020-01-03 17:14:42 -06:00
|
|
|
} // namespace vtr
|
2019-06-13 15:42:39 -05:00
|
|
|
|
|
|
|
#endif
|