diff options
author | Brad King <brad.king@kitware.com> | 2009-02-24 15:40:18 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2009-02-24 15:40:18 (GMT) |
commit | 1936499250425a1d50d70759758c7385b4bdf6d4 (patch) | |
tree | ba467f3fdf79068f715b64eb6a72536d9cee2996 /Source/cmProcessTools.h | |
parent | 6bdc2b5d99313ab6418b07ff91320135907ac261 (diff) | |
download | CMake-1936499250425a1d50d70759758c7385b4bdf6d4.zip CMake-1936499250425a1d50d70759758c7385b4bdf6d4.tar.gz CMake-1936499250425a1d50d70759758c7385b4bdf6d4.tar.bz2 |
ENH: Create cmProcessTools to parse child output
This class provides a RunProcess method to run a child process and send
its output to an abstract parsing interface. This also provides a
simple line parser and logger implementing the parsing interface.
Diffstat (limited to 'Source/cmProcessTools.h')
-rw-r--r-- | Source/cmProcessTools.h | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/Source/cmProcessTools.h b/Source/cmProcessTools.h new file mode 100644 index 0000000..c438527 --- /dev/null +++ b/Source/cmProcessTools.h @@ -0,0 +1,82 @@ +/*========================================================================= + + Program: CMake - Cross-Platform Makefile Generator + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. + See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#ifndef cmProcessTools_h +#define cmProcessTools_h + +#include "cmStandardIncludes.h" + +/** \class cmProcessTools + * \brief Helper classes for process output parsing + * + */ +class cmProcessTools +{ +public: + /** Abstract interface for process output parsers. */ + class OutputParser + { + public: + /** Process the given output data from a tool. Processing may be + done incrementally. Returns true if the parser is interested + in any more data and false if it is done. */ + bool Process(const char* data, int length) + { return this->ProcessChunk(data, length); } + protected: + /** Implement in a subclass to process a chunk of data. It should + return true only if it is interested in more data. */ + virtual bool ProcessChunk(const char* data, int length) = 0; + }; + + /** Process output parser that extracts one line at a time. */ + class LineParser: public OutputParser + { + public: + /** Construct with line separation character and choose whether to + ignore carriage returns. */ + LineParser(char sep = '\n', bool ignoreCR = true); + + /** Configure logging of lines as they are extracted. */ + void SetLog(std::ostream* log, const char* prefix); + protected: + char Separator; + bool IgnoreCR; + std::ostream* Log; + const char* Prefix; + std::string Line; + virtual bool ProcessChunk(const char* data, int length); + + /** Implement in a subclass to process one line of input. It + should return true only if it is interested in more data. */ + virtual bool ProcessLine() = 0; + }; + + /** Trivial line handler for simple logging. */ + class OutputLogger: public LineParser + { + public: + OutputLogger(std::ostream& log, const char* prefix = 0) + { this->SetLog(&log, prefix); } + private: + virtual bool ProcessLine() { return true; } + }; + + /** Run a process and send output to given parsers. */ + static void RunProcess(struct cmsysProcess_s* cp, + OutputParser* out, OutputParser* err = 0); +}; + +#endif |