Skip to content

Commit d39fefb

Browse files
committed
explicit strstr & strstr_P overload selection
introduce sys/ pgmspace.h, string.h and stdio.h consistent signatures, avoid depending on newlib quirks allow strstr & strstr_P to be the same thing
1 parent edb2230 commit d39fefb

File tree

6 files changed

+31
-40
lines changed

6 files changed

+31
-40
lines changed

cores/esp8266/WString.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@
3232
/*********************************************/
3333

3434
struct __StringImpl {
35-
// XXX since we are always building w/ C++ headers, these cannot be resolved through the type alone
36-
// don't depend on glibc quirks alone, just try to reduce number of overloads by explicitly requesting them
35+
// XXX String methods accepting `internal_strstr_t` should be able to properly select overloads
3736
// ref. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51785
3837

3938
using internal_strstr_t = String::internal_strstr_t;
@@ -65,7 +64,7 @@ struct __StringImpl {
6564
inline static internal_strstr_t __attribute__((always_inline))
6665
select_strstr(const char *str) {
6766
return __pgm_expected(str)
68-
? strstr_P
67+
? overloaded_strstr(strstr_P)
6968
: overloaded_strstr(strstr);
7069
}
7170

tests/host/common/stdio.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#pragma once
2+
#include_next <stdio.h>
3+
#include <sys/stdio.h>

tests/host/common/string.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#pragma once
2+
#include_next <string.h>
3+
#include <sys/string.h>

tests/host/core/test_string.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ TEST_CASE("String::trim", "[core][String]")
4545
TEST_CASE("String::replace", "[core][String]")
4646
{
4747
const char data[] = "The quick brown fox jumped over the lazy dog.";
48-
String str = data;
48+
String str = data;
4949
str.replace("fox", "vulpes vulpes");
5050
REQUIRE(str == "The quick brown vulpes vulpes jumped over the lazy dog.");
5151
str.replace("vulpes", "lis lis");

tests/host/sys/pgmspace.h

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* PGMSPACE.H - Accessor utilities/types for accessing PROGMEM data */
22

3-
#ifndef _PGMSPACE_H_
3+
#pragma once
4+
45
#define _PGMSPACE_H_
56

67
// These are no-ops in anything but the ESP8266, where they are defined in
@@ -50,38 +51,3 @@
5051
#define pgm_read_dword_far(addr) pgm_read_dword(addr)
5152
#define pgm_read_float_far(addr) pgm_read_float(addr)
5253
#define pgm_read_ptr_far(addr) pgm_read_ptr(addr)
53-
54-
// Wrapper inlines for _P functions
55-
#include <stdio.h>
56-
#include <string.h>
57-
inline const char* strstr_P(const char* haystack, const char* needle)
58-
{
59-
return strstr(haystack, needle);
60-
}
61-
inline char* strcpy_P(char* dest, const char* src)
62-
{
63-
return strcpy(dest, src);
64-
}
65-
inline size_t strlen_P(const char* s)
66-
{
67-
return strlen(s);
68-
}
69-
inline int vsnprintf_P(char* str, size_t size, const char* format, va_list ap)
70-
{
71-
return vsnprintf(str, size, format, ap);
72-
}
73-
74-
#define memcpy_P memcpy
75-
#define memmove_P memmove
76-
#define strncpy_P strncpy
77-
#define strcmp_P strcmp
78-
#define strcasecmp_P strcasecmp
79-
#define memccpy_P memccpy
80-
#define snprintf_P snprintf
81-
#define sprintf_P sprintf
82-
#define strncmp_P strncmp
83-
#define strncasecmp_P strncasecmp
84-
#define strcat_P strcat
85-
#define memcmp_P memcmp
86-
87-
#endif

tests/host/sys/string.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#pragma once
2+
3+
#include <stdio.h>
4+
#include <string.h>
5+
6+
#define memccpy_P memccpy
7+
#define memcmp_P memcmp
8+
#define memcpy_P memcpy
9+
#define memmove_P memmove
10+
#define snprintf_P snprintf
11+
#define sprintf_P sprintf
12+
#define strcasecmp_P strcasecmp
13+
#define strcat_P strcat
14+
#define strcmp_P strcmp
15+
#define strcpy_P strcpy
16+
#define strlen_P strlen
17+
#define strncasecmp_P strncasecmp
18+
#define strncmp_P strncmp
19+
#define strncpy_P strncpy
20+
#define strstr_P strstr

0 commit comments

Comments
 (0)