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 40*e2ae97f2SGreg Clayton StreamFile::StreamFile(FILE *f, bool tranfer_ownership) : 4130fdc8d8SChris Lattner Stream (), 4230fdc8d8SChris Lattner m_file (f), 43*e2ae97f2SGreg 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 9730fdc8d8SChris Lattner void 9830fdc8d8SChris Lattner StreamFile::Flush () 9930fdc8d8SChris Lattner { 10030fdc8d8SChris Lattner if (m_file) 10130fdc8d8SChris Lattner ::fflush (m_file); 10230fdc8d8SChris Lattner } 10330fdc8d8SChris Lattner 10430fdc8d8SChris Lattner int 10530fdc8d8SChris Lattner StreamFile::Write (const void *s, size_t length) 10630fdc8d8SChris Lattner { 10730fdc8d8SChris Lattner if (m_file) 10830fdc8d8SChris Lattner return ::fwrite (s, 1, length, m_file); 10930fdc8d8SChris Lattner return 0; 11030fdc8d8SChris Lattner } 11130fdc8d8SChris Lattner 11230fdc8d8SChris Lattner FILE * 11330fdc8d8SChris Lattner StreamFile::GetFileHandle() 11430fdc8d8SChris Lattner { 11530fdc8d8SChris Lattner return m_file; 11630fdc8d8SChris Lattner } 11730fdc8d8SChris Lattner 11830fdc8d8SChris Lattner void 11930fdc8d8SChris Lattner StreamFile::SetFileHandle (FILE *file, bool close_file) 12030fdc8d8SChris Lattner { 12130fdc8d8SChris Lattner Close(); 12230fdc8d8SChris Lattner m_file = file; 12330fdc8d8SChris Lattner m_close_file = close_file; 12430fdc8d8SChris Lattner } 12530fdc8d8SChris Lattner 12630fdc8d8SChris Lattner const char * 12730fdc8d8SChris Lattner StreamFile::GetFilePathname () 12830fdc8d8SChris Lattner { 12930fdc8d8SChris Lattner if (m_path_name.size() == 0) 13030fdc8d8SChris Lattner return NULL; 13130fdc8d8SChris Lattner else 13230fdc8d8SChris Lattner return m_path_name.c_str(); 13330fdc8d8SChris Lattner } 134