From c7933d12110c027307dfe465ed3e2252130d8cd2 Mon Sep 17 00:00:00 2001 From: leo Date: Thu, 5 Oct 2000 13:13:17 +0000 Subject: Text string class git-svn-id: http://svn.leocad.org/trunk@151 c7d43263-9d01-0410-8a33-9dba5d9f93d6 --- common/str.cpp | 243 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100644 common/str.cpp (limited to 'common/str.cpp') 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 +#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); +} -- cgit v1.2.3