Skip to content

Commit a3a2ebf

Browse files
authored
Revert "Completely inline the helper pure abstract __FlashStringHelper class (espressif#7941)"
This reverts commit b98255d.
1 parent 224e778 commit a3a2ebf

File tree

5 files changed

+82
-26
lines changed

5 files changed

+82
-26
lines changed

Diff for: cores/esp32/Print.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ size_t Print::printf(const char *format, ...)
7474
return len;
7575
}
7676

77+
size_t Print::print(const __FlashStringHelper *ifsh)
78+
{
79+
return print(reinterpret_cast<const char *>(ifsh));
80+
}
81+
7782
size_t Print::print(const String &s)
7883
{
7984
return write(s.c_str(), s.length());
@@ -147,6 +152,13 @@ size_t Print::print(double n, int digits)
147152
return printFloat(n, digits);
148153
}
149154

155+
size_t Print::println(const __FlashStringHelper *ifsh)
156+
{
157+
size_t n = print(ifsh);
158+
n += println();
159+
return n;
160+
}
161+
150162
size_t Print::print(const Printable& x)
151163
{
152164
return x.printTo(*this);

Diff for: cores/esp32/Print.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class Print
7878
// default to zero, meaning "a single write may block"
7979
// should be overriden by subclasses with buffering
8080
virtual int availableForWrite() { return 0; }
81-
size_t print(const __FlashStringHelper *ifsh) { return print(reinterpret_cast<const char *>(ifsh)); }
81+
size_t print(const __FlashStringHelper *);
8282
size_t print(const String &);
8383
size_t print(const char[]);
8484
size_t print(char);
@@ -93,7 +93,7 @@ class Print
9393
size_t print(const Printable&);
9494
size_t print(struct tm * timeinfo, const char * format = NULL);
9595

96-
size_t println(const __FlashStringHelper *ifsh) { return println(reinterpret_cast<const char *>(ifsh)); }
96+
size_t println(const __FlashStringHelper *);
9797
size_t println(const String &s);
9898
size_t println(const char[]);
9999
size_t println(char);

Diff for: cores/esp32/WString.cpp

+46
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ String::String(const String &value) {
4747
*this = value;
4848
}
4949

50+
String::String(const __FlashStringHelper *pstr) {
51+
init();
52+
*this = pstr; // see operator =
53+
}
54+
5055
#ifdef __GXX_EXPERIMENTAL_CXX0X__
5156
String::String(String &&rval) {
5257
init();
@@ -230,6 +235,16 @@ String & String::copy(const char *cstr, unsigned int length) {
230235
return *this;
231236
}
232237

238+
String & String::copy(const __FlashStringHelper *pstr, unsigned int length) {
239+
if (!reserve(length)) {
240+
invalidate();
241+
return *this;
242+
}
243+
memcpy_P(wbuffer(), (PGM_P)pstr, length + 1); // We know wbuffer() cannot ever be in PROGMEM, so memcpy safe here
244+
setLen(length);
245+
return *this;
246+
}
247+
233248
#ifdef __GXX_EXPERIMENTAL_CXX0X__
234249
void String::move(String &rhs) {
235250
if(buffer()) {
@@ -293,6 +308,15 @@ String & String::operator =(const char *cstr) {
293308
return *this;
294309
}
295310

311+
String & String::operator =(const __FlashStringHelper *pstr) {
312+
if(pstr)
313+
copy(pstr, strlen_P((PGM_P)pstr));
314+
else
315+
invalidate();
316+
317+
return *this;
318+
}
319+
296320
/*********************************************/
297321
/* concat */
298322
/*********************************************/
@@ -400,6 +424,20 @@ bool String::concat(double num) {
400424
return concat(string, strlen(string));
401425
}
402426

427+
bool String::concat(const __FlashStringHelper * str) {
428+
if (!str)
429+
return false;
430+
int length = strlen_P((PGM_P)str);
431+
if (length == 0)
432+
return true;
433+
unsigned int newlen = len() + length;
434+
if (!reserve(newlen))
435+
return false;
436+
memcpy_P(wbuffer() + len(), (PGM_P)str, length + 1);
437+
setLen(newlen);
438+
return true;
439+
}
440+
403441
/*********************************************/
404442
/* Concatenate */
405443
/*********************************************/
@@ -488,6 +526,14 @@ StringSumHelper & operator +(const StringSumHelper &lhs, unsigned long long num)
488526
return a;
489527
}
490528

529+
StringSumHelper & operator + (const StringSumHelper &lhs, const __FlashStringHelper *rhs)
530+
{
531+
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
532+
if (!a.concat(rhs))
533+
a.invalidate();
534+
return a;
535+
}
536+
491537
/*********************************************/
492538
/* Comparison */
493539
/*********************************************/

Diff for: cores/esp32/WString.h

+21-23
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@
3131
#include <ctype.h>
3232

3333

34-
// A pure abstract class forward used as a means to proide a unique pointer type
35-
// but really is never defined.
34+
// an abstract class used as a means to proide a unique pointer type
35+
// but really has no body
3636
class __FlashStringHelper;
37-
#define FPSTR(pstr_pointer) (pstr_pointer)
38-
#define F(string_literal) (string_literal)
37+
#define FPSTR(pstr_pointer) (reinterpret_cast<const __FlashStringHelper *>(pstr_pointer))
38+
#define F(string_literal) (FPSTR(PSTR(string_literal)))
3939

4040
// An inherited class for holding the result of a concatenation. These
4141
// result objects are assumed to be writable by subsequent concatenations.
@@ -59,10 +59,10 @@ class String {
5959
String(const char *cstr = "");
6060
String(const char *cstr, unsigned int length);
6161
#ifdef __GXX_EXPERIMENTAL_CXX0X__
62-
String(const uint8_t *cstr, unsigned int length) : String(reinterpret_cast<const char*>(cstr), length) {}
62+
String(const uint8_t *cstr, unsigned int length) : String((const char*)cstr, length) {}
6363
#endif
6464
String(const String &str);
65-
String(const __FlashStringHelper *str) : String(reinterpret_cast<const char*>(str)) {}
65+
String(const __FlashStringHelper *str);
6666
#ifdef __GXX_EXPERIMENTAL_CXX0X__
6767
String(String &&rval);
6868
String(StringSumHelper &&rval);
@@ -103,7 +103,7 @@ class String {
103103
// marked as invalid ("if (s)" will be false).
104104
String & operator =(const String &rhs);
105105
String & operator =(const char *cstr);
106-
String & operator = (const __FlashStringHelper *str) {return *this = reinterpret_cast<const char*>(str);}
106+
String & operator = (const __FlashStringHelper *str);
107107
#ifdef __GXX_EXPERIMENTAL_CXX0X__
108108
String & operator =(String &&rval);
109109
String & operator =(StringSumHelper &&rval);
@@ -117,7 +117,7 @@ class String {
117117
bool concat(const String &str);
118118
bool concat(const char *cstr);
119119
bool concat(const char *cstr, unsigned int length);
120-
bool concat(const uint8_t *cstr, unsigned int length) {return concat(reinterpret_cast<const char*>(cstr), length);}
120+
bool concat(const uint8_t *cstr, unsigned int length) {return concat((const char*)cstr, length);}
121121
bool concat(char c);
122122
bool concat(unsigned char c);
123123
bool concat(int num);
@@ -128,7 +128,7 @@ class String {
128128
bool concat(double num);
129129
bool concat(long long num);
130130
bool concat(unsigned long long num);
131-
bool concat(const __FlashStringHelper * str) {return concat(reinterpret_cast<const char*>(str));}
131+
bool concat(const __FlashStringHelper * str);
132132

133133
// if there's not enough memory for the concatenated value, the string
134134
// will be left unchanged (but this isn't signalled in any way)
@@ -180,7 +180,10 @@ class String {
180180
concat(num);
181181
return (*this);
182182
}
183-
String & operator += (const __FlashStringHelper *str) {return *this += reinterpret_cast<const char*>(str);}
183+
String & operator += (const __FlashStringHelper *str){
184+
concat(str);
185+
return (*this);
186+
}
184187

185188
friend StringSumHelper & operator +(const StringSumHelper &lhs, const String &rhs);
186189
friend StringSumHelper & operator +(const StringSumHelper &lhs, const char *cstr);
@@ -192,6 +195,7 @@ class String {
192195
friend StringSumHelper & operator +(const StringSumHelper &lhs, unsigned long num);
193196
friend StringSumHelper & operator +(const StringSumHelper &lhs, float num);
194197
friend StringSumHelper & operator +(const StringSumHelper &lhs, double num);
198+
friend StringSumHelper & operator +(const StringSumHelper &lhs, const __FlashStringHelper *rhs);
195199
friend StringSumHelper & operator +(const StringSumHelper &lhs, long long num);
196200
friend StringSumHelper & operator +(const StringSumHelper &lhs, unsigned long long num);
197201

@@ -225,15 +229,15 @@ class String {
225229
return this->startsWith(String(prefix));
226230
}
227231
bool startsWith(const __FlashStringHelper *prefix) const {
228-
return this->startsWith(reinterpret_cast<const char*>(prefix));
232+
return this->startsWith(String(prefix));
229233
}
230234
bool startsWith(const String &prefix, unsigned int offset) const;
231235
bool endsWith(const String &suffix) const;
232236
bool endsWith(const char *suffix) const {
233237
return this->endsWith(String(suffix));
234238
}
235239
bool endsWith(const __FlashStringHelper * suffix) const {
236-
return this->endsWith(reinterpret_cast<const char*>(suffix));
240+
return this->endsWith(String(suffix));
237241
}
238242

239243
// character access
@@ -272,16 +276,16 @@ class String {
272276
this->replace(String(find), replace);
273277
}
274278
void replace(const __FlashStringHelper *find, const String &replace) {
275-
this->replace(reinterpret_cast<const char*>(find), replace);
279+
this->replace(String(find), replace);
276280
}
277281
void replace(const char *find, const char *replace) {
278282
this->replace(String(find), String(replace));
279283
}
280284
void replace(const __FlashStringHelper *find, const char *replace) {
281-
this->replace(reinterpret_cast<const char*>(find), String(replace));
285+
this->replace(String(find), String(replace));
282286
}
283287
void replace(const __FlashStringHelper *find, const __FlashStringHelper *replace) {
284-
this->replace(reinterpret_cast<const char*>(find), reinterpret_cast<const char*>(replace));
288+
this->replace(String(find), String(replace));
285289
}
286290
void remove(unsigned int index);
287291
void remove(unsigned int index, unsigned int count);
@@ -336,7 +340,7 @@ class String {
336340
inline void setCapacity(int cap) { if (!isSSO()) ptr.cap = cap; }
337341
inline void setBuffer(char *buff) { if (!isSSO()) ptr.buff = buff; }
338342
// Buffer accessor functions
339-
inline const char *buffer() const { return reinterpret_cast<const char *>(isSSO() ? sso.buff : ptr.buff); }
343+
inline const char *buffer() const { return (const char *)(isSSO() ? sso.buff : ptr.buff); }
340344
inline char *wbuffer() const { return isSSO() ? const_cast<char *>(sso.buff) : ptr.buff; } // Writable version of buffer
341345

342346
protected:
@@ -346,9 +350,7 @@ class String {
346350

347351
// copy and move
348352
String & copy(const char *cstr, unsigned int length);
349-
String & copy(const __FlashStringHelper *pstr, unsigned int length) {
350-
return copy(reinterpret_cast<const char*>(pstr), length);
351-
}
353+
String & copy(const __FlashStringHelper *pstr, unsigned int length);
352354
#ifdef __GXX_EXPERIMENTAL_CXX0X__
353355
void move(String &rhs);
354356
#endif
@@ -393,10 +395,6 @@ class StringSumHelper: public String {
393395
String(num) {
394396
}
395397
};
396-
397-
inline StringSumHelper & operator +(const StringSumHelper &lhs, const __FlashStringHelper *rhs) {
398-
return lhs + reinterpret_cast<const char*>(rhs);
399-
}
400398

401399
extern const String emptyString;
402400

Diff for: libraries/WebServer/src/Uri.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class Uri {
1212
public:
1313
Uri(const char *uri) : _uri(uri) {}
1414
Uri(const String &uri) : _uri(uri) {}
15-
Uri(const __FlashStringHelper *uri) : _uri((const char *)uri) {}
15+
Uri(const __FlashStringHelper *uri) : _uri(String(uri)) {}
1616
virtual ~Uri() {}
1717

1818
virtual Uri* clone() const {

0 commit comments

Comments
 (0)