1- /* Simple compatibility headers for AVR code used with ARM chips
2- * Copyright (c) 2015 Paul Stoffregen <paul@pjrc.com>
3- *
4- * Permission is hereby granted, free of charge, to any person obtaining a copy
5- * of this software and associated documentation files (the "Software"), to deal
6- * in the Software without restriction, including without limitation the rights
7- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8- * copies of the Software, and to permit persons to whom the Software is
9- * furnished to do so, subject to the following conditions:
10- *
11- * The above copyright notice and this permission notice shall be included in
12- * all copies or substantial portions of the Software.
13- *
14- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20- * THE SOFTWARE.
21- */
1+ /*
2+ pgmspace.h - Definitions for compatibility with AVR pgmspace macros
3+
4+ Copyright (c) 2015 Arduino LLC
5+
6+ Based on work of Paul Stoffregen on Teensy 3 (http://pjrc.com)
7+
8+ Permission is hereby granted, free of charge, to any person obtaining a copy
9+ of this software and associated documentation files (the "Software"), to deal
10+ in the Software without restriction, including without limitation the rights
11+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+ copies of the Software, and to permit persons to whom the Software is
13+ furnished to do so, subject to the following conditions:
14+
15+ The above copyright notice and this permission notice shall be included in
16+ all copies or substantial portions of the Software.
17+
18+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+ THE SOFTWARE
25+ */
2226
2327#ifndef __PGMSPACE_H_
2428#define __PGMSPACE_H_ 1
@@ -43,38 +47,39 @@ typedef uint32_t prog_uint32_t;
4347typedef int64_t prog_int64_t ;
4448typedef uint64_t prog_uint64_t ;
4549
46- #define memchr_P (str , c , len ) memchr((str), (c), (len))
47- #define memcmp_P (a , b , n ) memcmp((a), (b), (n))
48- #define memcpy_P (dest , src , num ) memcpy((dest), (src), (num))
49- #define memmem_P (a , alen , b , blen ) memmem((a), (alen), (b), (blen))
50- #define memrchr_P (str , val , len ) memrchr((str), (val), (len))
50+ typedef const void * int_farptr_t ;
51+ typedef const void * uint_farptr_t ;
52+
53+ #define memchr_P (s , c , n ) memchr((s), (c), (n))
54+ #define memcmp_P (s1 , s2 , n ) memcmp((s1), (s2), (n))
55+ #define memccpy_P (dest , src , c , n ) memccpy((dest), (src), (c), (n))
56+ #define memcpy_P (dest , src , n ) memcpy((dest), (src), (n))
57+ #define memmem_P (haystack , haystacklen , needle , needlelen ) memmem((haystack), (haystacklen), (needle), (needlelen))
58+ #define memrchr_P (s , c , n ) memrchr((s), (c), (n))
5159#define strcat_P (dest , src ) strcat((dest), (src))
52- #define strchr_P (str , c ) strchr((str ), (c))
53- #define strchrnul_P (str , c ) strchrnul((str ), (c))
60+ #define strchr_P (s , c ) strchr((s ), (c))
61+ #define strchrnul_P (s , c ) strchrnul((s ), (c))
5462#define strcmp_P (a , b ) strcmp((a), (b))
5563#define strcpy_P (dest , src ) strcpy((dest), (src))
56- #define strcasecmp_P (a , b ) strcasecmp((a), (b))
57- #define strcasestr_P (a , b ) strcasestr((a), (b))
58- #define strlcat_P (dest , src , len ) strlcat((dest), (src), (len))
59- #define strlcpy_P (dest , src , len ) strlcpy((dest), (src), (len))
60- #define strlen_P (s ) strlen((const char *)(s))
61- #define strnlen_P (str , len ) strnlen((str), (len))
62- #define strncmp_P (a , b , n ) strncmp((a), (b), (n))
63- #define strncasecmp_P (a , b , n ) strncasecmp((a), (b), (n))
64- #define strncat_P (a , b , n ) strncat((a), (b), (n))
65- #define strncpy_P (a , b , n ) strncpy((a), (b), (n))
66- #define strpbrk_P (str , chrs ) strpbrk((str), (chrs))
67- #define strrchr_P (str , c ) strrchr((str), (c))
68- #define strsep_P (strp , delim ) strsep((strp), (delim))
69- #define strspn_P (str , chrs ) strspn((str), (chrs))
64+ #define strcasecmp_P (s1 , s2 ) strcasecmp((s1), (s2))
65+ #define strcasestr_P (haystack , needle ) strcasestr((haystack), (needle))
66+ #define strcspn_P (s , accept ) strcspn((s), (accept))
67+ #define strlcat_P (s1 , s2 , n ) strlcat((s1), (s2), (n))
68+ #define strlcpy_P (s1 , s2 , n ) strlcpy((s1), (s2), (n))
69+ #define strlen_P (a ) strlen((a))
70+ #define strnlen_P (s , n ) strnlen((s), (n))
71+ #define strncmp_P (s1 , s2 , n ) strncmp((s1), (s2), (n))
72+ #define strncasecmp_P (s1 , s2 , n ) strncasecmp((s1), (s2), (n))
73+ #define strncat_P (s1 , s2 , n ) strncat((s1), (s2), (n))
74+ #define strncpy_P (s1 , s2 , n ) strncpy((s1), (s2), (n))
75+ #define strpbrk_P (s , accept ) strpbrk((s), (accept))
76+ #define strrchr_P (s , c ) strrchr((s), (c))
77+ #define strsep_P (sp , delim ) strsep((sp), (delim))
78+ #define strspn_P (s , accept ) strspn((s), (accept))
7079#define strstr_P (a , b ) strstr((a), (b))
71- #define sprintf_P (s , ...) sprintf((s), __VA_ARGS__)
72- #define vfprintf_P (fp , s , ...) vfprintf((fp), (s), __VA_ARGS__)
73- #define printf_P (...) printf(__VA_ARGS__)
74- #define snprintf_P (s , n , ...) snprintf((s), (n), __VA_ARGS__)
75- #define vsprintf_P (s , ...) vsprintf((s), __VA_ARGS__)
76- #define vsnprintf_P (s , n , ...) vsnprintf((s), (n), __VA_ARGS__)
77- #define fprintf_P (fp , ...) fprintf((fp), __VA_ARGS__)
80+ #define strtok_P (s , delim ) strtok((s), (delim))
81+ #define strtok_rP (s , delim , last ) strtok((s), (delim), (last))
82+
7883#define strlen_PF (a ) strlen((a))
7984#define strnlen_PF (src , len ) strnlen((src), (len))
8085#define memcpy_PF (dest , src , len ) memcpy((dest), (src), (len))
@@ -91,6 +96,13 @@ typedef uint64_t prog_uint64_t;
9196#define strlcpy_PF (dest , src , n ) strlcpy((dest), (src), (n))
9297#define memcmp_PF (s1 , s2 , n ) memcmp((s1), (s2), (n))
9398
99+ #define sprintf_P (s , f , ...) sprintf((s), (f), __VA_ARGS__)
100+ #define vfprintf_P (fp , s , ...) vfprintf((fp), (s), __VA_ARGS__)
101+ #define printf_P (...) printf(__VA_ARGS__)
102+ #define snprintf_P (s , f , ...) snprintf((s), (f), __VA_ARGS__)
103+ #define vsprintf_P (s , ...) vsprintf((s), __VA_ARGS__)
104+ #define vsnprintf_P (s , n , ...) vsnprintf((s), (n), __VA_ARGS__)
105+ #define fprintf_P (fp , ...) fprintf((fp), __VA_ARGS__)
94106
95107#define pgm_read_byte (addr ) (*(const unsigned char *)(addr))
96108#if 0
@@ -121,10 +133,13 @@ typedef uint64_t prog_uint64_t;
121133#define pgm_read_dword_near (addr ) pgm_read_dword(addr)
122134#define pgm_read_float_near (addr ) pgm_read_float(addr)
123135#define pgm_read_ptr_near (addr ) pgm_read_ptr(addr)
136+
124137#define pgm_read_byte_far (addr ) pgm_read_byte(addr)
125138#define pgm_read_word_far (addr ) pgm_read_word(addr)
126139#define pgm_read_dword_far (addr ) pgm_read_dword(addr)
127140#define pgm_read_float_far (addr ) pgm_read_float(addr)
128141#define pgm_read_ptr_far (addr ) pgm_read_ptr(addr)
129142
143+ #define pgm_get_far_address (addr ) (&(addr))
144+
130145#endif
0 commit comments