Beispiel #1
0
void festring::EnsureOwnsData(bool Unique)
{
  if(!OwnsData)
    CreateOwnData(Data, Size);
  else if(Unique && REFS(Data))
  {
    --REFS(Data);
    CreateOwnData(Data, Size);
  }
}
Beispiel #2
0
void festring::SlowAppend(const char* CStr, sizetype N)
{
    char* OldPtr = Data;

    if(OldPtr)
    {
        sizetype OldSize = Size;
        sizetype NewSize = OldSize + N;
        Size = NewSize;
        ulong* DeletePtr = 0;

        if(OwnsData && !REFS(OldPtr)--)
            DeletePtr = &REFS(OldPtr);

        Reserved = NewSize|FESTRING_PAGE;
        char* NewPtr = sizeof(ulong) + new char[Reserved + sizeof(ulong) + 1];
        REFS(NewPtr) = 0;
        Data = NewPtr;
        memcpy(NewPtr, OldPtr, OldSize);
        memcpy(NewPtr + OldSize, CStr, N);
        OwnsData = true;

        if(DeletePtr)
            delete [] DeletePtr;
    }
    else
        CreateOwnData(CStr, N);
}
Beispiel #3
0
festring& festring::operator=(cchar* CStr)
{DBGEXEC(bugTrackInvalidChars(CStr,strlen(CStr)));
  CheckNull(CStr);

  sizetype NewSize = strlen(CStr);

  if(OwnsData)
  {
    if(!REFS(Data) && NewSize <= Reserved)
    {
      memcpy(Data, CStr, NewSize);
      Size = NewSize;
      return *this;
    }

    if(!REFS(Data)--)
      delete [] &REFS(Data);
  }

  if(NewSize)
    CreateOwnData(CStr, NewSize);
  else
    Empty();

  return *this;
}
Beispiel #4
0
festring& festring::operator=(cfestring& Str)
{DBGEXEC(bugTrackInvalidChars(Str.Data,Str.Size));
  char* CStr = Str.Data;
  sizetype NewSize = Str.Size;

  if(OwnsData)
  {
    if(!REFS(Data) && NewSize <= Reserved)
    {
      memcpy(Data, CStr, NewSize);
      Size = NewSize;
      return *this;
    }

    if(!REFS(Data)--)
      delete [] &REFS(Data);
  }

  Size = NewSize;
  Data = CStr;
  OwnsData = Str.OwnsData;

  if(OwnsData)
  {
    if(REFS(Data) < FESTRING_REF_MAX)
    {
      ++REFS(Data);
      Reserved = Str.Reserved;
    }
    else
      CreateOwnData(CStr, NewSize);
  }

  return *this;
}
Beispiel #5
0
festring& festring::Capitalize()
{
    char* OldPtr = Data;

    if(*OldPtr > 0x60 && *OldPtr < 0x7B)
    {
        if(!OwnsData)
            CreateOwnData(OldPtr, Size);
        else if(REFS(OldPtr))
        {
            --REFS(OldPtr);
            CreateOwnData(OldPtr, Size);
        }

        *Data ^= 0x20;
    }

    return *this;
}
Beispiel #6
0
/// Resize the string and use a char for padding.
void festring::Resize(sizetype NewSize, char Char)
{
  if(Size > NewSize)
  {
    if(OwnsData)
    {
      if(!REFS(Data))
      {
        Size = NewSize;
        return;
      }

      --REFS(Data);
    }

    CreateOwnData(Data, NewSize);
    return;
  }
  else if(Size < NewSize)
  {
    char* OldData = Data;
    sizetype OldSize = Size;
    decltype(&REFS(Data)) FreePtr = 0;

    if(OwnsData)
    {
      if(!REFS(OldData))
      {
        if(NewSize <= Reserved)
        {
          memset(OldData + OldSize, Char, NewSize - OldSize);
          Size = NewSize;
          return;
        }
        else
          FreePtr = &REFS(OldData);
      }
      else
        --REFS(OldData);
    }

    CreateNewData(NewSize);
    memcpy(Data, OldData, OldSize);
    memset(Data + OldSize, Char, NewSize - OldSize);
    Size = NewSize;

    if(FreePtr)
      delete [] FreePtr;
  }
  else
    return;
}
Beispiel #7
0
void festring::EnsureOwnsData()
{
    if(!OwnsData)
        CreateOwnData(Data, Size);
}