From c780997fa8327b8fa06cd4d2c5b468f8cdfcae90 Mon Sep 17 00:00:00 2001 From: David Freitag Date: Tue, 26 Aug 2014 18:33:30 -0400 Subject: [PATCH 1/2] Added __FlashStringhelper* comparison operators to String object --- hardware/arduino/cores/arduino/WString.cpp | 13 +++++++++++++ hardware/arduino/cores/arduino/WString.h | 3 +++ 2 files changed, 16 insertions(+) diff --git a/hardware/arduino/cores/arduino/WString.cpp b/hardware/arduino/cores/arduino/WString.cpp index ed880ce2b90..003dd523c35 100644 --- a/hardware/arduino/cores/arduino/WString.cpp +++ b/hardware/arduino/cores/arduino/WString.cpp @@ -453,6 +453,19 @@ unsigned char String::equals(const char *cstr) const return strcmp(buffer, cstr) == 0; } +unsigned char String::equals(const __FlashStringHelper *fstr) const +{ + const char PROGMEM *p = (const char PROGMEM *)fstr; + + for (int i = 0; i < len; i++) + { + if (pgm_read_byte(p) == 0) return 0; + if (buffer[i] != (char)pgm_read_byte(p++)) return 0; + } + + return 1; +} + unsigned char String::operator<(const String &rhs) const { return compareTo(rhs) < 0; diff --git a/hardware/arduino/cores/arduino/WString.h b/hardware/arduino/cores/arduino/WString.h index 74024309278..4da29a13a45 100644 --- a/hardware/arduino/cores/arduino/WString.h +++ b/hardware/arduino/cores/arduino/WString.h @@ -139,10 +139,13 @@ class String int compareTo(const String &s) const; unsigned char equals(const String &s) const; unsigned char equals(const char *cstr) const; + unsigned char equals(const __FlashStringHelper *fstr) const; unsigned char operator == (const String &rhs) const {return equals(rhs);} unsigned char operator == (const char *cstr) const {return equals(cstr);} + unsigned char operator == (const __FlashStringHelper *fstr) const {return equals(fstr);} unsigned char operator != (const String &rhs) const {return !equals(rhs);} unsigned char operator != (const char *cstr) const {return !equals(cstr);} + unsigned char operator != (const __FlashStringHelper *fstr) const {return !equals(fstr);} unsigned char operator < (const String &rhs) const; unsigned char operator > (const String &rhs) const; unsigned char operator <= (const String &rhs) const; From cb357724a26105403069305337eb403b17529bb6 Mon Sep 17 00:00:00 2001 From: David Freitag Date: Wed, 27 Aug 2014 14:41:34 -0400 Subject: [PATCH 2/2] Added a null terminator check Without this check the comparison of the String "Hello World!" and the flash String "Hello World!something" would return 1. --- hardware/arduino/cores/arduino/WString.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hardware/arduino/cores/arduino/WString.cpp b/hardware/arduino/cores/arduino/WString.cpp index 003dd523c35..6299c94e22c 100644 --- a/hardware/arduino/cores/arduino/WString.cpp +++ b/hardware/arduino/cores/arduino/WString.cpp @@ -463,6 +463,8 @@ unsigned char String::equals(const __FlashStringHelper *fstr) const if (buffer[i] != (char)pgm_read_byte(p++)) return 0; } + if (pgm_read_byte(p) != 0) return 0; + return 1; }