From 3b88acac8ee00fc57bc3328e68823aa53088f891 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Sun, 16 Mar 2014 09:25:17 +0100 Subject: [PATCH 1/5] Make String::concat(const char *, unsigned int) public This method is useful when receiving data from external sources that pass an explicit length instead of a NUL-terminated string. --- api/String.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/String.h b/api/String.h index d8f943eb..37842379 100644 --- a/api/String.h +++ b/api/String.h @@ -109,6 +109,7 @@ class String // concatenation is considered unsucessful. unsigned char concat(const String &str); unsigned char concat(const char *cstr); + unsigned char concat(const char *cstr, unsigned int length); unsigned char concat(char c); unsigned char concat(unsigned char num); unsigned char concat(int num); @@ -225,7 +226,6 @@ class String void init(void); void invalidate(void); unsigned char changeBuffer(unsigned int maxStrLen); - unsigned char concat(const char *cstr, unsigned int length); // copy and move String & copy(const char *cstr, unsigned int length); From 84314888a8a73b643469c5609beed6d21d1c037a Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Sun, 16 Mar 2014 10:37:38 +0100 Subject: [PATCH 2/5] Add String(char *, unsigned) constructor This constructor allows converting a buffer containing a non-nul-terminated string to a String object, by explicitely passing the length. --- api/String.cpp | 6 ++++++ api/String.h | 1 + 2 files changed, 7 insertions(+) diff --git a/api/String.cpp b/api/String.cpp index 5bf5862a..fc8a196e 100644 --- a/api/String.cpp +++ b/api/String.cpp @@ -45,6 +45,12 @@ String::String(const char *cstr) if (cstr) copy(cstr, strlen(cstr)); } +String::String(const char *cstr, unsigned int length) +{ + init(); + if (cstr) copy(cstr, length); +} + String::String(const String &value) { init(); diff --git a/api/String.h b/api/String.h index 37842379..c0a8ce2d 100644 --- a/api/String.h +++ b/api/String.h @@ -68,6 +68,7 @@ class String // fails, the string will be marked as invalid (i.e. "if (s)" will // be false). String(const char *cstr = ""); + String(const char *cstr, unsigned int length); String(const String &str); String(const __FlashStringHelper *str); #if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) From dd236bfd2c62ed083aaa1b1229d71e85fd92f7a9 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Sun, 16 Mar 2014 12:01:53 +0100 Subject: [PATCH 3/5] Don't mess with the original in String::substring Before, substring would (temporarily) add a \0 in the original string at the end of the substring, so the substring could be copied into a new String object. However, now that the String::copy() method can work with non-nul-terminated strings (by passing an explicit length), this trick is not needed and we can just call the copy method instead. --- api/String.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/api/String.cpp b/api/String.cpp index fc8a196e..b67e99c8 100644 --- a/api/String.cpp +++ b/api/String.cpp @@ -632,10 +632,7 @@ String String::substring(unsigned int left, unsigned int right) const String out; if (left >= len) return out; if (right > len) right = len; - char temp = buffer[right]; // save the replaced character - buffer[right] = '\0'; - out = buffer + left; // pointer arithmetic - buffer[right] = temp; //restore character + out.copy(buffer + left, right - left); return out; } From eaab14db09073afc20bcf26bd9b7448a6a1309b0 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Mon, 17 Mar 2014 11:24:58 +0100 Subject: [PATCH 4/5] Add String::concat(const uint8_t *, unsigned int) version This just calls the char* version, but allows calling the method with a uint8_t* as well (which is not uncommon for buffers). --- api/String.h | 1 + 1 file changed, 1 insertion(+) diff --git a/api/String.h b/api/String.h index c0a8ce2d..2034c1d2 100644 --- a/api/String.h +++ b/api/String.h @@ -111,6 +111,7 @@ class String unsigned char concat(const String &str); unsigned char concat(const char *cstr); unsigned char concat(const char *cstr, unsigned int length); + unsigned char concat(const uint8_t *cstr, unsigned int length) {return concat((const char*)cstr, length);} unsigned char concat(char c); unsigned char concat(unsigned char num); unsigned char concat(int num); From 0d83f1afc3367037dbde5323c2abd0ae1bd2c583 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Tue, 4 Aug 2015 10:08:09 +0200 Subject: [PATCH 5/5] Add String(const uint8_t *, unsigned int) constructor This allows creating a String from a uint8_t[] or uint8_t* as well, without having to add explicit casts. --- api/String.h | 1 + 1 file changed, 1 insertion(+) diff --git a/api/String.h b/api/String.h index 2034c1d2..a3d0d9e8 100644 --- a/api/String.h +++ b/api/String.h @@ -69,6 +69,7 @@ class String // be false). String(const char *cstr = ""); String(const char *cstr, unsigned int length); + String(const uint8_t *cstr, unsigned int length) : String((const char*)cstr, length) {} String(const String &str); String(const __FlashStringHelper *str); #if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)