aboutsummaryrefslogtreecommitdiffhomepage
path: root/include/SString.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/SString.h')
-rw-r--r--include/SString.h216
1 files changed, 216 insertions, 0 deletions
diff --git a/include/SString.h b/include/SString.h
new file mode 100644
index 000000000..bdc4548ba
--- /dev/null
+++ b/include/SString.h
@@ -0,0 +1,216 @@
+// SciTE - Scintilla based Text Editor
+// SString.h - a simple string class
+// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#ifndef SSTRING_H
+#define SSTRING_H
+
+#if PLAT_WIN
+#define strcasecmp stricmp
+#define strncasecmp strnicmp
+#endif
+
+// Define another string class.
+// While it would be 'better' to use std::string, that doubles the executable size.
+
+inline char *StringDup(const char *s, int len=-1) {
+ if (!s)
+ return 0;
+ if (len == -1)
+ len = strlen(s);
+ char *sNew = new char[len + 1];
+ if (sNew) {
+ strncpy(sNew, s, len);
+ sNew[len] = '\0';
+ }
+ return sNew;
+}
+
+class SString {
+ char *s;
+ int ssize;
+public:
+ typedef const char* const_iterator;
+ typedef int size_type;
+ static size_type npos;
+ const char* begin(void) const {
+ return s;
+ }
+ const char* end(void) const {
+ return &s[ssize];
+ }
+ size_type size(void) const {
+ if (s)
+ return ssize;
+ else
+ return 0;
+ }
+ SString &assign(const char* sother, int size_ = -1) {
+ char *t = s;
+ s = StringDup(sother,size_);
+ ssize = (s) ? strlen(s) : 0;
+ delete []t;
+ return *this;
+ }
+ SString &assign(const SString& sother, int size_ = -1) {
+ return assign(sother.s,size_);
+ }
+ SString &assign(const_iterator ibeg, const_iterator iend) {
+ return assign(ibeg,iend - ibeg);
+ }
+ SString() {
+ s = 0;
+ ssize = 0;
+ }
+ SString(const SString &source) {
+ s = StringDup(source.s);
+ ssize = (s) ? strlen(s) : 0;
+ }
+ SString(const char *s_) {
+ s = StringDup(s_);
+ ssize = (s) ? strlen(s) : 0;
+ }
+ SString(int i) {
+ char number[100];
+ sprintf(number, "%0d", i);
+ s = StringDup(number);
+ ssize = (s) ? strlen(s) : 0;
+ }
+ ~SString() {
+ delete []s;
+ s = 0;
+ ssize = 0;
+ }
+ SString &operator=(const SString &source) {
+ if (this != &source) {
+ delete []s;
+ s = StringDup(source.s);
+ ssize = (s) ? strlen(s) : 0;
+ }
+ return *this;
+ }
+ bool operator==(const SString &other) const {
+ if ((s == 0) && (other.s == 0))
+ return true;
+ if ((s == 0) || (other.s == 0))
+ return false;
+ return strcmp(s, other.s) == 0;
+ }
+ bool operator!=(const SString &other) const {
+ return !operator==(other);
+ }
+ bool operator==(const char *sother) const {
+ if ((s == 0) && (sother == 0))
+ return true;
+ if ((s == 0) || (sother == 0))
+ return false;
+ return strcmp(s, sother) == 0;
+ }
+ bool operator!=(const char *sother) const {
+ return !operator==(sother);
+ }
+ const char *c_str() const {
+ if (s)
+ return s;
+ else
+ return "";
+ }
+ int length() const {
+ if (s)
+ return strlen(s);
+ else
+ return 0;
+ }
+ char operator[](int i) const {
+ if (s)
+ return s[i];
+ else
+ return '\0';
+ }
+ SString &operator +=(const char *sother) {
+ return append(sother,-1);
+ }
+ SString &operator +=(const SString &sother) {
+ return append(sother.s,sother.ssize);
+ }
+ SString &operator +=(char ch) {
+ return append(&ch,1);
+ }
+ SString &append(const char* sother, int lenOther) {
+ int len = length();
+ if(lenOther < 0)
+ lenOther = strlen(sother);
+ char *sNew = new char[len + lenOther + 1];
+ if (sNew) {
+ if (s)
+ memcpy(sNew, s, len);
+ strncpy(&sNew[len], sother, lenOther);
+ sNew[len + lenOther] = '\0';
+ delete []s;
+ s = sNew;
+ ssize = (s) ? strlen(s) : 0;
+ }
+ return *this;
+ }
+ int value() const {
+ if (s)
+ return atoi(s);
+ else
+ return 0;
+ }
+ void substitute(char find, char replace) {
+ char *t = s;
+ while (t) {
+ t = strchr(t, find);
+ if (t)
+ *t = replace;
+ }
+ }
+ //added by ajkc - 08122000
+ char charAt(int i) {
+ return s[i];
+ }
+ //added by ajkc - 08122000
+ SString substring(int startPos, int endPos = -1) {
+ SString result;
+
+ //do some checks first so we do the "right" thing
+ if (endPos > this->size() || endPos == -1)
+ endPos = this->size();
+
+ if (startPos < 0)
+ startPos = 0;
+
+ if (startPos == endPos) {
+ //result += s[startPos];
+ result += ""; // Why? -- Neil
+ return result;
+ }
+
+ if (startPos > endPos) {
+ int tmp = endPos;
+ endPos = startPos;
+ startPos = tmp;
+ }
+
+ //printf("SString: substring startPos %d endPos %d\n",startPos,endPos);
+ for (int i = startPos; i < endPos; i++) {
+ //printf("SString: substring %d: %c\n",i,s[i]);
+ result += s[i];
+ }
+
+ //printf("SString: substring: returning: %s\n", result.c_str());
+ return result;
+ }
+ // I don't think this really belongs here -- Neil
+ void correctPath() {
+#ifdef unix
+ substitute('\\', '/');
+#else
+ substitute('/', '\\');
+#endif
+ }
+};
+
+#endif