diff options
Diffstat (limited to 'cores')
| -rw-r--r-- | cores/arduino/WString.cpp | 117 | ||||
| -rw-r--r-- | cores/arduino/WString.h | 23 | ||||
| -rw-r--r-- | cores/robot/WString.cpp | 117 | ||||
| -rw-r--r-- | cores/robot/WString.h | 21 | 
4 files changed, 259 insertions, 19 deletions
diff --git a/cores/arduino/WString.cpp b/cores/arduino/WString.cpp index c6839fc..8c85cc5 100644 --- a/cores/arduino/WString.cpp +++ b/cores/arduino/WString.cpp @@ -38,6 +38,12 @@ String::String(const String &value)  	*this = value;  } +String::String(const __FlashStringHelper *pstr) +{ +	init(); +	*this = pstr; +} +  #ifdef __GXX_EXPERIMENTAL_CXX0X__  String::String(String &&rval)  { @@ -100,6 +106,20 @@ String::String(unsigned long value, unsigned char base)  	*this = buf;  } +String::String(float value, int decimalPlaces) +{ +	init(); +	char buf[33]; +	*this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf); +} + +String::String(double value, int decimalPlaces) +{ +	init(); +	char buf[33]; +	*this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf); +} +  String::~String()  {  	free(buffer); @@ -160,6 +180,17 @@ String & String::copy(const char *cstr, unsigned int length)  	return *this;  } +String & String::copy(const __FlashStringHelper *pstr, unsigned int length) +{ +	if (!reserve(length)) { +		invalidate(); +		return *this; +	} +	len = length; +	strcpy_P(buffer, (const prog_char *)pstr); +	return *this; +} +  #ifdef __GXX_EXPERIMENTAL_CXX0X__  void String::move(String &rhs)  { @@ -214,6 +245,14 @@ String & String::operator = (const char *cstr)  	return *this;  } +String & String::operator = (const __FlashStringHelper *pstr) +{ +	if (pstr) copy(pstr, strlen_P((const prog_char *)pstr)); +	else invalidate(); + +	return *this; +} +  /*********************************************/  /*  concat                                   */  /*********************************************/ @@ -257,14 +296,14 @@ unsigned char String::concat(unsigned char num)  unsigned char String::concat(int num)  { -	char buf[7]; +	char buf[12];  	itoa(num, buf, 10);  	return concat(buf, strlen(buf));  }  unsigned char String::concat(unsigned int num)  { -	char buf[6]; +	char buf[11];  	utoa(num, buf, 10);  	return concat(buf, strlen(buf));  } @@ -283,6 +322,32 @@ unsigned char String::concat(unsigned long num)  	return concat(buf, strlen(buf));  } +unsigned char String::concat(float num) +{ +	char buf[20]; +	char* string = dtostrf(num, 8, 6, buf); +	return concat(string, strlen(string)); +} + +unsigned char String::concat(double num) +{ +	char buf[20]; +	char* string = dtostrf(num, 8, 6, buf); +	return concat(string, strlen(string)); +} + +unsigned char String::concat(const __FlashStringHelper * str) +{ +	if (!str) return 0; +	int length = strlen_P((const char *) str); +	if (length == 0) return 1; +	unsigned int newlen = len + length; +	if (!reserve(newlen)) return 0; +	strcpy_P(buffer + len, (const char *) str); +	len = newlen; +	return 1; +} +  /*********************************************/  /*  Concatenate                              */  /*********************************************/ @@ -343,6 +408,27 @@ StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num)  	return a;  } +StringSumHelper & operator + (const StringSumHelper &lhs, float num) +{ +	StringSumHelper &a = const_cast<StringSumHelper&>(lhs); +	if (!a.concat(num)) a.invalidate(); +	return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, double num) +{ +	StringSumHelper &a = const_cast<StringSumHelper&>(lhs); +	if (!a.concat(num)) a.invalidate(); +	return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, const __FlashStringHelper *rhs) +{ +	StringSumHelper &a = const_cast<StringSumHelper&>(lhs); +	if (!a.concat(rhs))	a.invalidate(); +	return a; +} +  /*********************************************/  /*  Comparison                               */  /*********************************************/ @@ -527,11 +613,6 @@ int String::lastIndexOf(const String &s2, unsigned int fromIndex) const  	return found;  } -String String::substring( unsigned int left ) const -{ -	return substring(left, len); -} -  String String::substring(unsigned int left, unsigned int right) const  {  	if (left > right) { @@ -604,6 +685,22 @@ void String::replace(const String& find, const String& replace)  	}  } +void String::remove(unsigned int index){ +	if (index >= len) { return; } +	int count = len - index; +	remove(index, count); +} + +void String::remove(unsigned int index, unsigned int count){ +	if (index >= len) { return; } +	if (count <= 0) { return; } +	if (index + count > len) { count = len - index; } +	char *writeTo = buffer + index; +	len = len - count; +	strncpy(writeTo, buffer + index + count,len - index); +	buffer[len] = 0; +} +  void String::toLowerCase(void)  {  	if (!buffer) return; @@ -642,4 +739,8 @@ long String::toInt(void) const  	return 0;  } - +float String::toFloat(void) const +{ +	if (buffer) return float(atof(buffer)); +	return 0; +} diff --git a/cores/arduino/WString.h b/cores/arduino/WString.h index 642b016..44a8419 100644 --- a/cores/arduino/WString.h +++ b/cores/arduino/WString.h @@ -58,6 +58,7 @@ public:  	// be false).  	String(const char *cstr = "");  	String(const String &str); +	String(const __FlashStringHelper *str);  	#ifdef __GXX_EXPERIMENTAL_CXX0X__  	String(String &&rval);  	String(StringSumHelper &&rval); @@ -68,6 +69,8 @@ public:  	explicit String(unsigned int, unsigned char base=10);  	explicit String(long, unsigned char base=10);  	explicit String(unsigned long, unsigned char base=10); +	explicit String(float, int decimalPlaces=6); +	explicit String(double, int decimalPlaces=6);  	~String(void);  	// memory management @@ -82,6 +85,7 @@ public:  	// marked as invalid ("if (s)" will be false).  	String & operator = (const String &rhs);  	String & operator = (const char *cstr); +	String & operator = (const __FlashStringHelper *str);  	#ifdef __GXX_EXPERIMENTAL_CXX0X__  	String & operator = (String &&rval);  	String & operator = (StringSumHelper &&rval); @@ -100,17 +104,23 @@ public:  	unsigned char concat(unsigned int num);  	unsigned char concat(long num);  	unsigned char concat(unsigned long num); +	unsigned char concat(float num); +	unsigned char concat(double num); +	unsigned char concat(const __FlashStringHelper * str);  	// if there's not enough memory for the concatenated value, the string  	// will be left unchanged (but this isn't signalled in any way)  	String & operator += (const String &rhs)	{concat(rhs); return (*this);}  	String & operator += (const char *cstr)		{concat(cstr); return (*this);}  	String & operator += (char c)			{concat(c); return (*this);} -	String & operator += (unsigned char num)		{concat(num); return (*this);} +	String & operator += (unsigned char num)	{concat(num); return (*this);}  	String & operator += (int num)			{concat(num); return (*this);}  	String & operator += (unsigned int num)		{concat(num); return (*this);}  	String & operator += (long num)			{concat(num); return (*this);}  	String & operator += (unsigned long num)	{concat(num); return (*this);} +	String & operator += (float num)		{concat(num); return (*this);} +	String & operator += (double num)		{concat(num); return (*this);} +	String & operator += (const __FlashStringHelper *str){concat(str); return (*this);}  	friend StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs);  	friend StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr); @@ -120,6 +130,9 @@ public:  	friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num);  	friend StringSumHelper & operator + (const StringSumHelper &lhs, long num);  	friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num); +	friend StringSumHelper & operator + (const StringSumHelper &lhs, float num); +	friend StringSumHelper & operator + (const StringSumHelper &lhs, double num); +	friend StringSumHelper & operator + (const StringSumHelper &lhs, const __FlashStringHelper *rhs);  	// comparison (only works w/ Strings and "strings")  	operator StringIfHelperType() const { return buffer ? &String::StringIfHelper : 0; } @@ -158,18 +171,21 @@ public:  	int lastIndexOf( char ch, unsigned int fromIndex ) const;  	int lastIndexOf( const String &str ) const;  	int lastIndexOf( const String &str, unsigned int fromIndex ) const; -	String substring( unsigned int beginIndex ) const; +	String substring( unsigned int beginIndex ) const { return substring(beginIndex, len); };  	String substring( unsigned int beginIndex, unsigned int endIndex ) const;  	// modification  	void replace(char find, char replace);  	void replace(const String& find, const String& replace); +	void remove(unsigned int index); +	void remove(unsigned int index, unsigned int count);  	void toLowerCase(void);  	void toUpperCase(void);  	void trim(void);  	// parsing/conversion  	long toInt(void) const; +	float toFloat(void) const;  protected:  	char *buffer;	        // the actual char array @@ -184,6 +200,7 @@ protected:  	// copy and move  	String & copy(const char *cstr, unsigned int length); +	String & copy(const __FlashStringHelper *pstr, unsigned int length);  	#ifdef __GXX_EXPERIMENTAL_CXX0X__  	void move(String &rhs);  	#endif @@ -200,6 +217,8 @@ public:  	StringSumHelper(unsigned int num) : String(num) {}  	StringSumHelper(long num) : String(num) {}  	StringSumHelper(unsigned long num) : String(num) {} +	StringSumHelper(float num) : String(num) {} +	StringSumHelper(double num) : String(num) {}  };  #endif  // __cplusplus diff --git a/cores/robot/WString.cpp b/cores/robot/WString.cpp index c6839fc..8c85cc5 100644 --- a/cores/robot/WString.cpp +++ b/cores/robot/WString.cpp @@ -38,6 +38,12 @@ String::String(const String &value)  	*this = value;  } +String::String(const __FlashStringHelper *pstr) +{ +	init(); +	*this = pstr; +} +  #ifdef __GXX_EXPERIMENTAL_CXX0X__  String::String(String &&rval)  { @@ -100,6 +106,20 @@ String::String(unsigned long value, unsigned char base)  	*this = buf;  } +String::String(float value, int decimalPlaces) +{ +	init(); +	char buf[33]; +	*this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf); +} + +String::String(double value, int decimalPlaces) +{ +	init(); +	char buf[33]; +	*this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf); +} +  String::~String()  {  	free(buffer); @@ -160,6 +180,17 @@ String & String::copy(const char *cstr, unsigned int length)  	return *this;  } +String & String::copy(const __FlashStringHelper *pstr, unsigned int length) +{ +	if (!reserve(length)) { +		invalidate(); +		return *this; +	} +	len = length; +	strcpy_P(buffer, (const prog_char *)pstr); +	return *this; +} +  #ifdef __GXX_EXPERIMENTAL_CXX0X__  void String::move(String &rhs)  { @@ -214,6 +245,14 @@ String & String::operator = (const char *cstr)  	return *this;  } +String & String::operator = (const __FlashStringHelper *pstr) +{ +	if (pstr) copy(pstr, strlen_P((const prog_char *)pstr)); +	else invalidate(); + +	return *this; +} +  /*********************************************/  /*  concat                                   */  /*********************************************/ @@ -257,14 +296,14 @@ unsigned char String::concat(unsigned char num)  unsigned char String::concat(int num)  { -	char buf[7]; +	char buf[12];  	itoa(num, buf, 10);  	return concat(buf, strlen(buf));  }  unsigned char String::concat(unsigned int num)  { -	char buf[6]; +	char buf[11];  	utoa(num, buf, 10);  	return concat(buf, strlen(buf));  } @@ -283,6 +322,32 @@ unsigned char String::concat(unsigned long num)  	return concat(buf, strlen(buf));  } +unsigned char String::concat(float num) +{ +	char buf[20]; +	char* string = dtostrf(num, 8, 6, buf); +	return concat(string, strlen(string)); +} + +unsigned char String::concat(double num) +{ +	char buf[20]; +	char* string = dtostrf(num, 8, 6, buf); +	return concat(string, strlen(string)); +} + +unsigned char String::concat(const __FlashStringHelper * str) +{ +	if (!str) return 0; +	int length = strlen_P((const char *) str); +	if (length == 0) return 1; +	unsigned int newlen = len + length; +	if (!reserve(newlen)) return 0; +	strcpy_P(buffer + len, (const char *) str); +	len = newlen; +	return 1; +} +  /*********************************************/  /*  Concatenate                              */  /*********************************************/ @@ -343,6 +408,27 @@ StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num)  	return a;  } +StringSumHelper & operator + (const StringSumHelper &lhs, float num) +{ +	StringSumHelper &a = const_cast<StringSumHelper&>(lhs); +	if (!a.concat(num)) a.invalidate(); +	return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, double num) +{ +	StringSumHelper &a = const_cast<StringSumHelper&>(lhs); +	if (!a.concat(num)) a.invalidate(); +	return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, const __FlashStringHelper *rhs) +{ +	StringSumHelper &a = const_cast<StringSumHelper&>(lhs); +	if (!a.concat(rhs))	a.invalidate(); +	return a; +} +  /*********************************************/  /*  Comparison                               */  /*********************************************/ @@ -527,11 +613,6 @@ int String::lastIndexOf(const String &s2, unsigned int fromIndex) const  	return found;  } -String String::substring( unsigned int left ) const -{ -	return substring(left, len); -} -  String String::substring(unsigned int left, unsigned int right) const  {  	if (left > right) { @@ -604,6 +685,22 @@ void String::replace(const String& find, const String& replace)  	}  } +void String::remove(unsigned int index){ +	if (index >= len) { return; } +	int count = len - index; +	remove(index, count); +} + +void String::remove(unsigned int index, unsigned int count){ +	if (index >= len) { return; } +	if (count <= 0) { return; } +	if (index + count > len) { count = len - index; } +	char *writeTo = buffer + index; +	len = len - count; +	strncpy(writeTo, buffer + index + count,len - index); +	buffer[len] = 0; +} +  void String::toLowerCase(void)  {  	if (!buffer) return; @@ -642,4 +739,8 @@ long String::toInt(void) const  	return 0;  } - +float String::toFloat(void) const +{ +	if (buffer) return float(atof(buffer)); +	return 0; +} diff --git a/cores/robot/WString.h b/cores/robot/WString.h index 642b016..4b9e64e 100644 --- a/cores/robot/WString.h +++ b/cores/robot/WString.h @@ -58,6 +58,7 @@ public:  	// be false).  	String(const char *cstr = "");  	String(const String &str); +	String(const __FlashStringHelper *str);  	#ifdef __GXX_EXPERIMENTAL_CXX0X__  	String(String &&rval);  	String(StringSumHelper &&rval); @@ -68,6 +69,8 @@ public:  	explicit String(unsigned int, unsigned char base=10);  	explicit String(long, unsigned char base=10);  	explicit String(unsigned long, unsigned char base=10); +	explicit String(float, int decimalPlaces=6); +	explicit String(double, int decimalPlaces=6);  	~String(void);  	// memory management @@ -82,6 +85,7 @@ public:  	// marked as invalid ("if (s)" will be false).  	String & operator = (const String &rhs);  	String & operator = (const char *cstr); +	String & operator = (const __FlashStringHelper *str);  	#ifdef __GXX_EXPERIMENTAL_CXX0X__  	String & operator = (String &&rval);  	String & operator = (StringSumHelper &&rval); @@ -100,6 +104,9 @@ public:  	unsigned char concat(unsigned int num);  	unsigned char concat(long num);  	unsigned char concat(unsigned long num); +	unsigned char concat(float num); +	unsigned char concat(double num); +	unsigned char concat(const __FlashStringHelper * str);  	// if there's not enough memory for the concatenated value, the string  	// will be left unchanged (but this isn't signalled in any way) @@ -111,6 +118,9 @@ public:  	String & operator += (unsigned int num)		{concat(num); return (*this);}  	String & operator += (long num)			{concat(num); return (*this);}  	String & operator += (unsigned long num)	{concat(num); return (*this);} +	String & operator += (float num)		{concat(num); return (*this);} +	String & operator += (double num)		{concat(num); return (*this);} +	String & operator += (const __FlashStringHelper *str){concat(str); return (*this);}  	friend StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs);  	friend StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr); @@ -120,6 +130,9 @@ public:  	friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num);  	friend StringSumHelper & operator + (const StringSumHelper &lhs, long num);  	friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num); +	friend StringSumHelper & operator + (const StringSumHelper &lhs, float num); +	friend StringSumHelper & operator + (const StringSumHelper &lhs, double num); +	friend StringSumHelper & operator + (const StringSumHelper &lhs, const __FlashStringHelper *rhs);  	// comparison (only works w/ Strings and "strings")  	operator StringIfHelperType() const { return buffer ? &String::StringIfHelper : 0; } @@ -158,18 +171,21 @@ public:  	int lastIndexOf( char ch, unsigned int fromIndex ) const;  	int lastIndexOf( const String &str ) const;  	int lastIndexOf( const String &str, unsigned int fromIndex ) const; -	String substring( unsigned int beginIndex ) const; +	String substring( unsigned int beginIndex ) const { return substring(beginIndex, len); };  	String substring( unsigned int beginIndex, unsigned int endIndex ) const;  	// modification  	void replace(char find, char replace);  	void replace(const String& find, const String& replace); +	void remove(unsigned int index); +	void remove(unsigned int index, unsigned int count);  	void toLowerCase(void);  	void toUpperCase(void);  	void trim(void);  	// parsing/conversion  	long toInt(void) const; +	float toFloat(void) const;  protected:  	char *buffer;	        // the actual char array @@ -184,6 +200,7 @@ protected:  	// copy and move  	String & copy(const char *cstr, unsigned int length); +	String & copy(const __FlashStringHelper *pstr, unsigned int length);  	#ifdef __GXX_EXPERIMENTAL_CXX0X__  	void move(String &rhs);  	#endif @@ -200,6 +217,8 @@ public:  	StringSumHelper(unsigned int num) : String(num) {}  	StringSumHelper(long num) : String(num) {}  	StringSumHelper(unsigned long num) : String(num) {} +	StringSumHelper(float num) : String(num) {} +	StringSumHelper(double num) : String(num) {}  };  #endif  // __cplusplus  | 
