diff options
author | Clifford Wolf <clifford@clifford.at> | 2015-04-08 12:14:34 +0200 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2015-04-08 12:14:34 +0200 |
commit | 21a1cc1b60f0c646dcc46c89440fc1a2cf606743 (patch) | |
tree | ce642af5e328a4947be37e23315c5389fe8b9fc8 /kernel | |
parent | aa0ab975b956e3b37c4d861fcf067475a28fd491 (diff) | |
download | yosys-21a1cc1b60f0c646dcc46c89440fc1a2cf606743.tar.gz yosys-21a1cc1b60f0c646dcc46c89440fc1a2cf606743.tar.bz2 yosys-21a1cc1b60f0c646dcc46c89440fc1a2cf606743.zip |
Added support for "file names with blanks"
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/register.cc | 7 | ||||
-rw-r--r-- | kernel/yosys.cc | 20 | ||||
-rw-r--r-- | kernel/yosys.h | 3 |
3 files changed, 24 insertions, 6 deletions
diff --git a/kernel/register.cc b/kernel/register.cc index af1cb77b5..d3b21c460 100644 --- a/kernel/register.cc +++ b/kernel/register.cc @@ -150,7 +150,7 @@ void Pass::call(RTLIL::Design *design, std::string command) std::vector<std::string> args; std::string cmd_buf = command; - std::string tok = next_token(cmd_buf, " \t\r\n"); + std::string tok = next_token(cmd_buf, " \t\r\n", true); if (tok.empty()) return; @@ -201,7 +201,7 @@ void Pass::call(RTLIL::Design *design, std::string command) call(design, args); args.clear(); } - tok = next_token(cmd_buf, " \t\r\n"); + tok = next_token(cmd_buf, " \t\r\n", true); } call(design, args); @@ -359,8 +359,7 @@ void Frontend::extra_args(std::istream *&f, std::string &filename, std::vector<s } f = new std::istringstream(last_here_document); } else { - if (filename.substr(0, 2) == "+/") - filename = proc_share_dirname() + filename.substr(1); + rewrite_filename(filename); std::ifstream *ff = new std::ifstream; ff->open(filename.c_str()); if (ff->fail()) diff --git a/kernel/yosys.cc b/kernel/yosys.cc index 884b2c59b..bbc142f14 100644 --- a/kernel/yosys.cc +++ b/kernel/yosys.cc @@ -182,13 +182,23 @@ int readsome(std::istream &f, char *s, int n) return rc; } -std::string next_token(std::string &text, const char *sep) +std::string next_token(std::string &text, const char *sep, bool long_strings) { size_t pos_begin = text.find_first_not_of(sep); if (pos_begin == std::string::npos) pos_begin = text.size(); + if (long_strings && pos_begin != text.size() && text[pos_begin] == '"') { + string sep_string = sep; + for (size_t i = pos_begin+1; i < text.size(); i++) + if (text[i] == '"' && (i+1 == text.size() || sep_string.find(text[i+1]) != std::string::npos)) { + std::string token = text.substr(pos_begin, i-pos_begin+1); + text = text.substr(i+1); + return token; + } + } + size_t pos_end = text.find_first_of(sep, pos_begin); if (pos_end == std::string::npos) @@ -505,6 +515,14 @@ const char *create_prompt(RTLIL::Design *design, int recursion_counter) return buffer; } +void rewrite_filename(std::string &filename) +{ + if (filename.substr(0, 1) == "\"" && filename.substr(GetSize(filename)-1) == "\"") + filename = filename.substr(1, GetSize(filename)-2); + if (filename.substr(0, 2) == "+/") + filename = proc_share_dirname() + filename.substr(2); +} + #ifdef YOSYS_ENABLE_TCL static int tcl_yosys_cmd(ClientData, Tcl_Interp *interp, int argc, const char *argv[]) { diff --git a/kernel/yosys.h b/kernel/yosys.h index 231dd4de6..e442c3e2e 100644 --- a/kernel/yosys.h +++ b/kernel/yosys.h @@ -204,7 +204,7 @@ void yosys_banner(); std::string stringf(const char *fmt, ...) YS_ATTRIBUTE(format(printf, 1, 2)); std::string vstringf(const char *fmt, va_list ap); int readsome(std::istream &f, char *s, int n); -std::string next_token(std::string &text, const char *sep = " \t\r\n"); +std::string next_token(std::string &text, const char *sep = " \t\r\n", bool long_strings = false); bool patmatch(const char *pattern, const char *string); int run_command(const std::string &command, std::function<void(const std::string&)> process_line = std::function<void(const std::string&)>()); std::string make_temp_file(std::string template_str = "/tmp/yosys_XXXXXX"); @@ -254,6 +254,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); +void rewrite_filename(std::string &filename); void run_pass(std::string command, RTLIL::Design *design = nullptr); void run_frontend(std::string filename, std::string command, std::string *backend_command, std::string *from_to_label = nullptr, RTLIL::Design *design = nullptr); |