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