27
27
#include "cstdio"
28
28
#include "ostream_helpers"
29
29
30
+ #ifdef ARDUINO_ARCH_AVR
31
+ #include <avr/pgmspace.h> // typedef PGM_P, pgm_read_byte()
32
+ #include "WString.h" // class __FlashStringHelper
33
+ #endif
34
+
30
35
#pragma GCC visibility push(default)
31
36
32
37
namespace std {
@@ -407,6 +412,24 @@ namespace std {
407
412
return out;
408
413
}
409
414
415
+ #ifdef ARDUINO_ARCH_AVR
416
+ //support strings from flash memory [PI]
417
+ //stolen from Arduino Print.cpp
418
+ //sample use: cout << F("Hello") << endl;
419
+ template<class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>&
420
+ operator<<(basic_ostream<charT,traits>& out, const __FlashStringHelper* c)
421
+ {
422
+ typename basic_ostream<charT,traits>::sentry s(out);
423
+ PGM_P p = reinterpret_cast<PGM_P>(c);
424
+ while (true) {
425
+ charT x = pgm_read_byte(p++);
426
+ if (x == 0) break;
427
+ out.put(x);
428
+ }
429
+ return out;
430
+ }
431
+ #endif
432
+
410
433
// partial specializations
411
434
template<class traits> _UCXXEXPORT basic_ostream<char,traits>&
412
435
operator<<(basic_ostream<char,traits>& out, const char* c)
@@ -416,6 +439,24 @@ namespace std {
416
439
return out;
417
440
}
418
441
442
+ #ifdef ARDUINO_ARCH_AVR
443
+ //support strings from flash memory [PI]
444
+ //stolen from Arduino Print.cpp
445
+ //sample use: cout << F("Hello") << endl;
446
+ template<class traits> _UCXXEXPORT basic_ostream<char,traits>&
447
+ operator<<(basic_ostream<char,traits>& out, const __FlashStringHelper* c) //[PI: New] stolen from Arduino Print.cpp
448
+ {
449
+ typename basic_ostream<char,traits>::sentry s(out);
450
+ PGM_P p = reinterpret_cast<PGM_P>(c);
451
+ while (true) {
452
+ char x = pgm_read_byte(p++);
453
+ if (x == 0) break;
454
+ out.put(x);
455
+ }
456
+ return out;
457
+ }
458
+ #endif
459
+
419
460
#ifdef __UCLIBCXX_HAS_WCHAR__
420
461
template<class traits> _UCXXEXPORT basic_ostream<wchar_t,traits>&
421
462
operator<<(basic_ostream<wchar_t,traits>& out, const char* c)
0 commit comments