/*****************************************************************************

  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
  more contributor license agreements.  See the NOTICE file distributed
  with this work for additional information regarding copyright ownership.
  Accellera licenses this file to you under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with the
  License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
  implied.  See the License for the specific language governing
  permissions and limitations under the License.

 *****************************************************************************/

/*****************************************************************************

  scfx_string.h -

  Original Author: Robert Graulich, Synopsys, Inc.
                   Martin Janssen,  Synopsys, Inc.

 *****************************************************************************/

/*****************************************************************************

  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
  changes you are making here.

      Name, Affiliation, Date:
  Description of Modification:

 *****************************************************************************/
// $Log: scfx_string.h,v $
// Revision 1.1.1.1  2006/12/15 20:20:04  acg
// SystemC 2.3
//
// Revision 1.2  2006/01/03 23:18:34  acg
// Changed copyright to include 2006.
//
// Revision 1.1.1.1  2005/12/19 23:16:43  acg
// First check in of SystemC 2.1 into its own archive.
//
// Revision 1.9  2005/09/15 23:02:03  acg
// Added std:: prefix to appropriate methods and types to get around
// issues with the Edison Front End.
//
// Revision 1.8  2005/06/07 17:27:02  acg
// Fixed bug in scfx_string::operator += where an array reference was used
// rather than the [] operator.  This meant that the buffer may have been
// accessed beyond its allocated storage.
//

#ifndef __SYSTEMC_EXT_DT_FX_SCFX_STRING_HH__
#define __SYSTEMC_EXT_DT_FX_SCFX_STRING_HH__

#include <cstdio>

namespace sc_dt
{

// classes defined in this module
class scfx_string;


// ----------------------------------------------------------------------------
//  CLASS : scfx_string
//
//  Simple string class for internal use.
// ----------------------------------------------------------------------------

class scfx_string
{
    void resize(std::size_t);

  public:
    scfx_string();

    ~scfx_string();

    int length() const;

    void clear();

    char & operator [] (int);

    void append(int);
    void discard(int);
    void remove(int);

    void operator += (char);
    void operator += (const char *);

    operator const char * ();

  private:
    std::size_t m_len;
    std::size_t m_alloc;
    char *m_buffer;
};


// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

inline void
scfx_string::resize(std::size_t i)
{
    do {
        m_alloc *= 2;
    } while (i >= m_alloc);

    char *temp = new char[m_alloc];

    for (int j = 0; j < (int) m_len; ++j) {
        temp[j] = m_buffer[j];
    }
    temp[m_len] = 0;

    delete [] m_buffer;
    m_buffer = temp;
}

inline scfx_string::scfx_string() :
        m_len(0), m_alloc(BUFSIZ), m_buffer(new char[m_alloc])
{
    m_buffer[m_len] = 0;
}

inline scfx_string::~scfx_string() { delete [] m_buffer; }

inline int scfx_string::length() const { return m_len; }

inline void
scfx_string::clear()
{
    m_len = 0;
    m_buffer[m_len] = 0;
}

inline char &
scfx_string::operator [] (int i)
{
    if (i >= (int)m_alloc) {
        resize(i);
    }
    return m_buffer[i];
}

inline void
scfx_string::append(int n)
{
    m_len += n;
    m_buffer[m_len] = 0;
}

inline void
scfx_string::discard(int n)
{
    m_len -= n;
    m_buffer[m_len] = 0;
}

inline void
scfx_string::remove(int i)
{
    for (int j = i + 1; j < (int)m_len; ++j)
        m_buffer[j - 1] = m_buffer[j];
    --m_len;
    m_buffer[m_len] = 0;
}

inline void
scfx_string::operator += (char c)
{
    this->operator [] (m_len) = c;
    m_len++;
    this->operator [] (m_len) = 0;
}

inline void
scfx_string::operator += (const char *s)
{
    while (*s)
        (*this) += *s++;
}

inline scfx_string::operator const char * ()
{
    m_buffer[m_len] = 0;
    return m_buffer;
}

} // namespace sc_dt

#endif // __SYSTEMC_EXT_DT_FX_SCFX_STRING_HH__
