$include "clsDynString.inc"

sub DynString::DynString( )
	pstr = new(char, 1)
	allocsize = 1
	s_length = 0
end sub

sub DynString::_DynString( )
	delete pstr
end sub

sub DynString::set( DynString s )
	setz( s.c_str( ) )
end sub

sub DynString::setz( string s )
	uint slen : slen = len( s )

	if slen = 0 then
		*<char>pstr[0] = 0
		s_length = 0
	end if

	if slen >= allocsize then
		allocsize = slen + 1
		delete pstr
		pstr = new( char, allocsize )
	end if

	*<string>pstr = s
	s_length = slen
end sub

sub DynString::append( DynString s )
	appendz( s.c_str( ) )
end sub

sub DynString::appendz( string s )
	uint slen : slen = len( s )

	if slen + s_length >= allocsize then
		if 2 * allocsize > slen then _
			allocsize *= 2 _
		else _
			allocsize += slen * 2

		pointer temp : temp = new( char, s_length + 1 )
		*<string>temp = *<string>pstr
		delete pstr
		pstr = new( char, allocsize )
		*<string>pstr = *<string>temp
		delete temp
	end if

	*<string>pstr += s
	s_length += slen
end sub

sub DynString::c_str( )
	return *<string>pstr
end sub

sub DynString::length( )
	return s_length
end sub