aboutsummaryrefslogtreecommitdiff
path: root/tool_src/QvLib/QvString.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tool_src/QvLib/QvString.cpp')
-rw-r--r--tool_src/QvLib/QvString.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/tool_src/QvLib/QvString.cpp b/tool_src/QvLib/QvString.cpp
new file mode 100644
index 0000000..a5562a3
--- /dev/null
+++ b/tool_src/QvLib/QvString.cpp
@@ -0,0 +1,106 @@
+#include <QvString.h>
+
+QvString::~QvString()
+{
+ if (string != staticStorage)
+ delete [] string;
+}
+
+void
+QvString::expand(int bySize)
+{
+ int newSize = strlen(string) + bySize + 1;
+
+ if (newSize >= QV_STRING_STATIC_STORAGE_SIZE &&
+ (string == staticStorage || newSize > storageSize)) {
+
+ char *newString = new char[newSize];
+
+ strcpy(newString, string);
+
+ if (string != staticStorage)
+ delete [] string;
+
+ string = newString;
+ storageSize = newSize;
+ }
+}
+
+u_long
+QvString::hash(const char *s)
+{
+ u_long total, shift;
+
+ total = shift = 0;
+ while (*s) {
+ total = total ^ ((*s) << shift);
+ shift+=5;
+ if (shift>24) shift -= 24;
+ s++;
+ }
+
+ return( total );
+}
+
+void
+QvString::makeEmpty(QvBool freeOld)
+{
+ if (string != staticStorage) {
+ if (freeOld)
+ delete [] string;
+ string = staticStorage;
+ }
+ string[0] = '\0';
+}
+
+QvString &
+QvString::operator =(const char *str)
+{
+ int size = strlen(str) + 1;
+
+ if (str >= string &&
+ str < string + (string != staticStorage ? storageSize :
+ QV_STRING_STATIC_STORAGE_SIZE)) {
+
+ QvString tmp = str;
+ *this = tmp;
+ return *this;
+ }
+
+ if (size < QV_STRING_STATIC_STORAGE_SIZE) {
+ if (string != staticStorage)
+ makeEmpty();
+ }
+
+ else if (string == staticStorage)
+ string = new char[size];
+
+ else if (size > storageSize) {
+ delete [] string;
+ string = new char[size];
+ }
+
+ strcpy(string, str);
+ storageSize = size;
+ return *this;
+}
+
+QvString &
+QvString::operator +=(const char *str)
+{
+ expand(strlen(str));
+ strcat(string, str);
+ return *this;
+}
+
+int
+operator ==(const QvString &str, const char *s)
+{
+ return (str.string[0] == s[0] && ! strcmp(str.string, s));
+}
+
+int
+operator !=(const QvString &str, const char *s)
+{
+ return (str.string[0] != s[0] || strcmp(str.string, s));
+}