summaryrefslogtreecommitdiff
path: root/src/base/output.hh
blob: 68d9daf85ef33c524a699aa695d407adc1ddd596 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
/*
 * Copyright (c) 2005 The Regents of The University of Michigan
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met: redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer;
 * redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution;
 * neither the name of the copyright holders nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * 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 <ios>
#include <map>
#include <string>

/** Interface for creating files in a gem5 output directory. */
class OutputDirectory
{
  private:
    /** File names and associated stream handles */
    typedef std::map<std::string, std::ostream *> map_t;

    /** Open file streams within this directory */
    map_t files;

    /** Name of this directory */
    std::string dir;

    /** System-specific path separator character */
    static const char PATH_SEPARATOR = '/';

    /**
     * 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;

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

    /** 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);

    /**
     * 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);

    /**
     * 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);

    /**
     * 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;

#endif // __BASE_OUTPUT_HH__