Mercurial > octave-libtiff
changeset 27002:c04329ead503
new class for executing commands and getting result
* oct-process.h, oct-process.cc: New files.
* libinterp/corefcn/module.mk: Update.
author | Andrew Janke <andrew@apjanke.net> |
---|---|
date | Fri, 11 Jan 2019 21:24:26 -0500 |
parents | 3cea1cfb37d3 |
children | 2a57165f892c |
files | libinterp/corefcn/module.mk libinterp/corefcn/oct-process.cc libinterp/corefcn/oct-process.h |
diffstat | 3 files changed, 172 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/corefcn/module.mk Fri Mar 29 18:34:33 2019 +0000 +++ b/libinterp/corefcn/module.mk Fri Jan 11 21:24:26 2019 -0500 @@ -68,6 +68,7 @@ %reldir%/oct-obj.h \ %reldir%/oct-prcstrm.h \ %reldir%/oct-procbuf.h \ + %reldir%/oct-process.h \ %reldir%/oct-stdstrm.h \ %reldir%/oct-stream.h \ %reldir%/oct-strstrm.h \ @@ -208,6 +209,7 @@ %reldir%/oct-map.cc \ %reldir%/oct-prcstrm.cc \ %reldir%/oct-procbuf.cc \ + %reldir%/oct-process.cc \ %reldir%/oct-stream.cc \ %reldir%/oct-strstrm.cc \ %reldir%/oct-tex-lexer.ll \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libinterp/corefcn/oct-process.cc Fri Jan 11 21:24:26 2019 -0500 @@ -0,0 +1,88 @@ +/* + +Copyright (C) 2019 Andrew Janke + +This file is part of Octave. + +Octave is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Octave is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Octave; see the file COPYING. If not, see +<https://www.gnu.org/licenses/>. + +*/ + +#include <iostream> +#include <sstream> + +#include "oct-process.h" +#include "procstream.h" +#include "sysdep.h" +#include "oct-syscalls.h" + +namespace octave +{ + OCTINTERP_API + process_execution_result + process_execution_result::of_success (int exit_status, + const std::string& stdout_output) + { + return process_execution_result (0, exit_status, stdout_output, ""); + } + + OCTINTERP_API + process_execution_result + process_execution_result::of_error (int status, const std::string& err_msg) + { + return process_execution_result (status, -1, "", err_msg); + } + + // Execute a shell command, returning results as a C++ object + OCTINTERP_API + process_execution_result + run_command_and_return_output (const std::string& cmd_str) + { + iprocstream cmd (cmd_str.c_str ()); + + if (! cmd) + { + std::string msg = "unable to start subprocess for '" + cmd_str + "'"; + + return process_execution_result::of_error (-1, msg); + } + + std::ostringstream output_buf; + + char ch; + + for (;;) + { + if (cmd.get (ch)) + output_buf.put (ch); + else + { + if (! cmd.eof () && errno == EAGAIN) + cmd.clear (); + else + break; + } + } + + int cmd_status = cmd.close (); + + if (octave::sys::wifexited (cmd_status)) + cmd_status = octave::sys::wexitstatus (cmd_status); + else + cmd_status = 127; + + return process_execution_result::of_success (cmd_status, output_buf.str ()); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libinterp/corefcn/oct-process.h Fri Jan 11 21:24:26 2019 -0500 @@ -0,0 +1,82 @@ +/* + +Copyright (C) 2019 Andrew Janke + +This file is part of Octave. + +Octave is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Octave is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Octave; see the file COPYING. If not, see +<https://www.gnu.org/licenses/>. + +*/ + +#if ! defined (oct_process_h) +#define oct_process_h 1 + +#include "octave-config.h" + +#include <string> + +namespace octave +{ + OCTINTERP_API + class + process_execution_result + { + public: + + process_execution_result (void) + : m_status (-1), m_err_msg (), m_exit_status (-1), m_stdout_output () + { } + + process_execution_result (int status, int exit_status, + const std::string& stdout_output, + const std::string& err_msg) + : m_status (status), m_err_msg (err_msg), m_exit_status (exit_status), + m_stdout_output (stdout_output) + { } + + static process_execution_result + of_success (int exit_status, const std::string& stdout_output); + + static process_execution_result + of_error (int status, const std::string& err_msg); + + int status (void) const { return m_status; } + + int exit_status (void) const { return m_exit_status; } + + std::string err_msg (void) const { return m_err_msg; } + + std::string stdout_output (void) const { return m_stdout_output; } + + private: + + // Launch status of the process, 0 for success, nonzero for error. + int m_status; + + // Error message if executing command failed. + std::string m_err_msg; + + // Exit status of the process. + int m_exit_status; + + // Collected stdout output of the process. + std::string m_stdout_output; + }; + + extern OCTINTERP_API process_execution_result + run_command_and_return_output (const std::string& cmd_str); +} + +#endif