diff options
Diffstat (limited to 'include/SString.h')
| -rw-r--r-- | include/SString.h | 216 | 
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 | 
