Beispiel #1
0
char* StringImp::ReallocateData(Subscript Bytes_)
{
  STRMARKER("start: StringImp::ReallocateData(Subscript)", cout)

  StringData* DisOwnedData_;
  Boolean InvalidData_ = _StrData->data == StringData::DummyData() || !_StrData->data;

  if ((DisOwnedData_ = ShouldDisOwnData()) || InvalidData_)
  {
    char* OldData_ = _StrData->data;
    Subscript OldLen_ = _StrData->Length();

    _StrData->data = StringData::AllocateStr(Bytes_);

    if (!InvalidData_)
      SafeMemMove(_StrData->data, OldData_, OldLen_);

    TerminateString(OldLen_);
    DisOwnSharedData(DisOwnedData_);	// Do disowning only at end
  }
  else
    _StrData->data = StringData::ReallocateStr(_StrData->data, Bytes_);

  _StrData->_Size = Bytes_;

  STRMARKER("end: StringImp::ReallocateData(Subscript)", cout)
  return _StrData->data;
}
Beispiel #2
0
void StringImp::Assignment(char Chr_)
{
    if (_StrData->_Size < 1)
      ReallocateData(1);

    _StrData->data[0] = Chr_;
    TerminateString(1);
}
Beispiel #3
0
void StringImp::Delete(Subscript pos, Subscript len)
{
  if (pos >= strlen() || pos < 0 || len <= 0)
    return;

  Subscript RemLen_ = strlen() - pos;

  if (RemLen_ <= len)
  {
    TerminateString(pos);
    return;
  }

  Subscript Remain_ = strlen() - (pos + len);
  char* Base_ = _StrData->data + pos;
  memmove(Base_, &Base_[len], Remain_);
  TerminateString(pos + Remain_);
}
Beispiel #4
0
void StringImp::LeftJustify(Subscript FieldWidth_, char Pad_)
{
  if (_StrData->_Size < FieldWidth_)
    ReallocateData(FieldWidth_);

  Subscript Index_;
  for (Index_ = strlen(); Index_ < FieldWidth_; Index_++)
    (*_StrData)[Index_] = Pad_;

  TerminateString(Index_);
}
Beispiel #5
0
void StringImp::Assignment(const char* Str_, Subscript Len_)
{
    if (_StrData->data != Str_)
    {
	if (_StrData->_Size < Len_)
	  ReallocateData(Len_);

	SafeMemMove(_StrData->data, Str_, Len_);
	TerminateString(Len_);
    }
}
Beispiel #6
0
BOOL StringsEqualN( LPTSTR pszStr1, LPTSTR pszStr2, int len )
/************************************************************************/
{
    int     len1, len2;
    FNAME	psz1, psz2;

    len1 = lstrlen( pszStr1 );
    len2 = lstrlen( pszStr2 );

    if( len1 < len || len2 < len )
	    return( NO );

    lstrcpy( psz1, pszStr1 );
    TerminateString( psz1, len );

    lstrcpy( psz2, pszStr2 );
    TerminateString( psz2, len );

    return StringsEqual( psz1, psz2 );
}
Beispiel #7
0
void StringImp::Addition(const StringImp& rhs)
{
    int Identical_ = (this == &rhs);
    StringImp* StrPtr_ = Identical_ ? (StringImp*)rhs.Clone():((StringImp*)&rhs);
    Subscript NewLen_ = strlen() + StrPtr_->strlen();

    if (_StrData->_Size < NewLen_)
      ReallocateData(NewLen_);

    SafeMemMove(_StrData->data + strlen(), StrPtr_->_StrData->data, StrPtr_->strlen());
    TerminateString(NewLen_);

    if (Identical_)
      delete StrPtr_;
}
Beispiel #8
0
void StringImp::Duplicate(Subscript Num_)
{
  if (_StrData->_Size < strlen() * (Num_ + 1))
    ReallocateData(strlen() * (Num_ + 1));

  char *Startp_, *Endp_;
  Startp_ = _StrData->data;
  Endp_ = &_StrData->data[strlen()];

  for (Subscript Index_ = 0, Len_ = strlen(); Index_ < Num_; Index_++)
    for (Subscript Letter_ = 0; Letter_ < Len_; Letter_++)
      *Endp_++ = *Startp_++;

  TerminateString(Endp_ - _StrData->data);
}
Beispiel #9
0
void StringImp::Subtraction(const StringImp& rhs)
{
  int Identical_ = (this == &rhs);
  StringImp* StrPtr_ = Identical_ ? (StringImp*)rhs.Clone():((StringImp*)&rhs);

  if (strlen() >= StrPtr_->strlen())
  {
    Subscript Index_ = strlen();
    Index_ -= StrPtr_->strlen();

    if (!memcmp(&_StrData->data[Index_], StrPtr_->_StrData->data, StrPtr_->strlen()))
      TerminateString(Index_);
  }

  if (Identical_)
    delete StrPtr_;
}
Beispiel #10
0
void StringImp::Append(const StringImp& rhs, Subscript RunLen_)
{
    if (RunLen_ > rhs.strlen())
      RunLen_ = rhs.strlen();

    int Identical_ = (this == &rhs);
    StringImp* StrPtr_ = Identical_ ? (StringImp*)rhs.Clone():((StringImp*)&rhs);
    Subscript OldLen_ = strlen();

    if (_StrData->_Size < OldLen_ + RunLen_)
      ReallocateData(OldLen_ + RunLen_);

    SafeMemMove(&_StrData->data[OldLen_], StrPtr_->_StrData->data, RunLen_);
    TerminateString(OldLen_ + RunLen_);

    if (Identical_)
      delete StrPtr_;
}
Beispiel #11
0
void StringImp::OverWrite(Subscript pos, const StringImp& Str_)
{
  int Identical_ = (this == &Str_);
  StringImp* StrPtr_ = Identical_ ? (StringImp*)Str_.Clone():((StringImp*)&Str_);

  if (pos > strlen() || pos < 0)
    return;

  if (_StrData->_Size < pos + StrPtr_->strlen())
    ReallocateData(StrPtr_->strlen() + pos);

  if (strlen() - pos < StrPtr_->strlen())
    TerminateString(pos + StrPtr_->strlen());

  SafeMemMove(&_StrData->data[pos], StrPtr_->c_str(), StrPtr_->strlen());

  if (Identical_)
    delete StrPtr_;
}
Beispiel #12
0
void StringImp::CenterJustify(Subscript FieldWidth_, char Pad_)
{
  Subscript PadLen_ = (FieldWidth_ - strlen()) / 2;

  if (_StrData->_Size < FieldWidth_)
    ReallocateData(FieldWidth_);

  Subscript WordLen_ = strlen();
  SafeMemMove(&_StrData->data[PadLen_], _StrData->data, WordLen_);

  Subscript Index_;
  for (Index_ = 0; Index_ < PadLen_; Index_++)
    (*_StrData)[Index_] = Pad_;

  for (Index_ += WordLen_; Index_ < FieldWidth_; Index_++)
    (*_StrData)[Index_] = Pad_;

  TerminateString(Index_);
}
Beispiel #13
0
void StringImp::SetStr(const char* p, Subscript pos, Subscript len)
{
  if (!p)
    return;

  Subscript p_len = strlen();
  if (pos > p_len)			// error check the start pos
    return;

  Subscript strLen = p_len - pos;
  if (len < strLen)			// error check the copy length
    strLen = len;

  if (_StrData->_Size < strLen)		// else create a new buffer
    ReallocateData(strLen);

  SafeMemMove(_StrData->data, p + pos, strLen);
  TerminateString(strLen);
}
Beispiel #14
0
void StringImp::Assignment(const StringImp& Str_)
{
    if (_StrData->data != Str_._StrData->data)
    {
	int Identical_ = (this == &Str_);
	StringImp* StrPtr_ = Identical_ ? (StringImp*)Str_.Clone():((StringImp*)&Str_);
	Subscript NewLen_ = StrPtr_->strlen();

	if (_StrData->_Size < NewLen_)
	  ReallocateData(NewLen_);

	SafeMemMove(_StrData->data, StrPtr_->_StrData->data, NewLen_);
	TerminateString(NewLen_);

	ObjectImp::operator = (*((Object*)StrPtr_));

	if (Identical_)
	  delete StrPtr_;
    }
}
Beispiel #15
0
void StringImp::Insert(Subscript pos, const StringImp& Str_)
{
  int Identical_ = (this == &Str_);
  StringImp* StrPtr_ = Identical_ ? (StringImp*)Str_.Clone():((StringImp*)&Str_);

  if (pos > strlen() || pos < 0)
    return;

  if (_StrData->_Size < StrPtr_->strlen() + strlen())
    ReallocateData(StrPtr_->strlen() + strlen());

  char* Base_ = _StrData->data + pos;
  Subscript BaseLen_ = strlen() - pos;
  Subscript StopPt_ = BaseLen_ + StrPtr_->strlen();

  SafeMemMove(&Base_[StrPtr_->strlen()], Base_, BaseLen_);
  SafeMemMove(Base_, StrPtr_->c_str(), StrPtr_->strlen());
  TerminateString(pos + StopPt_);

  if (Identical_)
    delete StrPtr_;
}