//===-- DNBDataRef.h --------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//  Created by Greg Clayton on 1/11/06.
//
//===----------------------------------------------------------------------===//
//
//  DNBDataRef is a class that can extract data in normal or byte
//  swapped order from a data buffer that someone else owns. The data
//  buffer needs to remain intact as long as the DNBDataRef object
//  needs the data. Strings returned are pointers into the data buffer
//  and will need to be copied if they are needed after the data buffer
//  is no longer around.
//
//===----------------------------------------------------------------------===//

#ifndef __DNBDataRef_h__
#define __DNBDataRef_h__

#include "DNBDefs.h"
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>

class DNBDataRef
{
public:
    // For use with Dump
    typedef enum
    {
        TypeUInt8 = 0,
        TypeChar,
        TypeUInt16,
        TypeUInt32,
        TypeUInt64,
        TypePointer,
        TypeULEB128,
        TypeSLEB128
    }   Type;
    typedef uint32_t offset_t;
    typedef nub_addr_t addr_t;

                    DNBDataRef();
                    DNBDataRef(const uint8_t *start, size_t size, bool swap);
                    ~DNBDataRef();
        void        Clear()
                    {
                        DNBDataRef::SetData(NULL, 0);
                        m_swap = false;
                    }

    bool            ValidOffset(offset_t offset) const { return (m_start < m_end) && ((uint32_t)(m_end - m_start) > offset); }
    bool            ValidOffsetForDataOfSize(offset_t offset, uint32_t num_bytes) const { return (m_start < m_end) && ((uint32_t)(m_end - m_start) > (offset + ((num_bytes > 0) ? (num_bytes - 1) : 0))); }
    size_t          GetSize() const { return m_end - m_start; }
    const uint8_t * GetDataStart() const { return m_start; }
    const uint8_t * GetDataEnd() const { return m_end; }
    bool            GetSwap() const { return m_swap; }
    void            SetSwap(bool swap) { m_swap = swap; }
    void            SetData(const uint8_t *start, size_t size)
                    {
                        m_start = start;
                        if (m_start != NULL)
                            m_end = start + size;
                        else
                            m_end = NULL;
                    }
    uint8_t         GetPointerSize() const { return m_ptrSize; }
    void            SetPointerSize(uint8_t size) { m_ptrSize = size; }
    void            SetEHPtrBaseAddrPCRelative(addr_t addr = INVALID_NUB_ADDRESS) { m_addrPCRelative = addr; }
    void            SetEHPtrBaseAddrTEXT(addr_t addr = INVALID_NUB_ADDRESS)  { m_addrTEXT = addr; }
    void            SetEHPtrBaseAddrDATA(addr_t addr = INVALID_NUB_ADDRESS)  { m_addrDATA = addr; }
    uint8_t         Get8(offset_t *offset_ptr) const;
    uint16_t        Get16(offset_t *offset_ptr) const;
    uint32_t        Get32(offset_t *offset_ptr) const;
    uint64_t        Get64(offset_t *offset_ptr) const;
    uint32_t        GetMax32(offset_t *offset_ptr, uint32_t byte_size) const;
    uint64_t        GetMax64(offset_t *offset_ptr, uint32_t byte_size) const;
    uint64_t        GetPointer(offset_t *offset_ptr) const;
//  uint64_t        GetDwarfEHPtr(offset_t *offset_ptr, uint32_t eh_ptr_enc) const;
    const char *    GetCStr(offset_t *offset_ptr, uint32_t fixed_length = 0) const;
    const char *    PeekCStr(offset_t offset) const
                    {
                        if (ValidOffset(offset))
                            return (const char*)m_start + offset;
                        return NULL;
                    }

    const uint8_t * GetData( offset_t *offset_ptr, uint32_t length) const;
    uint64_t        Get_ULEB128 (offset_t *offset_ptr) const;
    int64_t         Get_SLEB128 (offset_t *offset_ptr) const;
    void            Skip_LEB128 (offset_t *offset_ptr) const;

    uint32_t        Dump(offset_t startOffset, offset_t endOffset, uint64_t offsetBase, DNBDataRef::Type type, uint32_t numPerLine, const char *typeFormat = NULL);
protected:
    const uint8_t * m_start;
    const uint8_t * m_end;
    bool            m_swap;
    uint8_t         m_ptrSize;
    addr_t          m_addrPCRelative;
    addr_t          m_addrTEXT;
    addr_t          m_addrDATA;
};

#endif // #ifndef __DNBDataRef_h__
