Home | History | Annotate | Download | only in Support
      1 //===- raw_mem_ostream.cpp ------------------------------------------------===//
      2 //
      3 //                     The MCLinker Project
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 #include <mcld/Support/raw_mem_ostream.h>
     10 #include <mcld/Support/MsgHandling.h>
     11 #include <mcld/Support/MemoryRegion.h>
     12 #include <mcld/Support/MemoryArea.h>
     13 #include <mcld/Support/FileHandle.h>
     14 
     15 using namespace mcld;
     16 
     17 //===----------------------------------------------------------------------===//
     18 // raw_mem_ostream
     19 //===----------------------------------------------------------------------===//
     20 raw_mem_ostream::raw_mem_ostream(MemoryArea &pMemoryArea)
     21   : m_MemoryArea(pMemoryArea), m_Position(0) {
     22   if (NULL == m_MemoryArea.handler() ||
     23       !(m_MemoryArea.handler()->isGood() &&
     24         m_MemoryArea.handler()->isWritable())) {
     25     fatal(diag::fatal_unwritable_output) << m_MemoryArea.handler()->path();
     26   }
     27 }
     28 
     29 raw_mem_ostream::~raw_mem_ostream()
     30 {
     31   flush();
     32   m_MemoryArea.clear();
     33 }
     34 
     35 void raw_mem_ostream::write_impl(const char *pPtr, size_t pSize)
     36 {
     37   MemoryRegion* region = m_MemoryArea.request(m_Position, pSize);
     38   memcpy(region->start(), pPtr, pSize);
     39   m_Position += pSize;
     40 }
     41 
     42 uint64_t raw_mem_ostream::current_pos() const
     43 {
     44   return m_Position;
     45 }
     46 
     47