1*30fdc8d8SChris Lattner //===-- StreamFile.cpp ------------------------------------------*- C++ -*-===//
2*30fdc8d8SChris Lattner //
3*30fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
4*30fdc8d8SChris Lattner //
5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
7*30fdc8d8SChris Lattner //
8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
9*30fdc8d8SChris Lattner 
10*30fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
11*30fdc8d8SChris Lattner 
12*30fdc8d8SChris Lattner // C Includes
13*30fdc8d8SChris Lattner // C++ Includes
14*30fdc8d8SChris Lattner // Other libraries and framework includes
15*30fdc8d8SChris Lattner // Project includes
16*30fdc8d8SChris Lattner 
17*30fdc8d8SChris Lattner using namespace lldb;
18*30fdc8d8SChris Lattner using namespace lldb_private;
19*30fdc8d8SChris Lattner 
20*30fdc8d8SChris Lattner //----------------------------------------------------------------------
21*30fdc8d8SChris Lattner // StreamFile constructor
22*30fdc8d8SChris Lattner //----------------------------------------------------------------------
23*30fdc8d8SChris Lattner StreamFile::StreamFile () :
24*30fdc8d8SChris Lattner     Stream (),
25*30fdc8d8SChris Lattner     m_file (NULL),
26*30fdc8d8SChris Lattner     m_path_name (),
27*30fdc8d8SChris Lattner     m_close_file (false)
28*30fdc8d8SChris Lattner {
29*30fdc8d8SChris Lattner }
30*30fdc8d8SChris Lattner 
31*30fdc8d8SChris Lattner StreamFile::StreamFile(uint32_t flags, uint32_t addr_size, ByteOrder byte_order, FILE *f) :
32*30fdc8d8SChris Lattner     Stream (flags, addr_size, byte_order),
33*30fdc8d8SChris Lattner     m_file(f),
34*30fdc8d8SChris Lattner     m_path_name (),
35*30fdc8d8SChris Lattner     m_close_file(false)
36*30fdc8d8SChris Lattner {
37*30fdc8d8SChris Lattner }
38*30fdc8d8SChris Lattner 
39*30fdc8d8SChris Lattner StreamFile::StreamFile(FILE *f) :
40*30fdc8d8SChris Lattner     Stream (),
41*30fdc8d8SChris Lattner     m_file(f),
42*30fdc8d8SChris Lattner     m_path_name (),
43*30fdc8d8SChris Lattner     m_close_file(false)
44*30fdc8d8SChris Lattner {
45*30fdc8d8SChris Lattner }
46*30fdc8d8SChris Lattner 
47*30fdc8d8SChris Lattner StreamFile::StreamFile(uint32_t flags, uint32_t addr_size, ByteOrder byte_order, const char *path, const char *permissions) :
48*30fdc8d8SChris Lattner     Stream (flags, addr_size, byte_order),
49*30fdc8d8SChris Lattner     m_file (NULL),
50*30fdc8d8SChris Lattner     m_path_name (path),
51*30fdc8d8SChris Lattner     m_close_file(false)
52*30fdc8d8SChris Lattner {
53*30fdc8d8SChris Lattner     Open(path, permissions);
54*30fdc8d8SChris Lattner }
55*30fdc8d8SChris Lattner 
56*30fdc8d8SChris Lattner StreamFile::StreamFile(const char *path, const char *permissions) :
57*30fdc8d8SChris Lattner     Stream (),
58*30fdc8d8SChris Lattner     m_file (NULL),
59*30fdc8d8SChris Lattner     m_path_name (path),
60*30fdc8d8SChris Lattner     m_close_file(false)
61*30fdc8d8SChris Lattner {
62*30fdc8d8SChris Lattner     Open(path, permissions);
63*30fdc8d8SChris Lattner }
64*30fdc8d8SChris Lattner 
65*30fdc8d8SChris Lattner 
66*30fdc8d8SChris Lattner StreamFile::~StreamFile()
67*30fdc8d8SChris Lattner {
68*30fdc8d8SChris Lattner     Close ();
69*30fdc8d8SChris Lattner }
70*30fdc8d8SChris Lattner 
71*30fdc8d8SChris Lattner void
72*30fdc8d8SChris Lattner StreamFile::Close ()
73*30fdc8d8SChris Lattner {
74*30fdc8d8SChris Lattner     if (m_close_file && m_file != NULL)
75*30fdc8d8SChris Lattner         ::fclose (m_file);
76*30fdc8d8SChris Lattner     m_file = NULL;
77*30fdc8d8SChris Lattner     m_close_file = false;
78*30fdc8d8SChris Lattner }
79*30fdc8d8SChris Lattner 
80*30fdc8d8SChris Lattner bool
81*30fdc8d8SChris Lattner StreamFile::Open (const char *path, const char *permissions)
82*30fdc8d8SChris Lattner {
83*30fdc8d8SChris Lattner     Close();
84*30fdc8d8SChris Lattner     if (path && path[0])
85*30fdc8d8SChris Lattner     {
86*30fdc8d8SChris Lattner         if ((m_path_name.size() == 0)
87*30fdc8d8SChris Lattner             || (m_path_name.compare(path) != 0))
88*30fdc8d8SChris Lattner             m_path_name = path;
89*30fdc8d8SChris Lattner         m_file = ::fopen (path, permissions);
90*30fdc8d8SChris Lattner         if (m_file != NULL)
91*30fdc8d8SChris Lattner             m_close_file = true;
92*30fdc8d8SChris Lattner     }
93*30fdc8d8SChris Lattner     return m_file != NULL;
94*30fdc8d8SChris Lattner }
95*30fdc8d8SChris Lattner 
96*30fdc8d8SChris Lattner void
97*30fdc8d8SChris Lattner StreamFile::Flush ()
98*30fdc8d8SChris Lattner {
99*30fdc8d8SChris Lattner     if (m_file)
100*30fdc8d8SChris Lattner         ::fflush (m_file);
101*30fdc8d8SChris Lattner }
102*30fdc8d8SChris Lattner 
103*30fdc8d8SChris Lattner int
104*30fdc8d8SChris Lattner StreamFile::Write (const void *s, size_t length)
105*30fdc8d8SChris Lattner {
106*30fdc8d8SChris Lattner     if (m_file)
107*30fdc8d8SChris Lattner         return ::fwrite (s, 1, length, m_file);
108*30fdc8d8SChris Lattner     return 0;
109*30fdc8d8SChris Lattner }
110*30fdc8d8SChris Lattner 
111*30fdc8d8SChris Lattner FILE *
112*30fdc8d8SChris Lattner StreamFile::GetFileHandle()
113*30fdc8d8SChris Lattner {
114*30fdc8d8SChris Lattner     return m_file;
115*30fdc8d8SChris Lattner }
116*30fdc8d8SChris Lattner 
117*30fdc8d8SChris Lattner void
118*30fdc8d8SChris Lattner StreamFile::SetFileHandle (FILE *file, bool close_file)
119*30fdc8d8SChris Lattner {
120*30fdc8d8SChris Lattner     Close();
121*30fdc8d8SChris Lattner     m_file = file;
122*30fdc8d8SChris Lattner     m_close_file = close_file;
123*30fdc8d8SChris Lattner }
124*30fdc8d8SChris Lattner 
125*30fdc8d8SChris Lattner const char *
126*30fdc8d8SChris Lattner StreamFile::GetFilePathname ()
127*30fdc8d8SChris Lattner {
128*30fdc8d8SChris Lattner     if (m_path_name.size() == 0)
129*30fdc8d8SChris Lattner         return NULL;
130*30fdc8d8SChris Lattner     else
131*30fdc8d8SChris Lattner         return m_path_name.c_str();
132*30fdc8d8SChris Lattner }
133