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