1// String.cpp
2
3#include <new>
4#include <string.h>
5
6#include "String.h"
7
8/*!
9	\class String
10	\brief A very simple string class.
11*/
12
13// constructor
14String::String()
15	: fLength(0),
16	  fString(NULL)
17{
18}
19
20// copy constructor
21String::String(const String &string)
22	: fLength(0),
23	  fString(NULL)
24{
25	*this = string;
26}
27
28// constructor
29String::String(const char *string, int32 length)
30	: fLength(0),
31	  fString(NULL)
32{
33	SetTo(string, length);
34}
35
36// destructor
37String::~String()
38{
39	Unset();
40}
41
42// SetTo
43bool
44String::SetTo(const char *string, int32 maxLength)
45{
46	if (string) {
47		if (maxLength > 0)
48			maxLength = strnlen(string, maxLength);
49		else if (maxLength < 0)
50			maxLength = strlen(string);
51	}
52	return _SetTo(string, maxLength);
53}
54
55// Unset
56void
57String::Unset()
58{
59	if (fString) {
60		delete[] fString;
61		fString = NULL;
62	}
63	fLength = 0;
64}
65
66// Truncate
67void
68String::Truncate(int32 newLength)
69{
70	if (newLength < 0)
71		newLength = 0;
72	if (newLength < fLength) {
73		char *string = fString;
74		fString = NULL;
75		if (!_SetTo(string, newLength)) {
76			fString = string;
77			fLength = newLength;
78			fString[fLength] = '\0';
79		} else
80			delete[] string;
81	}
82}
83
84// GetString
85const char *
86String::GetString() const
87{
88	if (fString)
89		return fString;
90	return "";
91}
92
93// =
94String &
95String::operator=(const String &string)
96{
97	if (&string != this)
98		_SetTo(string.fString, string.fLength);
99	return *this;
100}
101
102// ==
103bool
104String::operator==(const String &string) const
105{
106	return (fLength == string.fLength
107			&& (fLength == 0 || !strcmp(fString, string.fString)));
108}
109
110// _SetTo
111bool
112String::_SetTo(const char *string, int32 length)
113{
114	bool result = true;
115	Unset();
116	if (string && length > 0) {
117		fString = new(std::nothrow) char[length + 1];
118		if (fString) {
119			memcpy(fString, string, length);
120			fString[length] = '\0';
121			fLength = length;
122		} else
123			result = false;
124	}
125	return result;
126}
127
128