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