aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid A. Mellis <d.mellis@arduino.cc>2011-03-27 15:06:20 -0400
committerDavid A. Mellis <d.mellis@arduino.cc>2011-03-27 15:06:20 -0400
commitffe7bc53c1862866bf38e01174bd35d20632608c (patch)
treebf0e12629f37a0fa258b306ee7ba56a1358ac6be
parent99e642a26dc2a406cdfa2d43665f45749b63d5c8 (diff)
Adding F("foo") syntax for flash strings.
-rwxr-xr-xcores/arduino/Print.cpp18
-rwxr-xr-xcores/arduino/Print.h2
-rw-r--r--cores/arduino/WString.h11
3 files changed, 26 insertions, 5 deletions
diff --git a/cores/arduino/Print.cpp b/cores/arduino/Print.cpp
index 62d93a3..eac145f 100755
--- a/cores/arduino/Print.cpp
+++ b/cores/arduino/Print.cpp
@@ -43,6 +43,16 @@ void Print::write(const uint8_t *buffer, size_t size)
write(*buffer++);
}
+void Print::print(const __FlashStringHelper *ifsh)
+{
+ const prog_char *p = (const prog_char *)ifsh;
+ while (1) {
+ unsigned char c = pgm_read_byte(p++);
+ if (c == 0) return;
+ write(c);
+ }
+}
+
void Print::print(const String &s)
{
for (int i = 0; i < s.length(); i++) {
@@ -101,10 +111,16 @@ void Print::print(double n, int digits)
printFloat(n, digits);
}
+void Print::println(const __FlashStringHelper *ifsh)
+{
+ print(ifsh);
+ println();
+}
+
void Print::println(void)
{
print('\r');
- print('\n');
+ print('\n');
}
void Print::println(const String &s)
diff --git a/cores/arduino/Print.h b/cores/arduino/Print.h
index c090636..a447753 100755
--- a/cores/arduino/Print.h
+++ b/cores/arduino/Print.h
@@ -40,6 +40,7 @@ class Print
virtual void write(const char *str);
virtual void write(const uint8_t *buffer, size_t size);
+ void print(const __FlashStringHelper *);
void print(const String &);
void print(const char[]);
void print(char);
@@ -50,6 +51,7 @@ class Print
void print(unsigned long, int = DEC);
void print(double, int = 2);
+ void println(const __FlashStringHelper *);
void println(const String &s);
void println(const char[]);
void println(char);
diff --git a/cores/arduino/WString.h b/cores/arduino/WString.h
index bbbe7e8..673e51b 100644
--- a/cores/arduino/WString.h
+++ b/cores/arduino/WString.h
@@ -34,6 +34,9 @@
// -felide-constructors
// -std=c++0x
+class __FlashStringHelper;
+#define F(string_literal) (reinterpret_cast<__FlashStringHelper *>(PSTR(string_literal)))
+
// An inherited class for holding the result of a concatenation. These
// result objects are assumed to be writable by subsequent concatenations.
class StringSumHelper;
@@ -51,8 +54,8 @@ public:
// constructors
// creates a copy of the initial value.
// if the initial value is null or invalid, or if memory allocation
- // fails, the string will be marked as invalid (i.e. operator bool()
- // will return false).
+ // fails, the string will be marked as invalid (i.e. "if (s)" will
+ // be false).
String(const char *cstr = "");
String(const String &str);
#ifdef __GXX_EXPERIMENTAL_CXX0X__
@@ -70,13 +73,13 @@ public:
// memory management
// return true on success, false on failure (in which case, the string
// is left unchanged). reserve(0), if successful, will validate an
- // invalid string (i.e., operator bool() will return true afterwards)
+ // invalid string (i.e., "if (s)" will be true afterwards)
unsigned char reserve(unsigned int size);
inline unsigned int length(void) const {return len;}
// creates a copy of the assigned value. if the value is null or
// invalid, or if the memory allocation fails, the string will be
- // marked as invalid (operator bool() will return false).
+ // marked as invalid ("if (s)" will be false).
String & operator = (const String &rhs);
String & operator = (const char *cstr);
#ifdef __GXX_EXPERIMENTAL_CXX0X__