[gnoduino: 32/237] Adding F("foo") syntax for flash strings.



commit 265ab936e53c3c39779ef69b4a16e6892a34eaae
Author: David A. Mellis <d mellis arduino cc>
Date:   Sun Mar 27 15:06:20 2011 -0400

    Adding F("foo") syntax for flash strings.

 arduino/cores/arduino/Print.cpp |   18 +++++++++++++++++-
 arduino/cores/arduino/Print.h   |    2 ++
 arduino/cores/arduino/WString.h |   11 +++++++----
 3 files changed, 26 insertions(+), 5 deletions(-)
---
diff --git a/arduino/cores/arduino/Print.cpp b/arduino/cores/arduino/Print.cpp
index 62d93a3..eac145f 100755
--- a/arduino/cores/arduino/Print.cpp
+++ b/arduino/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/arduino/cores/arduino/Print.h b/arduino/cores/arduino/Print.h
index c090636..a447753 100755
--- a/arduino/cores/arduino/Print.h
+++ b/arduino/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/arduino/cores/arduino/WString.h b/arduino/cores/arduino/WString.h
index bbbe7e8..673e51b 100644
--- a/arduino/cores/arduino/WString.h
+++ b/arduino/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__



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]