Arch/Esp32/Components/libc/src/include/sys/pgmspace.h
Go to the documentation of this file.
1 /****
2  * Sming Framework Project - Open Source framework for high efficiency native ESP8266 development.
3  * Created 2015 by Skurydin Alexey
4  * http://github.com/SmingHub/Sming
5  * All files of the Sming Core are provided under the LGPL v3 license.
6  *
7  * pgmspace.h - Support for reading flash memory
8  *
9  ****/
10 
11 #pragma once
12 
13 #include <esp_attr.h>
14 #include <c_types.h>
15 #include <soc/soc.h>
16 
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20 
24 #define isFlashPtr(ptr) ((uint32_t)(ptr) >= SOC_DROM_LOW && (uint32_t)(ptr) < SOC_DROM_HIGH)
25 
26 #define PROGMEM STORE_ATTR ICACHE_RODATA_ATTR
27 #define PROGMEM_PSTR PROGMEM
28 #define PSTR(str) (str)
29 
30 #define PGM_P const char*
31 #define PGM_VOID_P const void*
32 
38 #define pgm_read_byte(addr) (*(const unsigned char*)(addr))
39 #define pgm_read_word(addr) \
40  ({ \
41  uint32_t tmp_addr = (uint32_t)(addr); \
42  *(const uint16_t*)tmp_addr; \
43  })
44 #define pgm_read_dword(addr) \
45  ({ \
46  uint32_t tmp_addr = (uint32_t)(addr); \
47  *(const uint32_t*)tmp_addr; \
48  })
49 #define pgm_read_float(addr) \
50  ({ \
51  uint32_t tmp_addr = (uint32_t)(addr); \
52  *(const float*)tmp_addr; \
53  })
54 
57 #define pgm_read_byte_near(addr) pgm_read_byte(addr)
58 #define pgm_read_word_near(addr) pgm_read_word(addr)
59 #define pgm_read_dword_near(addr) pgm_read_dword(addr)
60 #define pgm_read_float_near(addr) pgm_read_float(addr)
61 #define pgm_read_byte_far(addr) pgm_read_byte(addr)
62 #define pgm_read_word_far(addr) pgm_read_word(addr)
63 #define pgm_read_dword_far(addr) pgm_read_dword(addr)
64 #define pgm_read_float_far(addr) pgm_read_float(addr)
65 
66 #define memcpy_P(dest, src_P, num) memcpy(dest, src_P, num)
67 #define memcmp_P(buf1, buf2_P, len) memcmp(buf1, buf2_P, len)
68 #define strlen_P(str_P) strlen(str_P)
69 #define strcpy_P(dest, src_P) strcpy(dest, src_P)
70 #define strncpy_P(dest, src_P, size) strncpy(dest, src_P, size)
71 #define strcmp_P(str1, str2_P) strcmp(str1, str2_P)
72 #define strncmp_P(str1, str2_P, size) strncmp(str1, str2_P, size)
73 #define strcasecmp_P(str1, str2_P) strcasecmp(str1, str2_P)
74 #define strcat_P(dest, src_P) strcat(dest, src_P)
75 #define strstr_P(haystack, needle_P) strstr(haystack, needle_P)
76 #define sprintf_P(str, format_P, ...) m_snprintf(str, 1024, format_P, ##__VA_ARGS__)
77 
78 #ifdef __cplusplus
79 }
80 #endif