130fdc8d8SChris Lattner //===-- StreamFile.cpp ------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 1030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 11*068d16b4SGreg Clayton #include "lldb/Host/Config.h" 1288966976SEli Friedman #include <stdio.h> 1330fdc8d8SChris Lattner 1430fdc8d8SChris Lattner // C Includes 1530fdc8d8SChris Lattner // C++ Includes 1630fdc8d8SChris Lattner // Other libraries and framework includes 1730fdc8d8SChris Lattner // Project includes 1830fdc8d8SChris Lattner 1930fdc8d8SChris Lattner using namespace lldb; 2030fdc8d8SChris Lattner using namespace lldb_private; 2130fdc8d8SChris Lattner 2230fdc8d8SChris Lattner //---------------------------------------------------------------------- 2330fdc8d8SChris Lattner // StreamFile constructor 2430fdc8d8SChris Lattner //---------------------------------------------------------------------- 2530fdc8d8SChris Lattner StreamFile::StreamFile () : 2630fdc8d8SChris Lattner Stream (), 2730fdc8d8SChris Lattner m_file (NULL), 28c982c768SGreg Clayton m_close_file (false), 29c982c768SGreg Clayton m_path_name () 3030fdc8d8SChris Lattner { 3130fdc8d8SChris Lattner } 3230fdc8d8SChris Lattner 3330fdc8d8SChris Lattner StreamFile::StreamFile(uint32_t flags, uint32_t addr_size, ByteOrder byte_order, FILE *f) : 3430fdc8d8SChris Lattner Stream (flags, addr_size, byte_order), 3530fdc8d8SChris Lattner m_file (f), 36c982c768SGreg Clayton m_close_file (false), 37c982c768SGreg Clayton m_path_name () 3830fdc8d8SChris Lattner { 3930fdc8d8SChris Lattner } 4030fdc8d8SChris Lattner 41e2ae97f2SGreg Clayton StreamFile::StreamFile(FILE *f, bool tranfer_ownership) : 4230fdc8d8SChris Lattner Stream (), 4330fdc8d8SChris Lattner m_file (f), 44e2ae97f2SGreg Clayton m_close_file (tranfer_ownership), 45c982c768SGreg Clayton m_path_name () 4630fdc8d8SChris Lattner { 4730fdc8d8SChris Lattner } 4830fdc8d8SChris Lattner 4930fdc8d8SChris Lattner StreamFile::StreamFile(uint32_t flags, uint32_t addr_size, ByteOrder byte_order, const char *path, const char *permissions) : 5030fdc8d8SChris Lattner Stream (flags, addr_size, byte_order), 5130fdc8d8SChris Lattner m_file (NULL), 52c982c768SGreg Clayton m_close_file(false), 53c982c768SGreg Clayton m_path_name (path) 5430fdc8d8SChris Lattner { 5530fdc8d8SChris Lattner Open(path, permissions); 5630fdc8d8SChris Lattner } 5730fdc8d8SChris Lattner 5830fdc8d8SChris Lattner StreamFile::StreamFile(const char *path, const char *permissions) : 5930fdc8d8SChris Lattner Stream (), 6030fdc8d8SChris Lattner m_file (NULL), 61c982c768SGreg Clayton m_close_file(false), 62c982c768SGreg Clayton m_path_name (path) 6330fdc8d8SChris Lattner { 6430fdc8d8SChris Lattner Open(path, permissions); 6530fdc8d8SChris Lattner } 6630fdc8d8SChris Lattner 6730fdc8d8SChris Lattner 6830fdc8d8SChris Lattner StreamFile::~StreamFile() 6930fdc8d8SChris Lattner { 7030fdc8d8SChris Lattner Close (); 7130fdc8d8SChris Lattner } 7230fdc8d8SChris Lattner 7330fdc8d8SChris Lattner void 7430fdc8d8SChris Lattner StreamFile::Close () 7530fdc8d8SChris Lattner { 7630fdc8d8SChris Lattner if (m_close_file && m_file != NULL) 7730fdc8d8SChris Lattner ::fclose (m_file); 7830fdc8d8SChris Lattner m_file = NULL; 7930fdc8d8SChris Lattner m_close_file = false; 8030fdc8d8SChris Lattner } 8130fdc8d8SChris Lattner 8230fdc8d8SChris Lattner bool 8330fdc8d8SChris Lattner StreamFile::Open (const char *path, const char *permissions) 8430fdc8d8SChris Lattner { 8530fdc8d8SChris Lattner Close(); 8630fdc8d8SChris Lattner if (path && path[0]) 8730fdc8d8SChris Lattner { 8830fdc8d8SChris Lattner if ((m_path_name.size() == 0) 8930fdc8d8SChris Lattner || (m_path_name.compare(path) != 0)) 9030fdc8d8SChris Lattner m_path_name = path; 9130fdc8d8SChris Lattner m_file = ::fopen (path, permissions); 9230fdc8d8SChris Lattner if (m_file != NULL) 9330fdc8d8SChris Lattner m_close_file = true; 9430fdc8d8SChris Lattner } 9530fdc8d8SChris Lattner return m_file != NULL; 9630fdc8d8SChris Lattner } 9730fdc8d8SChris Lattner 9830fdc8d8SChris Lattner void 999f35921bSJim Ingham StreamFile::SetLineBuffered () 1009f35921bSJim Ingham { 101*068d16b4SGreg Clayton #if LLDB_CONFIG_SUPPORTS_SETLINEBUFFERED 1029f35921bSJim Ingham if (m_file != NULL) 1039f35921bSJim Ingham setlinebuf (m_file); 104edd5192dSGreg Clayton #endif // #if LLDB_CONFIG_SUPPORTS_SETLINEBUFFERED 105*068d16b4SGreg Clayton } 106edd5192dSGreg Clayton 1079f35921bSJim Ingham void 10830fdc8d8SChris Lattner StreamFile::Flush () 10930fdc8d8SChris Lattner { 11030fdc8d8SChris Lattner if (m_file) 11130fdc8d8SChris Lattner ::fflush (m_file); 11230fdc8d8SChris Lattner } 11330fdc8d8SChris Lattner 11430fdc8d8SChris Lattner int 11530fdc8d8SChris Lattner StreamFile::Write (const void *s, size_t length) 11630fdc8d8SChris Lattner { 11730fdc8d8SChris Lattner if (m_file) 11830fdc8d8SChris Lattner return ::fwrite (s, 1, length, m_file); 11930fdc8d8SChris Lattner return 0; 12030fdc8d8SChris Lattner } 12130fdc8d8SChris Lattner 12230fdc8d8SChris Lattner FILE * 12330fdc8d8SChris Lattner StreamFile::GetFileHandle() 12430fdc8d8SChris Lattner { 12530fdc8d8SChris Lattner return m_file; 12630fdc8d8SChris Lattner } 12730fdc8d8SChris Lattner 12830fdc8d8SChris Lattner void 12930fdc8d8SChris Lattner StreamFile::SetFileHandle (FILE *file, bool close_file) 13030fdc8d8SChris Lattner { 13130fdc8d8SChris Lattner Close(); 13230fdc8d8SChris Lattner m_file = file; 13330fdc8d8SChris Lattner m_close_file = close_file; 13430fdc8d8SChris Lattner } 13530fdc8d8SChris Lattner 13630fdc8d8SChris Lattner const char * 13730fdc8d8SChris Lattner StreamFile::GetFilePathname () 13830fdc8d8SChris Lattner { 13930fdc8d8SChris Lattner if (m_path_name.size() == 0) 14030fdc8d8SChris Lattner return NULL; 14130fdc8d8SChris Lattner else 14230fdc8d8SChris Lattner return m_path_name.c_str(); 14330fdc8d8SChris Lattner } 144