3
0
Fork 0
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:
Clifford Wolf 2014-10-12 10:57:15 +02:00
parent d2b8b48bf3
commit b1596bc0e7
6 changed files with 104 additions and 92 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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);