summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorleo2000-10-05 13:13:17 +0000
committerleo2000-10-05 13:13:17 +0000
commitc7933d12110c027307dfe465ed3e2252130d8cd2 (patch)
tree64ee1eab80803c068c342ca3d6c63f6d110ef79d
parenteab1b19ce036328610ed89363375e6d3f22af2e6 (diff)
Text string class
git-svn-id: http://svn.leocad.org/trunk@151 c7d43263-9d01-0410-8a33-9dba5d9f93d6
-rw-r--r--common/module.mk2
-rw-r--r--common/str.cpp243
-rw-r--r--common/str.h155
3 files changed, 399 insertions, 1 deletions
diff --git a/common/module.mk b/common/module.mk
index 70ad3fa..b07f32b 100644
--- a/common/module.mk
+++ b/common/module.mk
@@ -1,4 +1,4 @@
-SRC += common/camera.cpp common/file.cpp common/globals.cpp common/group.cpp common/image.cpp common/im_bmp.cpp common/im_gif.cpp common/library.cpp common/light.cpp common/matrix.cpp common/piece.cpp common/pieceinf.cpp common/project.cpp common/quant.cpp common/terrain.cpp common/texture.cpp common/tr.cpp common/vector.cpp common/opengl.cpp common/object.cpp common/minifig.cpp
+SRC += common/camera.cpp common/file.cpp common/globals.cpp common/group.cpp common/image.cpp common/im_bmp.cpp common/im_gif.cpp common/library.cpp common/light.cpp common/matrix.cpp common/minifig.cpp common/object.cpp common/opengl.cpp common/piece.cpp common/pieceinf.cpp common/project.cpp common/quant.cpp common/str.cpp common/terrain.cpp common/texture.cpp common/tr.cpp common/vector.cpp
ifeq ($(HAVE_JPEGLIB), yes)
LIBS += -ljpeg
diff --git a/common/str.cpp b/common/str.cpp
new file mode 100644
index 0000000..cb82ada
--- /dev/null
+++ b/common/str.cpp
@@ -0,0 +1,243 @@
+//
+// General purpose string class
+//
+
+#include <ctype.h>
+#include "str.h"
+
+static String aux;
+
+// =============================================================================
+// Construction / Destruction
+
+String::String ()
+{
+ m_pData = new char[1];
+ m_pData[0] = '\0';
+}
+
+String::~String ()
+{
+ delete []m_pData;
+}
+
+// =============================================================================
+// Operators
+
+const String& String::operator= (const String& src)
+{
+ delete []m_pData;
+ m_pData = new char[src.GetLength () + 1];
+ strcpy (m_pData, src.m_pData);
+ return *this;
+}
+
+const String& String::operator= (char ch)
+{
+ delete []m_pData;
+ m_pData = new char[2];
+ m_pData[0] = ch;
+ m_pData[1] = '\0';
+ return *this;
+}
+
+const String& String::operator= (const char *src)
+{
+ delete []m_pData;
+ m_pData = new char[strlen (src) + 1];
+ strcpy (m_pData, src);
+ return *this;
+}
+
+const String& String::operator+= (const String& src)
+{
+ char *tmp = new char[GetLength () + src.GetLength () + 1];
+ strcpy (tmp, m_pData);
+ strcat (tmp, src.m_pData);
+ delete []m_pData;
+ m_pData = tmp;
+ return *this;
+}
+
+const String& String::operator+= (char ch)
+{
+ int len = GetLength ();
+ char *tmp = new char[len + 1 + 1];
+ strcpy (tmp, m_pData);
+ tmp[len] = ch;
+ tmp[len+1] = '\0';
+ delete []m_pData;
+ m_pData = tmp;
+ return *this;
+}
+
+const String& String::operator+= (const char *src)
+{
+ char *tmp = new char[GetLength () + strlen (src) + 1];
+ strcpy (tmp, m_pData);
+ strcat (tmp, src);
+ delete []m_pData;
+ m_pData = tmp;
+ return *this;
+}
+
+// =============================================================================
+// Non-member operators
+
+String& operator+ (const String& string1, const String& string2)
+{
+ String s;
+ s = string1;
+ s += string2;
+ aux = s;
+ return aux;
+}
+
+String& operator+ (const String& string, char ch)
+{
+ String s;
+ s = string;
+ s += ch;
+ aux = s;
+ return aux;
+}
+
+String& operator+ (char ch, const String& string)
+{
+ String s;
+ s = ch;
+ s += string;
+ aux = s;
+ return aux;
+}
+
+String& operator+ (const String& string1, const char *string2)
+{
+ String s;
+ s = string1;
+ s += string2;
+ aux = s;
+ return aux;
+}
+
+String& operator+ (const char *string1, const String& string2)
+{
+ String s;
+ s = string1;
+ s += string2;
+ aux = s;
+ return aux;
+}
+
+// =============================================================================
+// Sub-string extraction
+
+String& String::Mid (int first, int count) const
+{
+ if (count < 0)
+ count = 0;
+ else if (count > GetLength ())
+ count = GetLength ();
+
+ String s;
+ strncpy (s.GetBuffer (count+1), m_pData + first, count);
+ s.m_pData[count] = '\0';
+ aux = s;
+
+ return aux;
+}
+
+String& String::Left (int count) const
+{
+ if (count < 0)
+ count = 0;
+ else if (count > GetLength ())
+ count = GetLength ();
+
+ String s;
+ strncpy (s.GetBuffer (count+1), m_pData, count);
+ s.m_pData[count] = '\0';
+ aux = s;
+
+ return aux;
+}
+
+String& String::Right (int count) const
+{
+ if (count < 0)
+ count = 0;
+ else if (count > GetLength ())
+ count = GetLength ();
+
+ String s;
+ strncpy (s.GetBuffer (count+1), m_pData + GetLength () - count, count);
+ s.m_pData[count] = '\0';
+ aux = s;
+
+ return aux;
+}
+
+// =============================================================================
+// Other functions
+
+int String::CompareNoCase (const char *string) const
+{
+ char c1, c2, *ch = m_pData;
+ while (*ch && *string)
+ {
+ c1 = tolower (*ch);
+ c2 = tolower (*string);
+ if (c1 != c2)
+ return (c1 - c2);
+ ch++; string++;
+ }
+ return (((int)*ch) - ((int)*string));
+}
+
+void String::MakeUpper ()
+{
+ for (char *cp = m_pData; *cp; ++cp)
+ if ('a' <= *cp && *cp <= 'z')
+ *cp += 'A' - 'a';
+}
+
+void String::MakeLower ()
+{
+ for (char *cp = m_pData; *cp; ++cp)
+ if ('A' <= *cp && *cp <= 'Z')
+ *cp += 'a' - 'A';
+}
+
+void String::MakeReverse ()
+{
+ register char *h, *t;
+
+ h = m_pData;
+ t = m_pData + strlen (m_pData) - 1;
+
+ while (h < t)
+ {
+ register char c;
+
+ c = *h;
+ *h = *t;
+ h++;
+ *t = c;
+ t--;
+ }
+}
+
+void String::TrimRight ()
+{
+ for (char *s = m_pData + strlen (m_pData) - 1; s >= m_pData && isspace (*s); s--)
+ *s = '\0';
+}
+
+void String::TrimLeft ()
+{
+ char *ch;
+ ch = m_pData;
+ while (isspace (*ch))
+ ch++;
+ memmove (m_pData, ch, strlen (ch)+1);
+}
diff --git a/common/str.h b/common/str.h
new file mode 100644
index 0000000..60c352f
--- /dev/null
+++ b/common/str.h
@@ -0,0 +1,155 @@
+#ifndef _STR_H_
+#define _STR_H_
+
+#include <string.h>
+
+class String
+{
+ public:
+ String ();
+ String (const String& src)
+ { *this = src; }
+ String (const char* str)
+ { *this = str; }
+ ~String ();
+
+ int GetLength () const
+ { return strlen (m_pData); }
+ bool IsEmpty () const
+ { return m_pData[0] == '\0'; }
+ void Empty ()
+ { m_pData[0] = '\0'; }
+
+ char GetAt (int index) const
+ { return m_pData[index]; }
+ char operator[] (int index) const
+ { return m_pData[index]; }
+ void SetAt (int index, char ch)
+ { m_pData[index] = ch; }
+ operator char* () const
+ { return m_pData; }
+ operator const char* () const
+ { return m_pData; }
+
+ // Operators
+ const String& operator= (const String& src);
+ const String& operator= (char ch);
+ const String& operator= (const char *src);
+ const String& operator+= (const String& string);
+ const String& operator+= (char ch);
+ const String& operator+= (const char *src);
+
+ // Comparison
+ int Compare (const char *string) const
+ { return strcmp (m_pData, string); }
+ int CompareNoCase (const char *string) const;
+
+ // simple sub-string extraction
+ String& Mid (int first, int count) const;
+ String& Mid (int first) const
+ { return Mid (first, GetLength () - first); }
+ String& Left (int count) const;
+ String& Right (int count) const;
+
+ // upper/lower/reverse conversion
+ void MakeUpper ();
+ void MakeLower ();
+ void MakeReverse ();
+
+ // trimming whitespace (either side)
+ void TrimRight ();
+ void TrimLeft ();
+
+ // searching (return starting index, or -1 if not found)
+ // look for a single character match
+ int Find (char ch) const
+ {
+ char *pf = strchr (m_pData, ch);
+ return (pf) ? (pf - m_pData) : -1;
+ }
+ int ReverseFind (char ch) const
+ {
+ char *pf = strrchr (m_pData, ch);
+ return (pf) ? (pf - m_pData) : -1;
+ }
+ int FindOneOf (const char *set) const
+ {
+ char *pf = strpbrk (m_pData, set);
+ return (pf) ? (pf - m_pData) : -1;
+ }
+
+ // look for a specific sub-string
+ int Find (const char *str) const
+ {
+ char *pf = strstr (m_pData, str);
+ return (pf) ? (pf - m_pData) : -1;
+ }
+
+ char* GetBuffer (int len)
+ {
+ if (len > (int)strlen (m_pData))
+ {
+ char *tmp = new char[len+1];
+ strcpy (tmp, m_pData);
+ delete []m_pData;
+ m_pData = tmp;
+ }
+ return m_pData;
+ }
+ void ReleaseBuffer (int len = -1)
+ {
+ if (len == -1)
+ len = strlen (m_pData);
+ m_pData[len] = '\0';
+ }
+
+ protected:
+ char* m_pData;
+};
+
+// Concatenation operators
+String& operator+ (const String& string1, const String& string2);
+String& operator+ (const String& string, char ch);
+String& operator+ (char ch, const String& string);
+String& operator+ (const String& string1, const char *string2);
+String& operator+ (const char *string1, const String& string2);
+
+// Comparison operators
+inline bool operator== (const String& s1, const String& s2)
+{ return s1.Compare(s2) == 0; }
+inline bool operator== (const String& s1, const char *s2)
+{ return s1.Compare(s2) == 0; }
+inline bool operator== (const char *s1, const String& s2)
+{ return s2.Compare(s1) == 0; }
+inline bool operator!= (const String& s1, const String& s2)
+{ return s1.Compare(s2) != 0; }
+inline bool operator!= (const String& s1, const char *s2)
+{ return s1.Compare(s2) != 0; }
+inline bool operator!= (const char *s1, const String& s2)
+{ return s2.Compare(s1) != 0; }
+inline bool operator< (const String& s1, const String& s2)
+{ return s1.Compare(s2) < 0; }
+inline bool operator< (const String& s1, const char *s2)
+{ return s1.Compare(s2) < 0; }
+inline bool operator< (const char *s1, const String& s2)
+{ return s2.Compare(s1) > 0; }
+inline bool operator> (const String& s1, const String& s2)
+{ return s1.Compare(s2) > 0; }
+inline bool operator> (const String& s1, const char *s2)
+{ return s1.Compare(s2) > 0; }
+inline bool operator> (const char *s1, const String& s2)
+{ return s2.Compare(s1) < 0; }
+inline bool operator<= (const String& s1, const String& s2)
+{ return s1.Compare(s2) <= 0; }
+inline bool operator<= (const String& s1, const char *s2)
+{ return s1.Compare(s2) <= 0; }
+inline bool operator<= (const char *s1, const String& s2)
+{ return s2.Compare(s1) >= 0; }
+inline bool operator>= (const String& s1, const String& s2)
+{ return s1.Compare(s2) >= 0; }
+inline bool operator>= (const String& s1, const char *s2)
+{ return s1.Compare(s2) >= 0; }
+inline bool operator>= (const char *s1, const String& s2)
+{ return s2.Compare(s1) <= 0; }
+
+#endif // _STR_H_