X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fbase%2Foutput.hh;h=ef628882d797dd4619eaab1675c33703b5942768;hb=c033ead992a4e7bd8d031f25f3fa1256532c0540;hp=b1d1d7e7d6f5da76ce469145e2d2d95564fd26e5;hpb=e71a5270a2fe040e0542bc2c74a11a303688f6ae;p=gem5.git diff --git a/src/base/output.hh b/src/base/output.hh index b1d1d7e7d..ef628882d 100644 --- a/src/base/output.hh +++ b/src/base/output.hh @@ -26,37 +26,157 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Authors: Nathan Binkert + * Chris Emmons */ #ifndef __BASE_OUTPUT_HH__ #define __BASE_OUTPUT_HH__ -#include +#include #include #include +/** Interface for creating files in a gem5 output directory. */ class OutputDirectory { private: + /** File names and associated stream handles */ typedef std::map map_t; + /** Open file streams within this directory */ map_t files; + + /** Name of this directory */ std::string dir; - std::string resolve(const std::string &name); + /** System-specific path separator character */ + static const char PATH_SEPARATOR = '/'; + + protected: + /** + * Determines whether given file name corresponds to standard output + * streams. + * + * @param name name of file to check + * @return output stream for standard output or error stream if name + * corresponds to one or the other; NULL otherwise + */ + std::ostream *checkForStdio(const std::string &name) const; public: + /** Constructor. */ OutputDirectory(); + + /** Destructor. */ ~OutputDirectory(); + /** + * Returns relative file names prepended with name of this directory. + * Returns absolute file names unaltered. + * + * @param name file name to prepend with directory name + * @return file name prepended with base directory name or unaltered + * absolute file name + */ + std::string resolve(const std::string &name) const; + + /** Opens a file (optionally compressed). + * + * Will open a file as a compressed stream if filename ends in .gz. + * + * @param filename file to open + * @param mode attributes to open file with + * @return stream pointer to opened file; will cause sim fail on error + */ + std::ostream *openFile(const std::string &filename, + std::ios_base::openmode mode = std::ios::trunc); + + /** + * Sets name of this directory. + * @param dir name of this directory + */ void setDirectory(const std::string &dir); - const std::string &directory(); + /** + * Gets name of this directory. + * @return name of this directory + */ + const std::string &directory() const; + + /** + * Creates a file in this directory (optionally compressed). + * + * Will open a file as a compressed stream if filename ends in .gz. + * + * @param name name of file to create (without this directory's name + * leading it) + * @param binary true to create a binary file; false otherwise + * @return stream to the opened file + */ std::ostream *create(const std::string &name, bool binary = false); - std::ostream *find(const std::string &name); + /** + * Closes a file stream. + * + * Stream must have been opened through this interface, or sim will fail. + * + * @param openStream open stream to close + */ + void close(std::ostream *openStream); + + /** + * Finds stream associated with a file. + * @param name of file + * @return stream to specified file or NULL if file does not exist + */ + std::ostream *find(const std::string &name) const; + + /** + * Returns true if stream is open and not standard output or error. + * @param os output stream to evaluate + * @return true if os is non-NULL and not cout or cerr + */ static bool isFile(const std::ostream *os); - static inline bool isFile(const std::ostream &os) { return isFile(&os); } + + /** + * Determines whether a file name corresponds to a file in this directory. + * @param name name of file to evaluate + * @return true iff file has been opened in this directory or exists on the + * file system within this directory + */ + bool isFile(const std::string &name) const; + + /** + * Returns true if stream is open and not standard output or error. + * @param os output stream to evaluate + * @return true if os is non-NULL and not cout or cerr + */ + static inline bool isFile(const std::ostream &os) { + return isFile(&os); + } + + /** + * Creates a subdirectory within this directory. + * @param name name of subdirectory + * @return the new subdirectory's name suffixed with a path separator + */ + std::string createSubdirectory(const std::string &name) const; + + /** + * Removes a specified file or subdirectory. + * + * Will cause sim to fail for most errors. However, it will only warn the + * user if a directory could not be removed. This is in place to + * accommodate slow file systems where file deletions within a subdirectory + * may not be recognized quickly enough thereby causing the subsequent call + * to remove the directory to fail (seemingly unempty directory). + * + * @param name name of file or subdirectory to remove; name should not + * be prepended with the name of this directory object + * @param recursive set to true to attempt to recursively delete a + * subdirectory and its contents + */ + void remove(const std::string &name, bool recursive=false); }; extern OutputDirectory simout;