From a7626ebf2404cb3b35a60ae8b4cd11d357314834 Mon Sep 17 00:00:00 2001 From: Eric Wieser Date: Thu, 22 Dec 2016 14:17:02 +0000 Subject: [PATCH 1/2] Support printing constant strings containing nulls This only changes the behaviour of code like `Serial.print("Hello""\0""World")`, where writing the null byte is clearly intended. This also gives a speed boost for all calls with constant strings --- hardware/arduino/avr/cores/arduino/Print.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/hardware/arduino/avr/cores/arduino/Print.h b/hardware/arduino/avr/cores/arduino/Print.h index 7b53aa4d17e..93a6f9ca3bd 100644 --- a/hardware/arduino/avr/cores/arduino/Print.h +++ b/hardware/arduino/avr/cores/arduino/Print.h @@ -50,6 +50,10 @@ class Print if (str == NULL) return 0; return write((const uint8_t *)str, strlen(str)); } + template + inline size_t write(const char (str&)[N]) { + return write((const uint8_t *)str, N); + } virtual size_t write(const uint8_t *buffer, size_t size); size_t write(const char *buffer, size_t size) { return write((const uint8_t *)buffer, size); @@ -58,6 +62,10 @@ class Print size_t print(const __FlashStringHelper *); size_t print(const String &); size_t print(const char[]); + template + inline size_t print(const char (str&)[N]) { + return write(str); + } size_t print(char); size_t print(unsigned char, int = DEC); size_t print(int, int = DEC); @@ -70,6 +78,12 @@ class Print size_t println(const __FlashStringHelper *); size_t println(const String &s); size_t println(const char[]); + template + inline size_t println(const char (str&)[N]) { + size_t n = print(str); + n += println(); + return n; + } size_t println(char); size_t println(unsigned char, int = DEC); size_t println(int, int = DEC); From dae50fc9e280805d6c22a09d374538433ca10c3b Mon Sep 17 00:00:00 2001 From: Eric Wieser Date: Thu, 22 Dec 2016 14:21:20 +0000 Subject: [PATCH 2/2] Do not include null terminator in length --- hardware/arduino/avr/cores/arduino/Print.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardware/arduino/avr/cores/arduino/Print.h b/hardware/arduino/avr/cores/arduino/Print.h index 93a6f9ca3bd..d84eb0645b1 100644 --- a/hardware/arduino/avr/cores/arduino/Print.h +++ b/hardware/arduino/avr/cores/arduino/Print.h @@ -52,7 +52,7 @@ class Print } template inline size_t write(const char (str&)[N]) { - return write((const uint8_t *)str, N); + return write((const uint8_t *)str, N-1); } virtual size_t write(const uint8_t *buffer, size_t size); size_t write(const char *buffer, size_t size) {