xref: /haiku/src/kits/shared/HashString.cpp (revision 37ea4f77f7b962a15fae36807d07b0821d0b7c0f)
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
16 HashString::HashString()
17 	: fLength(0),
18 	  fString(NULL)
19 {
20 }
21 
22 // copy constructor
23 HashString::HashString(const HashString &string)
24 	: fLength(0),
25 	  fString(NULL)
26 {
27 	*this = string;
28 }
29 
30 // constructor
31 HashString::HashString(const char *string, int32 length)
32 	: fLength(0),
33 	  fString(NULL)
34 {
35 	SetTo(string, length);
36 }
37 
38 // destructor
39 HashString::~HashString()
40 {
41 	Unset();
42 }
43 
44 // SetTo
45 bool
46 HashString::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
58 void
59 HashString::Unset()
60 {
61 	if (fString) {
62 		delete[] fString;
63 		fString = NULL;
64 	}
65 	fLength = 0;
66 }
67 
68 // Truncate
69 void
70 HashString::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
87 const char *
88 HashString::GetString() const
89 {
90 	if (fString)
91 		return fString;
92 	return "";
93 }
94 
95 // =
96 HashString &
97 HashString::operator=(const HashString &string)
98 {
99 	if (&string != this)
100 		_SetTo(string.fString, string.fLength);
101 	return *this;
102 }
103 
104 // ==
105 bool
106 HashString::operator==(const HashString &string) const
107 {
108 	return (fLength == string.fLength
109 			&& (fLength == 0 || !strcmp(fString, string.fString)));
110 }
111 
112 // _SetTo
113 bool
114 HashString::_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