10c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com/*
20c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.comwww.sourceforge.net/projects/tinyxml
30c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
40c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.comThis software is provided 'as-is', without any express or implied
50c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.comwarranty. In no event will the authors be held liable for any
60c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.comdamages arising from the use of this software.
70c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
80c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.comPermission is granted to anyone to use this software for any
90c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.compurpose, including commercial applications, and to alter it and
100c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.comredistribute it freely, subject to the following restrictions:
110c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
120c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com1. The origin of this software must not be misrepresented; you must
130c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.comnot claim that you wrote the original software. If you use this
140c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.comsoftware in a product, an acknowledgment in the product documentation
150c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.comwould be appreciated but is not required.
160c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
170c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com2. Altered source versions must be plainly marked as such, and
180c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.commust not be misrepresented as being the original software.
190c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
200c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com3. This notice may not be removed or altered from any source
210c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.comdistribution.
220c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com*/
230c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
240c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
250c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com#ifndef TIXML_USE_STL
260c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
270c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com#include "tinystr.h"
280c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
290c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com// Error value for find primitive
300c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.comconst TiXmlString::size_type TiXmlString::npos = static_cast< TiXmlString::size_type >(-1);
310c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
320c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
330c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com// Null rep.
340c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.comTiXmlString::Rep TiXmlString::nullrep_ = { 0, 0, { '\0' } };
350c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
360c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
370c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.comvoid TiXmlString::reserve (size_type cap)
380c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com{
390c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	if (cap > capacity())
400c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	{
410c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com		TiXmlString tmp;
420c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com		tmp.init(length(), cap);
430c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com		memcpy(tmp.start(), data(), length());
440c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com		swap(tmp);
450c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	}
460c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com}
470c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
480c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
490c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.comTiXmlString& TiXmlString::assign(const char* str, size_type len)
500c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com{
510c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	size_type cap = capacity();
520c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	if (len > cap || cap > 3*(len + 8))
530c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	{
540c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com		TiXmlString tmp;
550c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com		tmp.init(len);
560c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com		memcpy(tmp.start(), str, len);
570c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com		swap(tmp);
580c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	}
590c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	else
600c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	{
610c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com		memmove(start(), str, len);
620c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com		set_size(len);
630c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	}
640c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	return *this;
650c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com}
660c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
670c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
680c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.comTiXmlString& TiXmlString::append(const char* str, size_type len)
690c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com{
700c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	size_type newsize = length() + len;
710c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	if (newsize > capacity())
720c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	{
730c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com		reserve (newsize + capacity());
740c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	}
750c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	memmove(finish(), str, len);
760c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	set_size(newsize);
770c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	return *this;
780c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com}
790c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
800c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
810c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.comTiXmlString operator + (const TiXmlString & a, const TiXmlString & b)
820c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com{
830c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	TiXmlString tmp;
840c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	tmp.reserve(a.length() + b.length());
850c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	tmp += a;
860c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	tmp += b;
870c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	return tmp;
880c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com}
890c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
900c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.comTiXmlString operator + (const TiXmlString & a, const char* b)
910c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com{
920c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	TiXmlString tmp;
930c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	TiXmlString::size_type b_len = static_cast<TiXmlString::size_type>( strlen(b) );
940c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	tmp.reserve(a.length() + b_len);
950c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	tmp += a;
960c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	tmp.append(b, b_len);
970c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	return tmp;
980c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com}
990c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
1000c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.comTiXmlString operator + (const char* a, const TiXmlString & b)
1010c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com{
1020c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	TiXmlString tmp;
1030c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	TiXmlString::size_type a_len = static_cast<TiXmlString::size_type>( strlen(a) );
1040c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	tmp.reserve(a_len + b.length());
1050c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	tmp.append(a, a_len);
1060c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	tmp += b;
1070c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com	return tmp;
1080c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com}
1090c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
1100c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com
1110c18481adaebdef466bb1b5b0965f9f8db5e2081dfilimon@google.com#endif	// TIXML_USE_STL
112