/* PGMSPACE.H - Accessor utilities/types for accessing PROGMEM data */ #ifndef _PGMSPACE_H_ #define _PGMSPACE_H_ // These are no-ops in anything but the ESP8266, where they are defined in // a custom sys/pgmspace.h header #ifndef ICACHE_RODATA_ATTR #define ICACHE_RODATA_ATTR #endif #ifndef PROGMEM #define PROGMEM #endif #ifndef PGM_P #define PGM_P const char* #endif #ifndef PGM_VOID_P #define PGM_VOID_P const void* #endif #ifndef PSTR #define PSTR #endif #ifdef __cplusplus #define pgm_read_byte(addr) (*reinterpret_cast(addr)) #define pgm_read_word(addr) (*reinterpret_cast(addr)) #define pgm_read_dword(addr) (*reinterpret_cast(addr)) #define pgm_read_float(addr) (*reinterpret_cast(addr)) #define pgm_read_ptr(addr) (*reinterpret_cast(addr)) #else #define pgm_read_byte(addr) (*(const uint8_t*)(addr)) #define pgm_read_word(addr) (*(const uint16_t*)(addr)) #define pgm_read_dword(addr) (*(const uint32_t*)(addr)) #define pgm_read_float(addr) (*(const float)(addr)) #define pgm_read_ptr(addr) (*(const void* const*)(addr)) #endif #define pgm_read_byte_near(addr) pgm_read_byte(addr) #define pgm_read_word_near(addr) pgm_read_word(addr) #define pgm_read_dword_near(addr) pgm_read_dword(addr) #define pgm_read_float_near(addr) pgm_read_float(addr) #define pgm_read_ptr_near(addr) pgm_read_ptr(addr) #define pgm_read_byte_far(addr) pgm_read_byte(addr) #define pgm_read_word_far(addr) pgm_read_word(addr) #define pgm_read_dword_far(addr) pgm_read_dword(addr) #define pgm_read_float_far(addr) pgm_read_float(addr) #define pgm_read_ptr_far(addr) pgm_read_ptr(addr) // Wrapper inlines for _P functions #include #include inline const char* strstr_P(const char* haystack, const char* needle) { return strstr(haystack, needle); } inline char* strcpy_P(char* dest, const char* src) { return strcpy(dest, src); } inline size_t strlen_P(const char* s) { return strlen(s); } inline int vsnprintf_P(char* str, size_t size, const char* format, va_list ap) { return vsnprintf(str, size, format, ap); } #define memcpy_P memcpy #define memmove_P memmove #define strncpy_P strncpy #define strcmp_P strcmp #define strcasecmp_P strcasecmp #define memccpy_P memccpy #define snprintf_P snprintf #define sprintf_P sprintf #define strncmp_P strncmp #define strncasecmp_P strncasecmp #define strcat_P strcat #endif