| /***************************************************************************** |
| |
| 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__ |