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" 1188966976SEli Friedman #include <stdio.h> 1230fdc8d8SChris Lattner 1330fdc8d8SChris Lattner // C Includes 1430fdc8d8SChris Lattner // C++ Includes 1530fdc8d8SChris Lattner // Other libraries and framework includes 1630fdc8d8SChris Lattner // Project includes 1730fdc8d8SChris Lattner 1830fdc8d8SChris Lattner using namespace lldb; 1930fdc8d8SChris Lattner using namespace lldb_private; 2030fdc8d8SChris Lattner 2130fdc8d8SChris Lattner //---------------------------------------------------------------------- 2230fdc8d8SChris Lattner // StreamFile constructor 2330fdc8d8SChris Lattner //---------------------------------------------------------------------- 2430fdc8d8SChris Lattner StreamFile::StreamFile () : 2530fdc8d8SChris Lattner Stream (), 2630fdc8d8SChris Lattner m_file (NULL), 27c982c768SGreg Clayton m_close_file (false), 28c982c768SGreg Clayton m_path_name () 2930fdc8d8SChris Lattner { 3030fdc8d8SChris Lattner } 3130fdc8d8SChris Lattner 3230fdc8d8SChris Lattner StreamFile::StreamFile(uint32_t flags, uint32_t addr_size, ByteOrder byte_order, FILE *f) : 3330fdc8d8SChris Lattner Stream (flags, addr_size, byte_order), 3430fdc8d8SChris Lattner m_file (f), 35c982c768SGreg Clayton m_close_file (false), 36c982c768SGreg Clayton m_path_name () 3730fdc8d8SChris Lattner { 3830fdc8d8SChris Lattner } 3930fdc8d8SChris Lattner 40e2ae97f2SGreg Clayton StreamFile::StreamFile(FILE *f, bool tranfer_ownership) : 4130fdc8d8SChris Lattner Stream (), 4230fdc8d8SChris Lattner m_file (f), 43e2ae97f2SGreg Clayton m_close_file (tranfer_ownership), 44c982c768SGreg Clayton m_path_name () 4530fdc8d8SChris Lattner { 4630fdc8d8SChris Lattner } 4730fdc8d8SChris Lattner 4830fdc8d8SChris Lattner StreamFile::StreamFile(uint32_t flags, uint32_t addr_size, ByteOrder byte_order, const char *path, const char *permissions) : 4930fdc8d8SChris Lattner Stream (flags, addr_size, byte_order), 5030fdc8d8SChris Lattner m_file (NULL), 51c982c768SGreg Clayton m_close_file(false), 52c982c768SGreg Clayton m_path_name (path) 5330fdc8d8SChris Lattner { 5430fdc8d8SChris Lattner Open(path, permissions); 5530fdc8d8SChris Lattner } 5630fdc8d8SChris Lattner 5730fdc8d8SChris Lattner StreamFile::StreamFile(const char *path, const char *permissions) : 5830fdc8d8SChris Lattner Stream (), 5930fdc8d8SChris Lattner m_file (NULL), 60c982c768SGreg Clayton m_close_file(false), 61c982c768SGreg Clayton m_path_name (path) 6230fdc8d8SChris Lattner { 6330fdc8d8SChris Lattner Open(path, permissions); 6430fdc8d8SChris Lattner } 6530fdc8d8SChris Lattner 6630fdc8d8SChris Lattner 6730fdc8d8SChris Lattner StreamFile::~StreamFile() 6830fdc8d8SChris Lattner { 6930fdc8d8SChris Lattner Close (); 7030fdc8d8SChris Lattner } 7130fdc8d8SChris Lattner 7230fdc8d8SChris Lattner void 7330fdc8d8SChris Lattner StreamFile::Close () 7430fdc8d8SChris Lattner { 7530fdc8d8SChris Lattner if (m_close_file && m_file != NULL) 7630fdc8d8SChris Lattner ::fclose (m_file); 7730fdc8d8SChris Lattner m_file = NULL; 7830fdc8d8SChris Lattner m_close_file = false; 7930fdc8d8SChris Lattner } 8030fdc8d8SChris Lattner 8130fdc8d8SChris Lattner bool 8230fdc8d8SChris Lattner StreamFile::Open (const char *path, const char *permissions) 8330fdc8d8SChris Lattner { 8430fdc8d8SChris Lattner Close(); 8530fdc8d8SChris Lattner if (path && path[0]) 8630fdc8d8SChris Lattner { 8730fdc8d8SChris Lattner if ((m_path_name.size() == 0) 8830fdc8d8SChris Lattner || (m_path_name.compare(path) != 0)) 8930fdc8d8SChris Lattner m_path_name = path; 9030fdc8d8SChris Lattner m_file = ::fopen (path, permissions); 9130fdc8d8SChris Lattner if (m_file != NULL) 9230fdc8d8SChris Lattner m_close_file = true; 9330fdc8d8SChris Lattner } 9430fdc8d8SChris Lattner return m_file != NULL; 9530fdc8d8SChris Lattner } 9630fdc8d8SChris Lattner 97*edd5192dSGreg Clayton #if LLDB_CONFIG_SUPPORTS_SETLINEBUFFERED 98*edd5192dSGreg Clayton 9930fdc8d8SChris Lattner void 1009f35921bSJim Ingham StreamFile::SetLineBuffered () 1019f35921bSJim Ingham { 1029f35921bSJim Ingham if (m_file != NULL) 1039f35921bSJim Ingham setlinebuf (m_file); 1049f35921bSJim Ingham } 1059f35921bSJim Ingham 106*edd5192dSGreg Clayton #endif // #if LLDB_CONFIG_SUPPORTS_SETLINEBUFFERED 107*edd5192dSGreg Clayton 1089f35921bSJim Ingham void 10930fdc8d8SChris Lattner StreamFile::Flush () 11030fdc8d8SChris Lattner { 11130fdc8d8SChris Lattner if (m_file) 11230fdc8d8SChris Lattner ::fflush (m_file); 11330fdc8d8SChris Lattner } 11430fdc8d8SChris Lattner 11530fdc8d8SChris Lattner int 11630fdc8d8SChris Lattner StreamFile::Write (const void *s, size_t length) 11730fdc8d8SChris Lattner { 11830fdc8d8SChris Lattner if (m_file) 11930fdc8d8SChris Lattner return ::fwrite (s, 1, length, m_file); 12030fdc8d8SChris Lattner return 0; 12130fdc8d8SChris Lattner } 12230fdc8d8SChris Lattner 12330fdc8d8SChris Lattner FILE * 12430fdc8d8SChris Lattner StreamFile::GetFileHandle() 12530fdc8d8SChris Lattner { 12630fdc8d8SChris Lattner return m_file; 12730fdc8d8SChris Lattner } 12830fdc8d8SChris Lattner 12930fdc8d8SChris Lattner void 13030fdc8d8SChris Lattner StreamFile::SetFileHandle (FILE *file, bool close_file) 13130fdc8d8SChris Lattner { 13230fdc8d8SChris Lattner Close(); 13330fdc8d8SChris Lattner m_file = file; 13430fdc8d8SChris Lattner m_close_file = close_file; 13530fdc8d8SChris Lattner } 13630fdc8d8SChris Lattner 13730fdc8d8SChris Lattner const char * 13830fdc8d8SChris Lattner StreamFile::GetFilePathname () 13930fdc8d8SChris Lattner { 14030fdc8d8SChris Lattner if (m_path_name.size() == 0) 14130fdc8d8SChris Lattner return NULL; 14230fdc8d8SChris Lattner else 14330fdc8d8SChris Lattner return m_path_name.c_str(); 14430fdc8d8SChris Lattner } 145