From c068f22329d5cc722622a2183bbb22eef2093df7 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Mon, 24 Aug 2026 11:16:07 +0200 Subject: initial import --- tool_src/QvLib/QvString.h | 101 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 tool_src/QvLib/QvString.h (limited to 'tool_src/QvLib/QvString.h') diff --git a/tool_src/QvLib/QvString.h b/tool_src/QvLib/QvString.h new file mode 100644 index 0000000..ae49676 --- /dev/null +++ b/tool_src/QvLib/QvString.h @@ -0,0 +1,101 @@ +#ifndef _QV_STRING_ +#define _QV_STRING_ + +#include +#include + +class QvString { + public: + QvString() { string = staticStorage; + string[0] = '\0'; } + QvString(const char *str) { string = staticStorage; + *this = str; } + QvString(const QvString &str) { string = staticStorage; + *this = str.string; } + ~QvString(); + u_long hash() { return QvString::hash(string); } + int getLength() const { return strlen(string); } + void makeEmpty(QvBool freeOld = TRUE); + const char * getString() const { return string; } + QvString & operator =(const char *str); + QvString & operator =(const QvString &str) + { return (*this = str.string); } + QvString & operator +=(const char *str); + int operator !() const { return (string[0] == '\0'); } + friend int operator ==(const QvString &str, const char *s); + + friend int operator ==(const char *s, const QvString &str) + { return (str == s); } + + friend int operator ==(const QvString &str1, const QvString &str2) + { return (str1 == str2.string); } + friend int operator !=(const QvString &str, const char *s); + + friend int operator !=(const char *s, const QvString &str) + { return (str != s); } + friend int operator !=(const QvString &str1, + const QvString &str2) + { return (str1 != str2.string); } + static u_long hash(const char *s); + private: + char *string; + int storageSize; +#define QV_STRING_STATIC_STORAGE_SIZE 32 + char staticStorage[QV_STRING_STATIC_STORAGE_SIZE]; + void expand(int bySize); +}; + +class QvNameEntry { + public: + QvBool isEmpty() const { return (string[0] == '\0'); } + QvBool isEqual(const char *s) const + { return (string[0] == s[0] && ! strcmp(string, s)); } + private: + static int nameTableSize; + static QvNameEntry **nameTable; + static struct QvNameChunk *chunk; + const char *string; + u_long hashValue; + QvNameEntry *next; + static void initClass(); + QvNameEntry(const char *s, u_long h, QvNameEntry *n) + { string = s; hashValue = h; next = n; } + static const QvNameEntry * insert(const char *s); + +friend class QvName; +}; + +class QvName { + public: + QvName(); + QvName(const char *s) { entry = QvNameEntry::insert(s); } + QvName(const QvString &s) { entry = QvNameEntry::insert(s.getString()); } + + QvName(const QvName &n) { entry = n.entry; } + ~QvName() {} + const char *getString() const { return entry->string; } + int getLength() const { return strlen(entry->string); } + static QvBool isIdentStartChar(char c); + static QvBool isIdentChar(char c); + static QvBool isNodeNameStartChar(char c); + static QvBool isNodeNameChar(char c); + int operator !() const { return entry->isEmpty(); } + friend int operator ==(const QvName &n, const char *s) + { return n.entry->isEqual(s); } + friend int operator ==(const char *s, const QvName &n) + { return n.entry->isEqual(s); } + + friend int operator ==(const QvName &n1, const QvName &n2) + { return n1.entry == n2.entry; } + friend int operator !=(const QvName &n, const char *s) + { return ! n.entry->isEqual(s); } + friend int operator !=(const char *s, const QvName &n) + { return ! n.entry->isEqual(s); } + + friend int operator !=(const QvName &n1, const QvName &n2) + { return n1.entry != n2.entry; } + private: + const QvNameEntry *entry; +}; + +#endif /* _QV_STRING_ */ -- cgit v1.2.3