112027Sjungma@eit.uni-kl.de/***************************************************************************** 212027Sjungma@eit.uni-kl.de 312027Sjungma@eit.uni-kl.de Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 412027Sjungma@eit.uni-kl.de more contributor license agreements. See the NOTICE file distributed 512027Sjungma@eit.uni-kl.de with this work for additional information regarding copyright ownership. 612027Sjungma@eit.uni-kl.de Accellera licenses this file to you under the Apache License, Version 2.0 712027Sjungma@eit.uni-kl.de (the "License"); you may not use this file except in compliance with the 812027Sjungma@eit.uni-kl.de License. You may obtain a copy of the License at 912027Sjungma@eit.uni-kl.de 1012027Sjungma@eit.uni-kl.de http://www.apache.org/licenses/LICENSE-2.0 1112027Sjungma@eit.uni-kl.de 1212027Sjungma@eit.uni-kl.de Unless required by applicable law or agreed to in writing, software 1312027Sjungma@eit.uni-kl.de distributed under the License is distributed on an "AS IS" BASIS, 1412027Sjungma@eit.uni-kl.de WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 1512027Sjungma@eit.uni-kl.de implied. See the License for the specific language governing 1612027Sjungma@eit.uni-kl.de permissions and limitations under the License. 1712027Sjungma@eit.uni-kl.de 1812027Sjungma@eit.uni-kl.de *****************************************************************************/ 1912027Sjungma@eit.uni-kl.de 2012027Sjungma@eit.uni-kl.de/***************************************************************************** 2112027Sjungma@eit.uni-kl.de 2212027Sjungma@eit.uni-kl.de sc_string.cpp -- Implementation of a simple string class. 2312027Sjungma@eit.uni-kl.de 2412027Sjungma@eit.uni-kl.de Original Author: Stan Y. Liao, Synopsys, Inc. 2512027Sjungma@eit.uni-kl.de 2612027Sjungma@eit.uni-kl.de CHANGE LOG AT END OF FILE 2712027Sjungma@eit.uni-kl.de *****************************************************************************/ 2812027Sjungma@eit.uni-kl.de 2912027Sjungma@eit.uni-kl.de#include <assert.h> 3012027Sjungma@eit.uni-kl.de#include <ctype.h> 3112027Sjungma@eit.uni-kl.de#include <cstdio> 3212027Sjungma@eit.uni-kl.de#include <stdarg.h> 3312027Sjungma@eit.uni-kl.de#include <string.h> 3412027Sjungma@eit.uni-kl.de 3512027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_iostream.h" 3612027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_string.h" 3712027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_utils_ids.h" 3812027Sjungma@eit.uni-kl.de 3912027Sjungma@eit.uni-kl.denamespace sc_dt { 4012027Sjungma@eit.uni-kl.de 4112027Sjungma@eit.uni-kl.deinline static int 4212027Sjungma@eit.uni-kl.desc_roundup( int n, int m ) 4312027Sjungma@eit.uni-kl.de{ 4412027Sjungma@eit.uni-kl.de return ((n - 1) / m + 1) * m; 4512027Sjungma@eit.uni-kl.de} 4612027Sjungma@eit.uni-kl.de 4712027Sjungma@eit.uni-kl.de 4812027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 4912027Sjungma@eit.uni-kl.de// CLASS : sc_string_rep 5012027Sjungma@eit.uni-kl.de// 5112027Sjungma@eit.uni-kl.de// Reference counting string implementation class. 5212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 5312027Sjungma@eit.uni-kl.de 5412027Sjungma@eit.uni-kl.declass sc_string_rep 5512027Sjungma@eit.uni-kl.de{ 5612027Sjungma@eit.uni-kl.de friend class sc_string_old; 5712027Sjungma@eit.uni-kl.de friend ::std::ostream& operator<<( ::std::ostream&, const sc_string_old& ); 5812027Sjungma@eit.uni-kl.de friend ::std::istream& operator>>( ::std::istream&, sc_string_old& ); 5912027Sjungma@eit.uni-kl.de friend sc_string_old operator+( const char*, const sc_string_old& ); 6012027Sjungma@eit.uni-kl.de 6112027Sjungma@eit.uni-kl.de sc_string_rep( int size = 16 ) : 6212027Sjungma@eit.uni-kl.de ref_count(1), alloc( sc_roundup( size, 16 ) ), str( new char[alloc] ) 6312027Sjungma@eit.uni-kl.de { 6412027Sjungma@eit.uni-kl.de *str = '\0'; 6512027Sjungma@eit.uni-kl.de } 6612027Sjungma@eit.uni-kl.de 6712027Sjungma@eit.uni-kl.de sc_string_rep( const char* s ) : ref_count(1), alloc(0), str(0) 6812027Sjungma@eit.uni-kl.de { 6912027Sjungma@eit.uni-kl.de if (s) { 7012027Sjungma@eit.uni-kl.de alloc = 1 + strlen(s); 7112027Sjungma@eit.uni-kl.de str = strcpy( new char[alloc], s ); 7212027Sjungma@eit.uni-kl.de } 7312027Sjungma@eit.uni-kl.de else { 7412027Sjungma@eit.uni-kl.de alloc = 16; 7512027Sjungma@eit.uni-kl.de str = strcpy( new char[alloc], "" ); 7612027Sjungma@eit.uni-kl.de } 7712027Sjungma@eit.uni-kl.de } 7812027Sjungma@eit.uni-kl.de 7912027Sjungma@eit.uni-kl.de sc_string_rep( const char* s, int n); // get first n chars from the string 8012027Sjungma@eit.uni-kl.de 8112027Sjungma@eit.uni-kl.de ~sc_string_rep() 8212027Sjungma@eit.uni-kl.de { 8312027Sjungma@eit.uni-kl.de assert( ref_count == 0 ); 8412027Sjungma@eit.uni-kl.de delete[] str; 8512027Sjungma@eit.uni-kl.de } 8612027Sjungma@eit.uni-kl.de 8712027Sjungma@eit.uni-kl.de void resize( int new_size ); 8812027Sjungma@eit.uni-kl.de void set_string( const char* s ); 8912027Sjungma@eit.uni-kl.de 9012027Sjungma@eit.uni-kl.de int ref_count; 9112027Sjungma@eit.uni-kl.de int alloc; 9212027Sjungma@eit.uni-kl.de char* str; 9312027Sjungma@eit.uni-kl.de}; 9412027Sjungma@eit.uni-kl.de 9512027Sjungma@eit.uni-kl.de 9612027Sjungma@eit.uni-kl.de// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 9712027Sjungma@eit.uni-kl.de 9812027Sjungma@eit.uni-kl.desc_string_rep::sc_string_rep( const char* s, int n) : 9912027Sjungma@eit.uni-kl.de ref_count(1), alloc(0), str(0) 10012027Sjungma@eit.uni-kl.de{ 10112027Sjungma@eit.uni-kl.de if (s && n>0) { 10212027Sjungma@eit.uni-kl.de alloc = 1 + n; 10312027Sjungma@eit.uni-kl.de str = strncpy( new char[alloc], s,n ); 10412027Sjungma@eit.uni-kl.de str[n] = 00; 10512027Sjungma@eit.uni-kl.de } 10612027Sjungma@eit.uni-kl.de else { 10712027Sjungma@eit.uni-kl.de alloc = 16; 10812027Sjungma@eit.uni-kl.de str = strcpy( new char[alloc], "" ); 10912027Sjungma@eit.uni-kl.de } 11012027Sjungma@eit.uni-kl.de} 11112027Sjungma@eit.uni-kl.de 11212027Sjungma@eit.uni-kl.devoid 11312027Sjungma@eit.uni-kl.desc_string_rep::resize( int new_size ) 11412027Sjungma@eit.uni-kl.de{ 11512027Sjungma@eit.uni-kl.de if (new_size <= alloc) return; 11612027Sjungma@eit.uni-kl.de alloc = sc_roundup( new_size, 16 ); 11712027Sjungma@eit.uni-kl.de char* new_str = strcpy( new char[alloc], str ); 11812027Sjungma@eit.uni-kl.de delete[] str; 11912027Sjungma@eit.uni-kl.de str = new_str; 12012027Sjungma@eit.uni-kl.de} 12112027Sjungma@eit.uni-kl.de 12212027Sjungma@eit.uni-kl.devoid 12312027Sjungma@eit.uni-kl.desc_string_rep::set_string( const char* s ) 12412027Sjungma@eit.uni-kl.de{ 12512027Sjungma@eit.uni-kl.de int len = strlen(s); 12612027Sjungma@eit.uni-kl.de resize( len + 1 ); 12712027Sjungma@eit.uni-kl.de strcpy( str, s ); 12812027Sjungma@eit.uni-kl.de} 12912027Sjungma@eit.uni-kl.de 13012027Sjungma@eit.uni-kl.de 13112027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 13212027Sjungma@eit.uni-kl.de// CLASS : sc_string_old 13312027Sjungma@eit.uni-kl.de// 13412027Sjungma@eit.uni-kl.de// String class (yet another). 13512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 13612027Sjungma@eit.uni-kl.de 13712027Sjungma@eit.uni-kl.de// constructors 13812027Sjungma@eit.uni-kl.de 13912027Sjungma@eit.uni-kl.desc_string_old::sc_string_old( int size ) : rep( new sc_string_rep(size) ) 14012027Sjungma@eit.uni-kl.de{ 14112027Sjungma@eit.uni-kl.de} 14212027Sjungma@eit.uni-kl.de 14312027Sjungma@eit.uni-kl.desc_string_old::sc_string_old( const char* s ) : rep( new sc_string_rep(s) ) 14412027Sjungma@eit.uni-kl.de{ 14512027Sjungma@eit.uni-kl.de} 14612027Sjungma@eit.uni-kl.de 14712027Sjungma@eit.uni-kl.desc_string_old::sc_string_old( const char* s, int n ) : 14812027Sjungma@eit.uni-kl.de rep( new sc_string_rep( s, n ) ) 14912027Sjungma@eit.uni-kl.de{ 15012027Sjungma@eit.uni-kl.de} 15112027Sjungma@eit.uni-kl.de 15212027Sjungma@eit.uni-kl.desc_string_old::sc_string_old( const sc_string_old& s ) : rep( s.rep ) 15312027Sjungma@eit.uni-kl.de{ 15412027Sjungma@eit.uni-kl.de rep->ref_count ++; 15512027Sjungma@eit.uni-kl.de} 15612027Sjungma@eit.uni-kl.de 15712027Sjungma@eit.uni-kl.desc_string_old::sc_string_old( sc_string_rep* r ) : rep(r) 15812027Sjungma@eit.uni-kl.de{ 15912027Sjungma@eit.uni-kl.de} 16012027Sjungma@eit.uni-kl.de 16112027Sjungma@eit.uni-kl.de 16212027Sjungma@eit.uni-kl.de// destructor 16312027Sjungma@eit.uni-kl.de 16412027Sjungma@eit.uni-kl.desc_string_old::~sc_string_old() 16512027Sjungma@eit.uni-kl.de{ 16612027Sjungma@eit.uni-kl.de if( -- (rep->ref_count) == 0 ) { 16712027Sjungma@eit.uni-kl.de delete rep; 16812027Sjungma@eit.uni-kl.de } 16912027Sjungma@eit.uni-kl.de} 17012027Sjungma@eit.uni-kl.de 17112027Sjungma@eit.uni-kl.de 17212027Sjungma@eit.uni-kl.deint 17312027Sjungma@eit.uni-kl.desc_string_old::length() const 17412027Sjungma@eit.uni-kl.de{ 17512027Sjungma@eit.uni-kl.de return strlen(rep->str); 17612027Sjungma@eit.uni-kl.de} 17712027Sjungma@eit.uni-kl.de 17812027Sjungma@eit.uni-kl.desc_string_old 17912027Sjungma@eit.uni-kl.desc_string_old::operator+( const char* s ) const 18012027Sjungma@eit.uni-kl.de{ 18112027Sjungma@eit.uni-kl.de int len = length(); 18212027Sjungma@eit.uni-kl.de sc_string_rep* r = new sc_string_rep( len + strlen(s) + 1 ); 18312027Sjungma@eit.uni-kl.de strcpy( r->str, rep->str ); 18412027Sjungma@eit.uni-kl.de strcpy( r->str + len, s ); 18512027Sjungma@eit.uni-kl.de return sc_string_old(r); 18612027Sjungma@eit.uni-kl.de} 18712027Sjungma@eit.uni-kl.de 18812027Sjungma@eit.uni-kl.desc_string_old sc_string_old::operator+(char c) const 18912027Sjungma@eit.uni-kl.de{ 19012027Sjungma@eit.uni-kl.de int len = length(); 19112027Sjungma@eit.uni-kl.de sc_string_rep* r = new sc_string_rep( len + 2 ); 19212027Sjungma@eit.uni-kl.de strcpy( r->str, rep->str ); 19312027Sjungma@eit.uni-kl.de r->str[len] = c; 19412027Sjungma@eit.uni-kl.de r->str[len+1] = 00; 19512027Sjungma@eit.uni-kl.de return sc_string_old(r); 19612027Sjungma@eit.uni-kl.de} 19712027Sjungma@eit.uni-kl.de 19812027Sjungma@eit.uni-kl.desc_string_old 19912027Sjungma@eit.uni-kl.deoperator+( const char* s, const sc_string_old& t ) 20012027Sjungma@eit.uni-kl.de{ 20112027Sjungma@eit.uni-kl.de int len = strlen(s); 20212027Sjungma@eit.uni-kl.de sc_string_rep* r = new sc_string_rep( len + t.length() + 1 ); 20312027Sjungma@eit.uni-kl.de strcpy( r->str, s ); 20412027Sjungma@eit.uni-kl.de strcpy( r->str + len, t ); 20512027Sjungma@eit.uni-kl.de return sc_string_old(r); 20612027Sjungma@eit.uni-kl.de} 20712027Sjungma@eit.uni-kl.de 20812027Sjungma@eit.uni-kl.desc_string_old 20912027Sjungma@eit.uni-kl.desc_string_old::operator+( const sc_string_old& s ) const 21012027Sjungma@eit.uni-kl.de{ 21112027Sjungma@eit.uni-kl.de int len = length(); 21212027Sjungma@eit.uni-kl.de sc_string_rep* r = new sc_string_rep( len + s.length() + 1 ); 21312027Sjungma@eit.uni-kl.de strcpy( r->str, rep->str ); 21412027Sjungma@eit.uni-kl.de strcpy( r->str + len, s.rep->str ); 21512027Sjungma@eit.uni-kl.de return sc_string_old(r); 21612027Sjungma@eit.uni-kl.de} 21712027Sjungma@eit.uni-kl.de 21812027Sjungma@eit.uni-kl.desc_string_old& 21912027Sjungma@eit.uni-kl.desc_string_old::operator=( const char* s ) 22012027Sjungma@eit.uni-kl.de{ 22112027Sjungma@eit.uni-kl.de if (rep->ref_count > 1) { 22212027Sjungma@eit.uni-kl.de --rep->ref_count; 22312027Sjungma@eit.uni-kl.de rep = new sc_string_rep(s); 22412027Sjungma@eit.uni-kl.de } 22512027Sjungma@eit.uni-kl.de else { 22612027Sjungma@eit.uni-kl.de rep->set_string(s); 22712027Sjungma@eit.uni-kl.de } 22812027Sjungma@eit.uni-kl.de return *this; 22912027Sjungma@eit.uni-kl.de} 23012027Sjungma@eit.uni-kl.de 23112027Sjungma@eit.uni-kl.desc_string_old& 23212027Sjungma@eit.uni-kl.desc_string_old::operator=( const sc_string_old& s ) 23312027Sjungma@eit.uni-kl.de{ 23412027Sjungma@eit.uni-kl.de if (&s == this) 23512027Sjungma@eit.uni-kl.de return *this; 23612027Sjungma@eit.uni-kl.de if (--(rep->ref_count) == 0) 23712027Sjungma@eit.uni-kl.de delete rep; 23812027Sjungma@eit.uni-kl.de rep = s.rep; 23912027Sjungma@eit.uni-kl.de rep->ref_count++; 24012027Sjungma@eit.uni-kl.de return *this; 24112027Sjungma@eit.uni-kl.de} 24212027Sjungma@eit.uni-kl.de 24312027Sjungma@eit.uni-kl.desc_string_old& 24412027Sjungma@eit.uni-kl.desc_string_old::operator+=( const char* s ) 24512027Sjungma@eit.uni-kl.de{ 24612027Sjungma@eit.uni-kl.de int oldlen = length(); 24712027Sjungma@eit.uni-kl.de int slen = strlen(s); 24812027Sjungma@eit.uni-kl.de if (rep->ref_count > 1) { 24912027Sjungma@eit.uni-kl.de sc_string_rep* oldrep = rep; 25012027Sjungma@eit.uni-kl.de --rep->ref_count; 25112027Sjungma@eit.uni-kl.de rep = new sc_string_rep( oldlen + slen + 1 ); 25212027Sjungma@eit.uni-kl.de strcpy( rep->str, oldrep->str ); 25312027Sjungma@eit.uni-kl.de strcpy( rep->str + oldlen, s ); 25412027Sjungma@eit.uni-kl.de } 25512027Sjungma@eit.uni-kl.de else { 25612027Sjungma@eit.uni-kl.de rep->resize( oldlen + slen + 1 ); 25712027Sjungma@eit.uni-kl.de strcpy( rep->str + oldlen, s ); 25812027Sjungma@eit.uni-kl.de } 25912027Sjungma@eit.uni-kl.de return *this; 26012027Sjungma@eit.uni-kl.de} 26112027Sjungma@eit.uni-kl.de 26212027Sjungma@eit.uni-kl.desc_string_old& sc_string_old::operator+=(char c) 26312027Sjungma@eit.uni-kl.de{ 26412027Sjungma@eit.uni-kl.de int oldlen = length(); 26512027Sjungma@eit.uni-kl.de if (rep->ref_count > 1) { 26612027Sjungma@eit.uni-kl.de sc_string_rep* oldrep = rep; 26712027Sjungma@eit.uni-kl.de --rep->ref_count; 26812027Sjungma@eit.uni-kl.de rep = new sc_string_rep( oldlen + 2 ); 26912027Sjungma@eit.uni-kl.de strcpy( rep->str, oldrep->str ); 27012027Sjungma@eit.uni-kl.de rep->str[oldlen]=c; 27112027Sjungma@eit.uni-kl.de rep->str[oldlen+1]=00; 27212027Sjungma@eit.uni-kl.de } 27312027Sjungma@eit.uni-kl.de else { 27412027Sjungma@eit.uni-kl.de rep->resize( oldlen + 2 ); 27512027Sjungma@eit.uni-kl.de rep->str[oldlen]=c; 27612027Sjungma@eit.uni-kl.de rep->str[oldlen+1]=00; 27712027Sjungma@eit.uni-kl.de } 27812027Sjungma@eit.uni-kl.de return *this; 27912027Sjungma@eit.uni-kl.de} 28012027Sjungma@eit.uni-kl.de 28112027Sjungma@eit.uni-kl.desc_string_old& 28212027Sjungma@eit.uni-kl.desc_string_old::operator+=( const sc_string_old& s ) 28312027Sjungma@eit.uni-kl.de{ 28412027Sjungma@eit.uni-kl.de return this->operator+=( s.rep->str ); 28512027Sjungma@eit.uni-kl.de} 28612027Sjungma@eit.uni-kl.de 28712027Sjungma@eit.uni-kl.deint 28812027Sjungma@eit.uni-kl.desc_string_old::cmp( const char* s ) const 28912027Sjungma@eit.uni-kl.de{ 29012027Sjungma@eit.uni-kl.de return strcmp( rep->str, s ); 29112027Sjungma@eit.uni-kl.de} 29212027Sjungma@eit.uni-kl.de 29312027Sjungma@eit.uni-kl.deint 29412027Sjungma@eit.uni-kl.desc_string_old::cmp( const sc_string_old& s ) const 29512027Sjungma@eit.uni-kl.de{ 29612027Sjungma@eit.uni-kl.de return strcmp( rep->str, s.rep->str ); 29712027Sjungma@eit.uni-kl.de} 29812027Sjungma@eit.uni-kl.de 29912027Sjungma@eit.uni-kl.deconst char* sc_string_old::c_str() const 30012027Sjungma@eit.uni-kl.de{ 30112027Sjungma@eit.uni-kl.de return rep->str; 30212027Sjungma@eit.uni-kl.de} 30312027Sjungma@eit.uni-kl.de 30412027Sjungma@eit.uni-kl.de// get substring 30512027Sjungma@eit.uni-kl.desc_string_old sc_string_old::substr(int first,int last) const 30612027Sjungma@eit.uni-kl.de{ 30712027Sjungma@eit.uni-kl.de if(first<0 || last<0 || first>last || first>=length() || last>=length()) 30812027Sjungma@eit.uni-kl.de return ""; 30912027Sjungma@eit.uni-kl.de return sc_string_old(rep->str+first, last-first+1); 31012027Sjungma@eit.uni-kl.de} 31112027Sjungma@eit.uni-kl.de 31212027Sjungma@eit.uni-kl.de 31312027Sjungma@eit.uni-kl.desc_string_old sc_string_old::make_str(long n) // convert integer to string 31412027Sjungma@eit.uni-kl.de{ 31512027Sjungma@eit.uni-kl.de char buf[32]; 31612027Sjungma@eit.uni-kl.de ::std::sprintf(buf,"%ld",n); 31712027Sjungma@eit.uni-kl.de return sc_string_old(buf); 31812027Sjungma@eit.uni-kl.de} 31912027Sjungma@eit.uni-kl.de 32012027Sjungma@eit.uni-kl.de 32112027Sjungma@eit.uni-kl.de#define DEFINE_RELOP(op) \ 32212027Sjungma@eit.uni-kl.debool sc_string_old::operator op( const char* s ) const \ 32312027Sjungma@eit.uni-kl.de{ \ 32412027Sjungma@eit.uni-kl.de return strcmp( rep->str, s ) op 0; \ 32512027Sjungma@eit.uni-kl.de} \ 32612027Sjungma@eit.uni-kl.debool sc_string_old::operator op( const sc_string_old& s ) const \ 32712027Sjungma@eit.uni-kl.de{ \ 32812027Sjungma@eit.uni-kl.de return strcmp( rep->str, s.rep->str ) op 0; \ 32912027Sjungma@eit.uni-kl.de} 33012027Sjungma@eit.uni-kl.de 33112027Sjungma@eit.uni-kl.deDEFINE_RELOP(==) 33212027Sjungma@eit.uni-kl.deDEFINE_RELOP(!=) 33312027Sjungma@eit.uni-kl.deDEFINE_RELOP(<) 33412027Sjungma@eit.uni-kl.deDEFINE_RELOP(<=) 33512027Sjungma@eit.uni-kl.deDEFINE_RELOP(>) 33612027Sjungma@eit.uni-kl.deDEFINE_RELOP(>=) 33712027Sjungma@eit.uni-kl.de 33812027Sjungma@eit.uni-kl.desc_string_old::operator const char*() const 33912027Sjungma@eit.uni-kl.de{ 34012027Sjungma@eit.uni-kl.de return rep->str; 34112027Sjungma@eit.uni-kl.de} 34212027Sjungma@eit.uni-kl.de 34312027Sjungma@eit.uni-kl.dechar 34412027Sjungma@eit.uni-kl.desc_string_old::operator[]( int i ) const 34512027Sjungma@eit.uni-kl.de{ 34612027Sjungma@eit.uni-kl.de return rep->str[i]; 34712027Sjungma@eit.uni-kl.de} 34812027Sjungma@eit.uni-kl.de 34912027Sjungma@eit.uni-kl.dechar& sc_string_old::operator[]( int i ) 35012027Sjungma@eit.uni-kl.de{ 35112027Sjungma@eit.uni-kl.de if (rep->ref_count > 1) { 35212027Sjungma@eit.uni-kl.de rep->ref_count--; 35312027Sjungma@eit.uni-kl.de rep = new sc_string_rep(rep->str); 35412027Sjungma@eit.uni-kl.de } 35512027Sjungma@eit.uni-kl.de return rep->str[i]; 35612027Sjungma@eit.uni-kl.de} 35712027Sjungma@eit.uni-kl.de 35812027Sjungma@eit.uni-kl.devoid 35912027Sjungma@eit.uni-kl.desc_string_old::set( int i, char c ) 36012027Sjungma@eit.uni-kl.de{ 36112027Sjungma@eit.uni-kl.de if (rep->ref_count > 1) { 36212027Sjungma@eit.uni-kl.de rep->ref_count--; 36312027Sjungma@eit.uni-kl.de rep = new sc_string_rep(rep->str); 36412027Sjungma@eit.uni-kl.de } 36512027Sjungma@eit.uni-kl.de rep->str[i] = c; 36612027Sjungma@eit.uni-kl.de} 36712027Sjungma@eit.uni-kl.de 36812027Sjungma@eit.uni-kl.de#if defined(_MSC_VER) 36912027Sjungma@eit.uni-kl.de // Windows provides safer implementation 37012027Sjungma@eit.uni-kl.de# define sc_vsnprintf _vsnprintf 37112027Sjungma@eit.uni-kl.de#else 37212027Sjungma@eit.uni-kl.de# define sc_vsnprintf vsnprintf 37312027Sjungma@eit.uni-kl.de#endif 37412027Sjungma@eit.uni-kl.de 37512027Sjungma@eit.uni-kl.desc_string_old sc_string_old::to_string(const char* format, ...) 37612027Sjungma@eit.uni-kl.de{ 37712027Sjungma@eit.uni-kl.de va_list argptr; 37812027Sjungma@eit.uni-kl.de sc_string_old result; 37912027Sjungma@eit.uni-kl.de char buffer[1024]; // static string buffer 38012027Sjungma@eit.uni-kl.de buffer[1023]=000; 38112027Sjungma@eit.uni-kl.de 38212027Sjungma@eit.uni-kl.de va_start(argptr, format); 38312027Sjungma@eit.uni-kl.de int cnt = sc_vsnprintf(buffer, 1024, format, argptr); 38412027Sjungma@eit.uni-kl.de if(cnt>1023) // string too long 38512027Sjungma@eit.uni-kl.de { 38612027Sjungma@eit.uni-kl.de int buf_size = 1024; 38712027Sjungma@eit.uni-kl.de const int max_size = 65000; 38812027Sjungma@eit.uni-kl.de char* buf = 0; // dynamic string buffer 38912027Sjungma@eit.uni-kl.de do 39012027Sjungma@eit.uni-kl.de { 39112027Sjungma@eit.uni-kl.de delete[] buf; 39212027Sjungma@eit.uni-kl.de buf_size*=2; 39312027Sjungma@eit.uni-kl.de buf = new char[buf_size]; 39412027Sjungma@eit.uni-kl.de cnt = sc_vsnprintf(buf, buf_size, format, argptr); 39512027Sjungma@eit.uni-kl.de } 39612027Sjungma@eit.uni-kl.de while( buf_size<max_size && cnt>=buf_size); 39712027Sjungma@eit.uni-kl.de if(cnt>=buf_size) 39812027Sjungma@eit.uni-kl.de { 39912027Sjungma@eit.uni-kl.de // string is longer the the maximum buffer size (max_size) 40012027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( sc_core::SC_ID_STRING_TOO_LONG_, "truncated" ); 40112027Sjungma@eit.uni-kl.de buf[buf_size-1] = 000; 40212027Sjungma@eit.uni-kl.de } 40312027Sjungma@eit.uni-kl.de result = buf; 40412027Sjungma@eit.uni-kl.de delete[] buf; 40512027Sjungma@eit.uni-kl.de } 40612027Sjungma@eit.uni-kl.de else 40712027Sjungma@eit.uni-kl.de result = buffer; 40812027Sjungma@eit.uni-kl.de 40912027Sjungma@eit.uni-kl.de va_end(argptr); 41012027Sjungma@eit.uni-kl.de 41112027Sjungma@eit.uni-kl.de return result; 41212027Sjungma@eit.uni-kl.de} 41312027Sjungma@eit.uni-kl.de 41412027Sjungma@eit.uni-kl.devoid 41512027Sjungma@eit.uni-kl.desc_string_old::print( ::std::ostream& os ) const 41612027Sjungma@eit.uni-kl.de{ 41712027Sjungma@eit.uni-kl.de os << rep->str; 41812027Sjungma@eit.uni-kl.de} 41912027Sjungma@eit.uni-kl.de 42012027Sjungma@eit.uni-kl.devoid sc_string_old::test(int position)const 42112027Sjungma@eit.uni-kl.de{ 42212027Sjungma@eit.uni-kl.de if(position<0 || position>=length()) 42312027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, "sc_string_old::test" ); 42412027Sjungma@eit.uni-kl.de} 42512027Sjungma@eit.uni-kl.de 42612027Sjungma@eit.uni-kl.de// TODO: conveniece formatting functions for common types 42712027Sjungma@eit.uni-kl.de// e.g. sc_string_old("a=%d, s is %s").fmt(1).fmt("string") 42812027Sjungma@eit.uni-kl.de// should produce a=1, s is string 42912027Sjungma@eit.uni-kl.de// it should be safe: if less arguments specified 43012027Sjungma@eit.uni-kl.de// it should print %specifier; extra arguments should be ignored 43112027Sjungma@eit.uni-kl.de// if the type of the argument is incompatible with format 43212027Sjungma@eit.uni-kl.de// specifier it should be ignored 43312027Sjungma@eit.uni-kl.de// 43412027Sjungma@eit.uni-kl.de 43512027Sjungma@eit.uni-kl.deunsigned 43612027Sjungma@eit.uni-kl.desc_string_old::fmt_length()const 43712027Sjungma@eit.uni-kl.de{ 43812027Sjungma@eit.uni-kl.de unsigned result=0; 43912027Sjungma@eit.uni-kl.de if((*this)[0]!='%') 44012027Sjungma@eit.uni-kl.de return 0; 44112027Sjungma@eit.uni-kl.de else 44212027Sjungma@eit.uni-kl.de result++; 44312027Sjungma@eit.uni-kl.de if(is_delimiter("-+0 #",result)) // flags 44412027Sjungma@eit.uni-kl.de result++; 44512027Sjungma@eit.uni-kl.de while(is_delimiter("0123456789*",result)) // width 44612027Sjungma@eit.uni-kl.de result++; 44712027Sjungma@eit.uni-kl.de if(rep->str[result]=='.') // precision 44812027Sjungma@eit.uni-kl.de { 44912027Sjungma@eit.uni-kl.de result++; 45012027Sjungma@eit.uni-kl.de unsigned old_result = result; 45112027Sjungma@eit.uni-kl.de while(is_delimiter("0123456789*",result)) result++; 45212027Sjungma@eit.uni-kl.de if(old_result == result) //error in format 45312027Sjungma@eit.uni-kl.de return 0; 45412027Sjungma@eit.uni-kl.de } 45512027Sjungma@eit.uni-kl.de if(is_delimiter("hlL",result)) result++; // I64 is not supported 45612027Sjungma@eit.uni-kl.de if(is_delimiter("cCdiouxXeEfgGnpsS",result)) 45712027Sjungma@eit.uni-kl.de result++; 45812027Sjungma@eit.uni-kl.de else // error in format 45912027Sjungma@eit.uni-kl.de return 0; 46012027Sjungma@eit.uni-kl.de return result; 46112027Sjungma@eit.uni-kl.de} 46212027Sjungma@eit.uni-kl.de 46312027Sjungma@eit.uni-kl.desc_string_old& 46412027Sjungma@eit.uni-kl.desc_string_old::fmt(const sc_string_old& s) 46512027Sjungma@eit.uni-kl.de{ 46612027Sjungma@eit.uni-kl.de return fmt(s.c_str()); 46712027Sjungma@eit.uni-kl.de} 46812027Sjungma@eit.uni-kl.de 46912027Sjungma@eit.uni-kl.deint 47012027Sjungma@eit.uni-kl.desc_string_old::pos( const sc_string_old& sub_string ) const 47112027Sjungma@eit.uni-kl.de{ 47212027Sjungma@eit.uni-kl.de int sub_len = sub_string.length(); 47312027Sjungma@eit.uni-kl.de if( sub_len == 0 ) { 47412027Sjungma@eit.uni-kl.de return 0; // empty string always matches 47512027Sjungma@eit.uni-kl.de } 47612027Sjungma@eit.uni-kl.de int ind = 0; 47712027Sjungma@eit.uni-kl.de int len = length(); 47812027Sjungma@eit.uni-kl.de bool found = false; 47912027Sjungma@eit.uni-kl.de while( ind < len && ! found ) 48012027Sjungma@eit.uni-kl.de { 48112027Sjungma@eit.uni-kl.de found = ( sub_string == substr( ind, ind + sub_len - 1 ) ); 48212027Sjungma@eit.uni-kl.de ++ ind; 48312027Sjungma@eit.uni-kl.de } 48412027Sjungma@eit.uni-kl.de if( found ) { 48512027Sjungma@eit.uni-kl.de return -- ind; 48612027Sjungma@eit.uni-kl.de } else { 48712027Sjungma@eit.uni-kl.de return -1; 48812027Sjungma@eit.uni-kl.de } 48912027Sjungma@eit.uni-kl.de} 49012027Sjungma@eit.uni-kl.de 49112027Sjungma@eit.uni-kl.desc_string_old& 49212027Sjungma@eit.uni-kl.desc_string_old::remove(unsigned index, unsigned length) 49312027Sjungma@eit.uni-kl.de{ 49412027Sjungma@eit.uni-kl.de test((int)index); 49512027Sjungma@eit.uni-kl.de if(length!=0) 49612027Sjungma@eit.uni-kl.de (*this) = substr(0,index-1) + substr(index+length,this->length()-1); 49712027Sjungma@eit.uni-kl.de return *this; 49812027Sjungma@eit.uni-kl.de} 49912027Sjungma@eit.uni-kl.de 50012027Sjungma@eit.uni-kl.desc_string_old& 50112027Sjungma@eit.uni-kl.desc_string_old::insert(const sc_string_old& sub_string, unsigned index) 50212027Sjungma@eit.uni-kl.de{ 50312027Sjungma@eit.uni-kl.de if(index>(unsigned)length()) 50412027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, "sc_string_old::insert" ); 50512027Sjungma@eit.uni-kl.de return (*this) = substr(0,index-1)+sub_string+substr(index,length()-1); 50612027Sjungma@eit.uni-kl.de} 50712027Sjungma@eit.uni-kl.de 50812027Sjungma@eit.uni-kl.debool 50912027Sjungma@eit.uni-kl.desc_string_old::is_delimiter(const sc_string_old& str, unsigned index)const 51012027Sjungma@eit.uni-kl.de{ 51112027Sjungma@eit.uni-kl.de test((int)index); 51212027Sjungma@eit.uni-kl.de return str.contains(rep->str[index]); 51312027Sjungma@eit.uni-kl.de} 51412027Sjungma@eit.uni-kl.de 51512027Sjungma@eit.uni-kl.debool 51612027Sjungma@eit.uni-kl.desc_string_old::contains(char c)const 51712027Sjungma@eit.uni-kl.de{ 51812027Sjungma@eit.uni-kl.de int len = length(); 51912027Sjungma@eit.uni-kl.de int i=0; 52012027Sjungma@eit.uni-kl.de bool found = false; 52112027Sjungma@eit.uni-kl.de while(!found && i<len) 52212027Sjungma@eit.uni-kl.de found = rep->str[i++]==c; 52312027Sjungma@eit.uni-kl.de return found; 52412027Sjungma@eit.uni-kl.de} 52512027Sjungma@eit.uni-kl.de 52612027Sjungma@eit.uni-kl.desc_string_old 52712027Sjungma@eit.uni-kl.desc_string_old::uppercase()const 52812027Sjungma@eit.uni-kl.de{ 52912027Sjungma@eit.uni-kl.de int len = length(); 53012027Sjungma@eit.uni-kl.de sc_string_old temp(*this); 53112027Sjungma@eit.uni-kl.de for(int i=0; i<len; i++) 53212027Sjungma@eit.uni-kl.de { 53312027Sjungma@eit.uni-kl.de char c = temp.rep->str[i]; 53412027Sjungma@eit.uni-kl.de if(c>='a' && c<='z') 53512027Sjungma@eit.uni-kl.de temp.rep->str[i] = static_cast<char>( c-32 ); 53612027Sjungma@eit.uni-kl.de } 53712027Sjungma@eit.uni-kl.de return temp; 53812027Sjungma@eit.uni-kl.de} 53912027Sjungma@eit.uni-kl.de 54012027Sjungma@eit.uni-kl.desc_string_old 54112027Sjungma@eit.uni-kl.desc_string_old::lowercase()const 54212027Sjungma@eit.uni-kl.de{ 54312027Sjungma@eit.uni-kl.de int len = length(); 54412027Sjungma@eit.uni-kl.de sc_string_old temp(*this); 54512027Sjungma@eit.uni-kl.de for(int i=0; i<len; i++) 54612027Sjungma@eit.uni-kl.de { 54712027Sjungma@eit.uni-kl.de char c = temp.rep->str[i]; 54812027Sjungma@eit.uni-kl.de if(c>='A' && c<='Z') 54912027Sjungma@eit.uni-kl.de temp.rep->str[i] = static_cast<char>( c+32 ); 55012027Sjungma@eit.uni-kl.de } 55112027Sjungma@eit.uni-kl.de return temp; 55212027Sjungma@eit.uni-kl.de} 55312027Sjungma@eit.uni-kl.de 55412027Sjungma@eit.uni-kl.de 55512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 55612027Sjungma@eit.uni-kl.de 55712027Sjungma@eit.uni-kl.de::std::istream& 55812027Sjungma@eit.uni-kl.deoperator >> ( ::std::istream& is, sc_string_old& s ) 55912027Sjungma@eit.uni-kl.de{ 56012027Sjungma@eit.uni-kl.de if( s.rep->ref_count > 1 ) { 56112027Sjungma@eit.uni-kl.de -- s.rep->ref_count; 56212027Sjungma@eit.uni-kl.de s.rep = new sc_string_rep; 56312027Sjungma@eit.uni-kl.de } 56412027Sjungma@eit.uni-kl.de 56512027Sjungma@eit.uni-kl.de int i = 0; 56612027Sjungma@eit.uni-kl.de char* p = s.rep->str; 56712027Sjungma@eit.uni-kl.de char c; 56812027Sjungma@eit.uni-kl.de 56912027Sjungma@eit.uni-kl.de // skip white spaces 57012027Sjungma@eit.uni-kl.de while( is.get( c ) && isspace( c ) ) 57112027Sjungma@eit.uni-kl.de ; 57212027Sjungma@eit.uni-kl.de 57312027Sjungma@eit.uni-kl.de for( ; is.good() && ! isspace( c ); is.get( c ) ) { 57412027Sjungma@eit.uni-kl.de if( i > s.rep->alloc - 2 ) { 57512027Sjungma@eit.uni-kl.de s.rep->str[i] = '\0'; 57612027Sjungma@eit.uni-kl.de s.rep->resize( (int) (s.rep->alloc * 1.5) ); 57712027Sjungma@eit.uni-kl.de p = s.rep->str + i; 57812027Sjungma@eit.uni-kl.de } 57912027Sjungma@eit.uni-kl.de *p ++ = c; 58012027Sjungma@eit.uni-kl.de i ++; 58112027Sjungma@eit.uni-kl.de } 58212027Sjungma@eit.uni-kl.de *p = '\0'; 58312027Sjungma@eit.uni-kl.de 58412027Sjungma@eit.uni-kl.de return is; 58512027Sjungma@eit.uni-kl.de} 58612027Sjungma@eit.uni-kl.de } // namespace sc_dt 58712027Sjungma@eit.uni-kl.de 58812027Sjungma@eit.uni-kl.de// $Log: sc_string.cpp,v $ 58912027Sjungma@eit.uni-kl.de// Revision 1.6 2011/08/29 18:04:32 acg 59012027Sjungma@eit.uni-kl.de// Philipp A. Hartmann: miscellaneous clean ups. 59112027Sjungma@eit.uni-kl.de// 59212027Sjungma@eit.uni-kl.de// Revision 1.5 2011/08/26 22:49:42 acg 59312027Sjungma@eit.uni-kl.de// Torsten Maehne: remove redudant assignment. 59412027Sjungma@eit.uni-kl.de// 59512027Sjungma@eit.uni-kl.de// Revision 1.4 2011/08/26 20:46:19 acg 59612027Sjungma@eit.uni-kl.de// Andy Goodrich: moved the modification log to the end of the file to 59712027Sjungma@eit.uni-kl.de// eliminate source line number skew when check-ins are done. 59812027Sjungma@eit.uni-kl.de// 59912027Sjungma@eit.uni-kl.de// Revision 1.3 2011/08/24 22:05:56 acg 60012027Sjungma@eit.uni-kl.de// Torsten Maehne: initialization changes to remove warnings. 60112027Sjungma@eit.uni-kl.de// 60212027Sjungma@eit.uni-kl.de// Revision 1.2 2011/02/18 20:38:44 acg 60312027Sjungma@eit.uni-kl.de// Andy Goodrich: Updated Copyright notice. 60412027Sjungma@eit.uni-kl.de// 60512027Sjungma@eit.uni-kl.de// Revision 1.1.1.1 2006/12/15 20:20:06 acg 60612027Sjungma@eit.uni-kl.de// SystemC 2.3 60712027Sjungma@eit.uni-kl.de// 60812027Sjungma@eit.uni-kl.de// Revision 1.3 2006/01/13 18:53:11 acg 60912027Sjungma@eit.uni-kl.de// Andy Goodrich: Added $Log command so that CVS comments are reproduced in 61012027Sjungma@eit.uni-kl.de// the source. 61112027Sjungma@eit.uni-kl.de 61212027Sjungma@eit.uni-kl.de// taf 613