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