diff --git a/src/svf_jtag.cpp b/src/svf_jtag.cpp index 38d0fb0..ab857a3 100644 --- a/src/svf_jtag.cpp +++ b/src/svf_jtag.cpp @@ -7,6 +7,7 @@ #include "svf_jtag.hpp" +#include #include #include @@ -17,14 +18,18 @@ #include #include "jtag.hpp" +#include "progressBar.hpp" void SVF_jtag::split_str(std::string const &str, std::vector &vparse) { std::string token; std::istringstream tokenStream(str); - while (getline(tokenStream, token, ' ')) - vparse.push_back(token); + while (tokenStream >> token){ + if(!token.empty()){ + vparse.push_back(token); + } + } } void SVF_jtag::clear_XYR(svf_XYR &t) @@ -90,6 +95,11 @@ void SVF_jtag::parse_XYR(std::vector const &vstr, svf_XYR &t) for (size_t pos = 2; pos < vstr.size(); pos++) { s = vstr[pos]; + if (s.empty()){ + throw std::runtime_error("Error parsing instruction: extraneous spaces"); + return; + } + if (!s.compare("TDO")) { mode = 1; continue; @@ -370,8 +380,19 @@ void SVF_jtag::parse(std::string filename) return; } unsigned int lineno = 0; + int lines_total = std::count(std::istreambuf_iterator(fs), + std::istreambuf_iterator(), '\n') + 1; + fs.clear(); + fs.seekg(0,std::ios::beg); + printf("Reading %s with %d lines", filename.c_str(), lines_total); + + ProgressBar progress("Writing SVF " + filename, lines_total, 50, _verbose); + try { while (getline(fs, str)) { + if(str.empty()){ + continue; + } /* sanity check: DOS CR */ if (str.back() == '\r') str.pop_back(); @@ -397,13 +418,16 @@ void SVF_jtag::parse(std::string filename) handle_instruction(vstr); vstr.clear(); } + progress.display(lineno); } } catch (std::exception &e) { - std::cerr << "Cannot proceed because of error(s) at line " << lineno << std::endl; + std::cerr << "Cannot proceed because of error(s) at line " << std::dec << lineno << std::endl; + progress.fail(); throw; } + progress.done(); std::cout << "end of SVF file" << std::endl; }