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