String Implementation: Builders
void String::Wrap(const char* Cptr)
{
Clear();
if (Cptr)
{
size_ = StrLen(Cptr);
data_ = NewCstr(size_);
StrCpy(data_, Cptr);
}
}
void String::GetLine (std::istream& is)
{
size_t currSize = 0, buffSize = initBuffSize;
char* buffer;
buffer = NewCstr(buffSize);
char x = is.get();
while ((x != '\n') && (!is.eof()))
{
if (currSize == buffSize) // need more buffer
{
buffSize *= 2;
char* newbuffer = NewCstr(buffSize);
for (size_t i = 0; i < currSize; ++i)
{
newbuffer[i] = buffer[i];
}
delete [] buffer;
buffer = newbuffer;
}
buffer[currSize++] = x;
x = is.get();
}
buffer[currSize] = '\0';
Wrap(buffer);
delete [] buffer;
}
int String::SetSize (size_t size, char fill)
{
if (data_ == 0)
{
data_ = NewCstr(size);
if (data_ == 0) return 0;
size_ = size;
for (size_t j = 0; j < size_; ++j)
data_[j] = fill;
return 1;
}
if (size != Size())
{
char* newdata = NewCstr(size);
if (newdata == 0) return 0;
size_t i;
if (size < Size())
{
for (i = 0; i < size; ++i)
newdata[i] = data_[i];
}
else
{
for (i = 0; i < Size(); ++i)
newdata[i] = data_[i];
for (i = Size(); i < size; ++i)
newdata[i] = fill;
}
delete [] data_;
data_ = newdata;
size_ = size;
}
return 1;
}
void String::Clear()
{
// Debug d("Clear()");
if (data_)
{
delete [] data_;
data_ = 0;
size_ = 0;
}
}