1/***************************************************************************** 2 3 Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 4 more contributor license agreements. See the NOTICE file distributed 5 with this work for additional information regarding copyright ownership. 6 Accellera licenses this file to you under the Apache License, Version 2.0 7 (the "License"); you may not use this file except in compliance with the 8 License. You may obtain a copy of the License at 9 10 http://www.apache.org/licenses/LICENSE-2.0 11 12 Unless required by applicable law or agreed to in writing, software 13 distributed under the License is distributed on an "AS IS" BASIS, 14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 15 implied. See the License for the specific language governing 16 permissions and limitations under the License. 17 18 *****************************************************************************/ 19 20/***************************************************************************** 21 22 scfx_string.h - 23 24 Original Author: Robert Graulich, Synopsys, Inc. 25 Martin Janssen, Synopsys, Inc. 26 27 *****************************************************************************/ 28 29/***************************************************************************** 30 31 MODIFICATION LOG - modifiers, enter your name, affiliation, date and 32 changes you are making here. 33 34 Name, Affiliation, Date: 35 Description of Modification: 36 37 *****************************************************************************/ 38// $Log: scfx_string.h,v $ 39// Revision 1.1.1.1 2006/12/15 20:20:04 acg 40// SystemC 2.3 41// 42// Revision 1.2 2006/01/03 23:18:34 acg 43// Changed copyright to include 2006. 44// 45// Revision 1.1.1.1 2005/12/19 23:16:43 acg 46// First check in of SystemC 2.1 into its own archive. 47// 48// Revision 1.9 2005/09/15 23:02:03 acg 49// Added std:: prefix to appropriate methods and types to get around 50// issues with the Edison Front End. 51// 52// Revision 1.8 2005/06/07 17:27:02 acg 53// Fixed bug in scfx_string::operator += where an array reference was used 54// rather than the [] operator. This meant that the buffer may have been 55// accessed beyond its allocated storage. 56// 57 58#ifndef SCFX_STRING_H 59#define SCFX_STRING_H 60 61#include <cstdio> 62 63 64namespace sc_dt 65{ 66 67// classes defined in this module 68class scfx_string; 69 70 71// ---------------------------------------------------------------------------- 72// CLASS : scfx_string 73// 74// Simple string class for internal use. 75// ---------------------------------------------------------------------------- 76 77class scfx_string 78{ 79 void resize( std::size_t ); 80 81public: 82 83 scfx_string(); 84 85 ~scfx_string(); 86 87 int length() const; 88 89 void clear(); 90 91 char& operator [] ( int ); 92 93 void append( int ); 94 void discard( int ); 95 void remove( int ); 96 97 void operator += ( char ); 98 void operator += ( const char* ); 99 100 operator const char* (); 101 102private: 103 104 std::size_t m_len; 105 std::size_t m_alloc; 106 char* m_buffer; 107}; 108 109 110// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 111 112inline 113void 114scfx_string::resize( std::size_t i ) 115{ 116 do { 117 m_alloc *= 2; 118 } while( i >= m_alloc ); 119 120 char* temp = new char[m_alloc]; 121 122 for( int j = 0; j < (int) m_len; ++ j ) { 123 temp[j] = m_buffer[j]; 124 } 125 temp[m_len] = 0; 126 127 delete [] m_buffer; 128 m_buffer = temp; 129} 130 131 132inline 133scfx_string::scfx_string() 134: m_len( 0 ), m_alloc( BUFSIZ ), m_buffer( new char[m_alloc] ) 135{ 136 m_buffer[m_len] = 0; 137} 138 139 140inline 141scfx_string::~scfx_string() 142{ 143 delete [] m_buffer; 144} 145 146 147inline 148int 149scfx_string::length() const 150{ 151 return m_len; 152} 153 154 155inline 156void 157scfx_string::clear() 158{ 159 m_len = 0; 160 m_buffer[m_len] = 0; 161} 162 163 164inline 165char& 166scfx_string::operator [] ( int i ) 167{ 168 if( i >= (int) m_alloc ) { 169 resize( i ); 170 } 171 return m_buffer[i]; 172} 173 174 175inline 176void 177scfx_string::append( int n ) 178{ 179 m_len += n; 180 m_buffer[m_len] = 0; 181} 182 183inline 184void 185scfx_string::discard( int n ) 186{ 187 m_len -= n; 188 m_buffer[m_len] = 0; 189} 190 191inline 192void 193scfx_string::remove( int i ) 194{ 195 for( int j = i + 1; j < (int) m_len; ++ j ) 196 m_buffer[j - 1] = m_buffer[j]; 197 -- m_len; 198 m_buffer[m_len] = 0; 199} 200 201 202inline 203void 204scfx_string::operator += ( char c ) 205{ 206 this->operator [] ( m_len ) = c; 207 m_len ++; 208 this->operator [] ( m_len ) = 0; 209} 210 211inline 212void 213scfx_string::operator += ( const char* s ) 214{ 215 while( *s ) 216 (*this) += *s ++; 217} 218 219 220inline 221scfx_string::operator const char*() 222{ 223 m_buffer[m_len] = 0; 224 return m_buffer; 225} 226 227} // namespace sc_dt 228 229 230#endif 231 232// Taf! 233