mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-23 09:05:32 +00:00
Added run_command() api to replace system() and popen()
This commit is contained in:
parent
d2b8b48bf3
commit
b1596bc0e7
6 changed files with 104 additions and 92 deletions
|
@ -159,7 +159,7 @@ void Pass::call(RTLIL::Design *design, std::string command)
|
|||
cmd_buf.back() == '\r' || cmd_buf.back() == '\n'))
|
||||
cmd_buf.resize(cmd_buf.size()-1);
|
||||
log_header("Shell command: %s\n", cmd_buf.c_str());
|
||||
int retCode = system(cmd_buf.c_str());
|
||||
int retCode = run_command(cmd_buf);
|
||||
if (retCode != 0)
|
||||
log_cmd_error("Shell command returned error code %d.\n", retCode);
|
||||
return;
|
||||
|
|
|
@ -182,6 +182,31 @@ int readsome(std::istream &f, char *s, int n)
|
|||
return rc;
|
||||
}
|
||||
|
||||
int run_command(const std::string &command, std::function<void(const std::string&)> process_line)
|
||||
{
|
||||
if (!process_line)
|
||||
return system(command.c_str());
|
||||
|
||||
FILE *f = popen(command.c_str(), "r");
|
||||
if (f == nullptr)
|
||||
return -1;
|
||||
|
||||
std::string line;
|
||||
char logbuf[128];
|
||||
while (fgets(logbuf, 128, f) != NULL) {
|
||||
line += logbuf;
|
||||
if (!line.empty() && line.back() == '\n')
|
||||
process_line(line), line.clear();
|
||||
}
|
||||
if (!line.empty())
|
||||
process_line(line);
|
||||
|
||||
int ret = pclose(f);
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
return WEXITSTATUS(ret);
|
||||
}
|
||||
|
||||
int GetSize(RTLIL::Wire *wire)
|
||||
{
|
||||
return wire->width;
|
||||
|
|
|
@ -87,6 +87,7 @@ std::string vstringf(const char *fmt, va_list ap);
|
|||
std::string next_token(std::string &text, const char *sep);
|
||||
bool patmatch(const char *pattern, const char *string);
|
||||
int readsome(std::istream &f, char *s, int n);
|
||||
int run_command(const std::string &command, std::function<void(const std::string&)> process_line = std::function<void(const std::string&)>());
|
||||
|
||||
template<typename T> int GetSize(const T &obj) { return obj.size(); }
|
||||
int GetSize(RTLIL::Wire *wire);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue