diff options
author | Clifford Wolf <clifford@clifford.at> | 2016-08-22 15:05:57 +0200 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2016-08-22 15:05:57 +0200 |
commit | f8a77abfac6da12e2e11c43b4e6aa6e613ac0d4b (patch) | |
tree | 99ad2f2cd96643495a5fe62a7bb71f28ddd868ae /kernel | |
parent | 450f6f59b494af14014f0cbe93df4ceca0eecd76 (diff) | |
download | yosys-f8a77abfac6da12e2e11c43b4e6aa6e613ac0d4b.tar.gz yosys-f8a77abfac6da12e2e11c43b4e6aa6e613ac0d4b.tar.bz2 yosys-f8a77abfac6da12e2e11c43b4e6aa6e613ac0d4b.zip |
Added glob support to all front-ends
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/register.cc | 16 | ||||
-rw-r--r-- | kernel/yosys.cc | 25 | ||||
-rw-r--r-- | kernel/yosys.h | 1 |
3 files changed, 38 insertions, 4 deletions
diff --git a/kernel/register.cc b/kernel/register.cc index 115880ed6..7a1d0b44b 100644 --- a/kernel/register.cc +++ b/kernel/register.cc @@ -382,7 +382,8 @@ void Frontend::extra_args(std::istream *&f, std::string &filename, std::vector<s bool called_with_fp = f != NULL; next_args.clear(); - for (; argidx < args.size(); argidx++) + + if (argidx < args.size()) { std::string arg = args[argidx]; @@ -419,6 +420,12 @@ void Frontend::extra_args(std::istream *&f, std::string &filename, std::vector<s f = new std::istringstream(last_here_document); } else { rewrite_filename(filename); + vector<string> filenames = glob_filename(filename); + filename = filenames.front(); + if (GetSize(filenames) > 1) { + next_args.insert(next_args.end(), args.begin(), args.begin()+argidx); + next_args.insert(next_args.end(), filenames.begin()+1, filenames.end()); + } std::ifstream *ff = new std::ifstream; ff->open(filename.c_str()); if (ff->fail()) @@ -434,12 +441,13 @@ void Frontend::extra_args(std::istream *&f, std::string &filename, std::vector<s cmd_error(args, i, "Found option, expected arguments."); if (argidx+1 < args.size()) { - next_args.insert(next_args.begin(), args.begin(), args.begin()+argidx); - next_args.insert(next_args.begin()+argidx, args.begin()+argidx+1, args.end()); + if (next_args.empty()) + next_args.insert(next_args.end(), args.begin(), args.begin()+argidx); + next_args.insert(next_args.end(), args.begin()+argidx+1, args.end()); args.erase(args.begin()+argidx+1, args.end()); } - break; } + if (f == NULL) cmd_error(args, argidx, "No filename given."); diff --git a/kernel/yosys.cc b/kernel/yosys.cc index 17f6847b5..08fee9741 100644 --- a/kernel/yosys.cc +++ b/kernel/yosys.cc @@ -37,11 +37,13 @@ # include <unistd.h> # include <dirent.h> # include <sys/stat.h> +# include <glob.h> #else # include <unistd.h> # include <dirent.h> # include <sys/types.h> # include <sys/stat.h> +# include <glob.h> #endif #include <limits.h> @@ -547,6 +549,29 @@ const char *create_prompt(RTLIL::Design *design, int recursion_counter) return buffer; } +std::vector<std::string> glob_filename(const std::string &filename_pattern) +{ + std::vector<std::string> results; + +#ifdef _WIN32 + results.push_back(filename_pattern); +#else + glob_t globbuf; + + int err = glob(filename_pattern.c_str(), 0, NULL, &globbuf); + + if(err == 0) { + for (size_t i = 0; i < globbuf.gl_pathc; i++) + results.push_back(globbuf.gl_pathv[i]); + globfree(&globbuf); + } else { + results.push_back(filename_pattern); + } +#endif + + return results; +} + void rewrite_filename(std::string &filename) { if (filename.substr(0, 1) == "\"" && filename.substr(GetSize(filename)-1) == "\"") diff --git a/kernel/yosys.h b/kernel/yosys.h index 0df750a13..aab6b5844 100644 --- a/kernel/yosys.h +++ b/kernel/yosys.h @@ -280,6 +280,7 @@ RTLIL::Design *yosys_get_design(); std::string proc_self_dirname(); std::string proc_share_dirname(); const char *create_prompt(RTLIL::Design *design, int recursion_counter); +std::vector<std::string> glob_filename(const std::string &filename_pattern); void rewrite_filename(std::string &filename); void run_pass(std::string command, RTLIL::Design *design = nullptr); |