diff options
author | Clifford Wolf <clifford@clifford.at> | 2017-11-18 09:58:40 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-18 09:58:40 +0100 |
commit | a4195e83c74bb4d69be181077923d2cb94bfcfc6 (patch) | |
tree | e039d9c02d0f81c6201f5bb24b9e72530d0d8a46 | |
parent | c01df04e32f7913622f40ced56fcb523ac96d35f (diff) | |
parent | abc5b4b8cebff1bd27b2a1766a251319b70115c6 (diff) | |
download | yosys-a4195e83c74bb4d69be181077923d2cb94bfcfc6.tar.gz yosys-a4195e83c74bb4d69be181077923d2cb94bfcfc6.tar.bz2 yosys-a4195e83c74bb4d69be181077923d2cb94bfcfc6.zip |
Merge pull request #452 from cr1901/master
Accommodate Windows-style paths during include-file processing.
-rw-r--r-- | frontends/verilog/preproc.cc | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/frontends/verilog/preproc.cc b/frontends/verilog/preproc.cc index ee742d485..00bdcee43 100644 --- a/frontends/verilog/preproc.cc +++ b/frontends/verilog/preproc.cc @@ -366,14 +366,31 @@ std::string frontend_verilog_preproc(std::istream &f, std::string filename, cons ff.clear(); std::string fixed_fn = fn; ff.open(fixed_fn.c_str()); - if (ff.fail() && fn.size() > 0 && fn[0] != '/' && filename.find('/') != std::string::npos) { + + bool filename_path_sep_found; + bool fn_relative; +#ifdef _WIN32 + // Both forward and backslash are acceptable separators on Windows. + filename_path_sep_found = (filename.find_first_of("/\\") != std::string::npos); + // Easier just to invert the check for an absolute path (e.g. C:\ or C:/) + fn_relative = !(fn[1] == ':' && (fn[2] == '/' || fn[2] == '\\')); +#else + filename_path_sep_found = (filename.find('/') != std::string::npos); + fn_relative = (fn[0] != '/'); +#endif + + if (ff.fail() && fn.size() > 0 && fn_relative && filename_path_sep_found) { // if the include file was not found, it is not given with an absolute path, and the // currently read file is given with a path, then try again relative to its directory ff.clear(); +#ifdef _WIN32 + fixed_fn = filename.substr(0, filename.find_last_of("/\\")+1) + fn; +#else fixed_fn = filename.substr(0, filename.rfind('/')+1) + fn; +#endif ff.open(fixed_fn); } - if (ff.fail() && fn.size() > 0 && fn[0] != '/') { + if (ff.fail() && fn.size() > 0 && fn_relative) { // if the include file was not found and it is not given with an absolute path, then // search it in the include path for (auto incdir : include_dirs) { @@ -505,7 +522,7 @@ std::string frontend_verilog_preproc(std::istream &f, std::string filename, cons if (try_expand_macro(defines_with_args, defines_map, tok)) continue; - + output_code.push_back(tok); } @@ -521,4 +538,3 @@ std::string frontend_verilog_preproc(std::istream &f, std::string filename, cons } YOSYS_NAMESPACE_END - |