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