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