83 #define __PGMSPACE_H_ 1 93 #ifndef __ATTR_CONST__ 94 #define __ATTR_CONST__ __attribute__((__const__)) 97 #ifndef __ATTR_PROGMEM__ 98 #define __ATTR_PROGMEM__ __attribute__((__progmem__)) 101 #ifndef __ATTR_PURE__ 102 #define __ATTR_PURE__ __attribute__((__pure__)) 113 #define PROGMEM __ATTR_PROGMEM__ 119 #if defined(__DOXYGEN__) 339 #define PGM_P const char * 348 #define PGM_VOID_P const void * 351 #elif defined(__PROG_TYPES_COMPAT__) 353 typedef void prog_void
__attribute__((__progmem__,deprecated(
"prog_void type is deprecated.")));
354 typedef char prog_char
__attribute__((__progmem__,deprecated(
"prog_char type is deprecated.")));
355 typedef unsigned char prog_uchar
__attribute__((__progmem__,deprecated(
"prog_uchar type is deprecated.")));
356 typedef int8_t prog_int8_t
__attribute__((__progmem__,deprecated(
"prog_int8_t type is deprecated.")));
357 typedef uint8_t prog_uint8_t
__attribute__((__progmem__,deprecated(
"prog_uint8_t type is deprecated.")));
358 typedef int16_t prog_int16_t
__attribute__((__progmem__,deprecated(
"prog_int16_t type is deprecated.")));
359 typedef uint16_t prog_uint16_t
__attribute__((__progmem__,deprecated(
"prog_uint16_t type is deprecated.")));
360 typedef int32_t prog_int32_t
__attribute__((__progmem__,deprecated(
"prog_int32_t type is deprecated.")));
361 typedef uint32_t prog_uint32_t
__attribute__((__progmem__,deprecated(
"prog_uint32_t type is deprecated.")));
363 typedef int64_t prog_int64_t
__attribute__((__progmem__,deprecated(
"prog_int64_t type is deprecated.")));
364 typedef uint64_t prog_uint64_t
__attribute__((__progmem__,deprecated(
"prog_uint64_t type is deprecated.")));
368 #define PGM_P const prog_char * 372 #define PGM_VOID_P const prog_void * 378 #define PGM_P const char * 382 #define PGM_VOID_P const void * 396 #if defined(__DOXYGEN__) 405 # define PSTR(s) ((const PROGMEM char *)(s)) 408 # define PSTR(s) (__extension__({static const char __c[] PROGMEM = (s); &__c[0];})) 412 #define __LPM_classic__(addr) \ 414 uint16_t __addr16 = (uint16_t)(addr); \ 416 __asm__ __volatile__ \ 419 "mov %0, r0" "\n\t" \ 427 #define __LPM_tiny__(addr) \ 429 uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \ 440 #define __LPM_enhanced__(addr) \ 442 uint16_t __addr16 = (uint16_t)(addr); \ 444 __asm__ __volatile__ \ 453 #define __LPM_word_classic__(addr) \ 455 uint16_t __addr16 = (uint16_t)(addr); \ 457 __asm__ __volatile__ \ 460 "mov %A0, r0" "\n\t" \ 461 "adiw r30, 1" "\n\t" \ 463 "mov %B0, r0" "\n\t" \ 464 : "=r" (__result), "=z" (__addr16) \ 471 #define __LPM_word_tiny__(addr) \ 473 uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \ 477 "ld %A0, z+" "\n\t" \ 479 : "=r" (__result), "=z" (__addr16) \ 485 #define __LPM_word_enhanced__(addr) \ 487 uint16_t __addr16 = (uint16_t)(addr); \ 489 __asm__ __volatile__ \ 491 "lpm %A0, Z+" "\n\t" \ 492 "lpm %B0, Z" "\n\t" \ 493 : "=r" (__result), "=z" (__addr16) \ 499 #define __LPM_dword_classic__(addr) \ 501 uint16_t __addr16 = (uint16_t)(addr); \ 503 __asm__ __volatile__ \ 506 "mov %A0, r0" "\n\t" \ 507 "adiw r30, 1" "\n\t" \ 509 "mov %B0, r0" "\n\t" \ 510 "adiw r30, 1" "\n\t" \ 512 "mov %C0, r0" "\n\t" \ 513 "adiw r30, 1" "\n\t" \ 515 "mov %D0, r0" "\n\t" \ 516 : "=r" (__result), "=z" (__addr16) \ 523 #define __LPM_dword_tiny__(addr) \ 525 uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \ 529 "ld %A0, z+" "\n\t" \ 530 "ld %B0, z+" "\n\t" \ 531 "ld %C0, z+" "\n\t" \ 533 : "=r" (__result), "=z" (__addr16) \ 539 #define __LPM_dword_enhanced__(addr) \ 541 uint16_t __addr16 = (uint16_t)(addr); \ 543 __asm__ __volatile__ \ 545 "lpm %A0, Z+" "\n\t" \ 546 "lpm %B0, Z+" "\n\t" \ 547 "lpm %C0, Z+" "\n\t" \ 548 "lpm %D0, Z" "\n\t" \ 549 : "=r" (__result), "=z" (__addr16) \ 555 #define __LPM_float_classic__(addr) \ 557 uint16_t __addr16 = (uint16_t)(addr); \ 559 __asm__ __volatile__ \ 562 "mov %A0, r0" "\n\t" \ 563 "adiw r30, 1" "\n\t" \ 565 "mov %B0, r0" "\n\t" \ 566 "adiw r30, 1" "\n\t" \ 568 "mov %C0, r0" "\n\t" \ 569 "adiw r30, 1" "\n\t" \ 571 "mov %D0, r0" "\n\t" \ 572 : "=r" (__result), "=z" (__addr16) \ 579 #define __LPM_float_tiny__(addr) \ 581 uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \ 585 "ld %A0, z+" "\n\t" \ 586 "ld %B0, z+" "\n\t" \ 587 "ld %C0, z+" "\n\t" \ 589 : "=r" (__result), "=z" (__addr16) \ 595 #define __LPM_float_enhanced__(addr) \ 597 uint16_t __addr16 = (uint16_t)(addr); \ 599 __asm__ __volatile__ \ 601 "lpm %A0, Z+" "\n\t" \ 602 "lpm %B0, Z+" "\n\t" \ 603 "lpm %C0, Z+" "\n\t" \ 604 "lpm %D0, Z" "\n\t" \ 605 : "=r" (__result), "=z" (__addr16) \ 611 #if defined (__AVR_HAVE_LPMX__) 612 #define __LPM(addr) __LPM_enhanced__(addr) 613 #define __LPM_word(addr) __LPM_word_enhanced__(addr) 614 #define __LPM_dword(addr) __LPM_dword_enhanced__(addr) 615 #define __LPM_float(addr) __LPM_float_enhanced__(addr) 625 #elif defined (__AVR_TINY__) 626 #define __LPM(addr) __LPM_tiny__(addr) 627 #define __LPM_word(addr) __LPM_word_tiny__(addr) 628 #define __LPM_dword(addr) __LPM_dword_tiny__(addr) 629 #define __LPM_float(addr) __LPM_float_tiny__(addr) 631 #define __LPM(addr) __LPM_classic__(addr) 632 #define __LPM_word(addr) __LPM_word_classic__(addr) 633 #define __LPM_dword(addr) __LPM_dword_classic__(addr) 634 #define __LPM_float(addr) __LPM_float_classic__(addr) 645 #define pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short)) 653 #define pgm_read_word_near(address_short) __LPM_word((uint16_t)(address_short)) 661 #define pgm_read_dword_near(address_short) \ 662 __LPM_dword((uint16_t)(address_short)) 670 #define pgm_read_float_near(address_short) \ 671 __LPM_float((uint16_t)(address_short)) 679 #define pgm_read_ptr_near(address_short) \ 680 (void*)__LPM_word((uint16_t)(address_short)) 682 #if defined(RAMPZ) || defined(__DOXYGEN__) 691 #define __ELPM_classic__(addr) \ 693 uint32_t __addr32 = (uint32_t)(addr); \ 695 __asm__ __volatile__ \ 697 "out %2, %C1" "\n\t" \ 698 "mov r31, %B1" "\n\t" \ 699 "mov r30, %A1" "\n\t" \ 701 "mov %0, r0" "\n\t" \ 704 "I" (_SFR_IO_ADDR(RAMPZ)) \ 705 : "r0", "r30", "r31" \ 710 #define __ELPM_enhanced__(addr) \ 712 uint32_t __addr32 = (uint32_t)(addr); \ 714 __asm__ __volatile__ \ 716 "out %2, %C1" "\n\t" \ 717 "movw r30, %1" "\n\t" \ 718 "elpm %0, Z+" "\n\t" \ 721 "I" (_SFR_IO_ADDR(RAMPZ)) \ 727 #define __ELPM_xmega__(addr) \ 729 uint32_t __addr32 = (uint32_t)(addr); \ 731 __asm__ __volatile__ \ 733 "in __tmp_reg__, %2" "\n\t" \ 734 "out %2, %C1" "\n\t" \ 735 "movw r30, %1" "\n\t" \ 736 "elpm %0, Z+" "\n\t" \ 737 "out %2, __tmp_reg__" \ 740 "I" (_SFR_IO_ADDR(RAMPZ)) \ 746 #define __ELPM_word_classic__(addr) \ 748 uint32_t __addr32 = (uint32_t)(addr); \ 750 __asm__ __volatile__ \ 752 "out %2, %C1" "\n\t" \ 753 "mov r31, %B1" "\n\t" \ 754 "mov r30, %A1" "\n\t" \ 756 "mov %A0, r0" "\n\t" \ 758 "adiw r30, 1" "\n\t" \ 759 "adc r0, __zero_reg__" "\n\t" \ 760 "out %2, r0" "\n\t" \ 762 "mov %B0, r0" "\n\t" \ 765 "I" (_SFR_IO_ADDR(RAMPZ)) \ 766 : "r0", "r30", "r31" \ 771 #define __ELPM_word_enhanced__(addr) \ 773 uint32_t __addr32 = (uint32_t)(addr); \ 775 __asm__ __volatile__ \ 777 "out %2, %C1" "\n\t" \ 778 "movw r30, %1" "\n\t" \ 779 "elpm %A0, Z+" "\n\t" \ 780 "elpm %B0, Z" "\n\t" \ 783 "I" (_SFR_IO_ADDR(RAMPZ)) \ 789 #define __ELPM_word_xmega__(addr) \ 791 uint32_t __addr32 = (uint32_t)(addr); \ 793 __asm__ __volatile__ \ 795 "in __tmp_reg__, %2" "\n\t" \ 796 "out %2, %C1" "\n\t" \ 797 "movw r30, %1" "\n\t" \ 798 "elpm %A0, Z+" "\n\t" \ 799 "elpm %B0, Z" "\n\t" \ 800 "out %2, __tmp_reg__" \ 803 "I" (_SFR_IO_ADDR(RAMPZ)) \ 809 #define __ELPM_dword_classic__(addr) \ 811 uint32_t __addr32 = (uint32_t)(addr); \ 813 __asm__ __volatile__ \ 815 "out %2, %C1" "\n\t" \ 816 "mov r31, %B1" "\n\t" \ 817 "mov r30, %A1" "\n\t" \ 819 "mov %A0, r0" "\n\t" \ 821 "adiw r30, 1" "\n\t" \ 822 "adc r0, __zero_reg__" "\n\t" \ 823 "out %2, r0" "\n\t" \ 825 "mov %B0, r0" "\n\t" \ 827 "adiw r30, 1" "\n\t" \ 828 "adc r0, __zero_reg__" "\n\t" \ 829 "out %2, r0" "\n\t" \ 831 "mov %C0, r0" "\n\t" \ 833 "adiw r30, 1" "\n\t" \ 834 "adc r0, __zero_reg__" "\n\t" \ 835 "out %2, r0" "\n\t" \ 837 "mov %D0, r0" "\n\t" \ 840 "I" (_SFR_IO_ADDR(RAMPZ)) \ 841 : "r0", "r30", "r31" \ 846 #define __ELPM_dword_enhanced__(addr) \ 848 uint32_t __addr32 = (uint32_t)(addr); \ 850 __asm__ __volatile__ \ 852 "out %2, %C1" "\n\t" \ 853 "movw r30, %1" "\n\t" \ 854 "elpm %A0, Z+" "\n\t" \ 855 "elpm %B0, Z+" "\n\t" \ 856 "elpm %C0, Z+" "\n\t" \ 857 "elpm %D0, Z" "\n\t" \ 860 "I" (_SFR_IO_ADDR(RAMPZ)) \ 866 #define __ELPM_dword_xmega__(addr) \ 868 uint32_t __addr32 = (uint32_t)(addr); \ 870 __asm__ __volatile__ \ 872 "in __tmp_reg__, %2" "\n\t" \ 873 "out %2, %C1" "\n\t" \ 874 "movw r30, %1" "\n\t" \ 875 "elpm %A0, Z+" "\n\t" \ 876 "elpm %B0, Z+" "\n\t" \ 877 "elpm %C0, Z+" "\n\t" \ 878 "elpm %D0, Z" "\n\t" \ 879 "out %2, __tmp_reg__" \ 882 "I" (_SFR_IO_ADDR(RAMPZ)) \ 888 #define __ELPM_float_classic__(addr) \ 890 uint32_t __addr32 = (uint32_t)(addr); \ 892 __asm__ __volatile__ \ 894 "out %2, %C1" "\n\t" \ 895 "mov r31, %B1" "\n\t" \ 896 "mov r30, %A1" "\n\t" \ 898 "mov %A0, r0" "\n\t" \ 900 "adiw r30, 1" "\n\t" \ 901 "adc r0, __zero_reg__" "\n\t" \ 902 "out %2, r0" "\n\t" \ 904 "mov %B0, r0" "\n\t" \ 906 "adiw r30, 1" "\n\t" \ 907 "adc r0, __zero_reg__" "\n\t" \ 908 "out %2, r0" "\n\t" \ 910 "mov %C0, r0" "\n\t" \ 912 "adiw r30, 1" "\n\t" \ 913 "adc r0, __zero_reg__" "\n\t" \ 914 "out %2, r0" "\n\t" \ 916 "mov %D0, r0" "\n\t" \ 919 "I" (_SFR_IO_ADDR(RAMPZ)) \ 920 : "r0", "r30", "r31" \ 925 #define __ELPM_float_enhanced__(addr) \ 927 uint32_t __addr32 = (uint32_t)(addr); \ 929 __asm__ __volatile__ \ 931 "out %2, %C1" "\n\t" \ 932 "movw r30, %1" "\n\t" \ 933 "elpm %A0, Z+" "\n\t" \ 934 "elpm %B0, Z+" "\n\t" \ 935 "elpm %C0, Z+" "\n\t" \ 936 "elpm %D0, Z" "\n\t" \ 939 "I" (_SFR_IO_ADDR(RAMPZ)) \ 945 #define __ELPM_float_xmega__(addr) \ 947 uint32_t __addr32 = (uint32_t)(addr); \ 949 __asm__ __volatile__ \ 951 "in __tmp_reg__, %2" "\n\t" \ 952 "out %2, %C1" "\n\t" \ 953 "movw r30, %1" "\n\t" \ 954 "elpm %A0, Z+" "\n\t" \ 955 "elpm %B0, Z+" "\n\t" \ 956 "elpm %C0, Z+" "\n\t" \ 957 "elpm %D0, Z" "\n\t" \ 958 "out %2, __tmp_reg__" \ 961 "I" (_SFR_IO_ADDR(RAMPZ)) \ 972 #if defined (__AVR_HAVE_RAMPD__) 974 #define __ELPM(addr) __ELPM_xmega__(addr) 975 #define __ELPM_word(addr) __ELPM_word_xmega__(addr) 976 #define __ELPM_dword(addr) __ELPM_dword_xmega__(addr) 977 #define __ELPM_float(addr) __ELPM_float_xmega__(addr) 981 #if defined (__AVR_HAVE_LPMX__) 983 #define __ELPM(addr) __ELPM_enhanced__(addr) 984 #define __ELPM_word(addr) __ELPM_word_enhanced__(addr) 985 #define __ELPM_dword(addr) __ELPM_dword_enhanced__(addr) 986 #define __ELPM_float(addr) __ELPM_float_enhanced__(addr) 990 #define __ELPM(addr) __ELPM_classic__(addr) 991 #define __ELPM_word(addr) __ELPM_word_classic__(addr) 992 #define __ELPM_dword(addr) __ELPM_dword_classic__(addr) 993 #define __ELPM_float(addr) __ELPM_float_classic__(addr) 1008 #define pgm_read_byte_far(address_long) __ELPM((uint32_t)(address_long)) 1017 #define pgm_read_word_far(address_long) __ELPM_word((uint32_t)(address_long)) 1026 #define pgm_read_dword_far(address_long) __ELPM_dword((uint32_t)(address_long)) 1035 #define pgm_read_float_far(address_long) __ELPM_float((uint32_t)(address_long)) 1044 #define pgm_read_ptr_far(address_long) (void*)__ELPM_word((uint32_t)(address_long)) 1055 #define pgm_read_byte(address_short) pgm_read_byte_near(address_short) 1064 #define pgm_read_word(address_short) pgm_read_word_near(address_short) 1073 #define pgm_read_dword(address_short) pgm_read_dword_near(address_short) 1082 #define pgm_read_float(address_short) pgm_read_float_near(address_short) 1091 #define pgm_read_ptr(address_short) pgm_read_ptr_near(address_short) 1126 #define pgm_get_far_address(var) \ 1128 uint_farptr_t tmp; \ 1130 __asm__ __volatile__( \ 1132 "ldi %A0, lo8(%1)" "\n\t" \ 1133 "ldi %B0, hi8(%1)" "\n\t" \ 1134 "ldi %C0, hh8(%1)" "\n\t" \ 1158 extern const void *
memchr_P(
const void *,
int __val,
size_t __len) __ATTR_CONST__;
1172 extern int memcmp_P(
const void *,
const void *,
size_t) __ATTR_PURE__;
1179 extern void *
memccpy_P(
void *,
const void *,
int __val,
size_t);
1188 extern void *
memcpy_P(
void *,
const void *,
size_t);
1195 extern void *
memmem_P(
const void *,
size_t,
const void *,
size_t) __ATTR_PURE__;
1207 extern const void *
memrchr_P(
const void *,
int __val,
size_t __len) __ATTR_CONST__;
1217 extern char *
strcat_P(
char *,
const char *);
1233 extern const char *
strchr_P(
const char *,
int __val) __ATTR_CONST__;
1245 extern const char *
strchrnul_P(
const char *,
int __val) __ATTR_CONST__;
1258 extern int strcmp_P(
const char *,
const char *) __ATTR_PURE__;
1268 extern char *
strcpy_P(
char *,
const char *);
1285 extern int strcasecmp_P(
const char *,
const char *) __ATTR_PURE__;
1292 extern char *
strcasestr_P(
const char *,
const char *) __ATTR_PURE__;
1305 extern size_t strcspn_P(
const char *__s,
const char * __reject) __ATTR_PURE__;
1321 extern size_t strlcat_P (
char *,
const char *,
size_t );
1334 extern size_t strlcpy_P (
char *,
const char *,
size_t );
1346 extern size_t strnlen_P(
const char *,
size_t) __ATTR_CONST__;
1357 extern int strncmp_P(
const char *,
const char *,
size_t) __ATTR_PURE__;
1376 extern int strncasecmp_P(
const char *,
const char *,
size_t) __ATTR_PURE__;
1387 extern char *
strncat_P(
char *,
const char *,
size_t);
1401 extern char *
strncpy_P(
char *,
const char *,
size_t);
1416 extern char *
strpbrk_P(
const char *__s,
const char * __accept) __ATTR_PURE__;
1427 extern const char *
strrchr_P(
const char *,
int __val) __ATTR_CONST__;
1447 extern char *
strsep_P(
char **__sp,
const char * __delim);
1460 extern size_t strspn_P(
const char *__s,
const char * __accept) __ATTR_PURE__;
1474 extern char *
strstr_P(
const char *,
const char *) __ATTR_PURE__;
1496 extern char *
strtok_P(
char *__s,
const char * __delim);
1516 extern char *
strtok_rP(
char *__s,
const char * __delim,
char **__last);
1777 static inline size_t strlen_P(
const char * s);
1779 extern size_t __strlen_P(
const char *) __ATTR_CONST__;
1781 static __inline__
size_t strlen_P(
const char *s) {
1782 return __builtin_constant_p(__builtin_strlen(s))
1783 ? __builtin_strlen(s) : __strlen_P(s);
int memcmp_P(const void *, const void *, size_t) __ATTR_PURE__
Compare memory areas.
uint32_t PROGMEM prog_uint32_t
Definition: pgmspace.h:288
char * strtok_P(char *__s, const char *__delim)
Parses the string into tokens.
signed long long int int64_t
Definition: stdint.h:110
void * memmem_P(const void *, size_t, const void *, size_t) __ATTR_PURE__
char * strstr_P(const char *, const char *) __ATTR_PURE__
Locate a substring.
int32_t PROGMEM prog_int32_t
Definition: pgmspace.h:270
uint64_t PROGMEM prog_uint64_t
Definition: pgmspace.h:330
char * strncpy_P(char *, const char *, size_t)
unsigned char PROGMEM prog_uchar
Definition: pgmspace.h:180
void PROGMEM prog_void
Definition: pgmspace.h:144
const char * strchr_P(const char *, int __val)
Locate character in program space string.
size_t strlcpy_P(char *, const char *, size_t)
Copy a string from progmem to RAM.
int64_t PROGMEM prog_int64_t
Definition: pgmspace.h:309
void * memcpy_PF(void *dest, uint_farptr_t src, size_t len)
Copy a memory block from flash to SRAM.
signed int int16_t
Definition: stdint.h:88
signed char int8_t
Definition: stdint.h:78
int strcasecmp_P(const char *, const char *) __ATTR_PURE__
Compare two strings ignoring case.
size_t strcspn_P(const char *__s, const char *__reject) __ATTR_PURE__
char * strcpy_PF(char *dest, uint_farptr_t src)
Duplicate a string.
char * strcat_PF(char *dest, uint_farptr_t src)
Concatenates two strings.
#define PROGMEM
Definition: pgmspace.h:113
size_t strlcat_PF(char *dst, uint_farptr_t src, size_t siz)
Concatenate two strings.
static __inline void __attribute__((__always_inline__)) __power_all_enable()
Definition: power.h:1188
char * strncat_PF(char *dest, uint_farptr_t src, size_t len)
Concatenate two strings.
char * strncat_P(char *, const char *, size_t)
Concatenate two strings.
signed long int int32_t
Definition: stdint.h:98
void * memcpy_P(void *, const void *, size_t)
char * strstr_PF(const char *s1, uint_farptr_t s2)
Locate a substring.
int strcmp_P(const char *, const char *) __ATTR_PURE__
size_t strlcpy_PF(char *dst, uint_farptr_t src, size_t siz)
Copy a string from progmem to RAM.
static size_t strlen_P(const char *s)
char * strtok_rP(char *__s, const char *__delim, char **__last)
Parses string into tokens.
int8_t PROGMEM prog_int8_t
Definition: pgmspace.h:198
int memcmp_PF(const void *, uint_farptr_t, size_t) __ATTR_PURE__
Compare memory areas.
const char * strrchr_P(const char *, int __val)
Locate character in string.
int strcmp_PF(const char *s1, uint_farptr_t s2) __ATTR_PURE__
Compares two strings.
unsigned char uint8_t
Definition: stdint.h:83
const void * memrchr_P(const void *, int __val, size_t __len)
char * strpbrk_P(const char *__s, const char *__accept) __ATTR_PURE__
uint32_t uint_farptr_t
Definition: inttypes.h:81
char * strcpy_P(char *, const char *)
unsigned long int uint32_t
Definition: stdint.h:103
char * strncpy_PF(char *dest, uint_farptr_t src, size_t len)
Duplicate a string until a limited length.
int strncasecmp_P(const char *, const char *, size_t) __ATTR_PURE__
Compare two strings ignoring case.
char PROGMEM prog_char
Definition: pgmspace.h:162
size_t strspn_P(const char *__s, const char *__accept) __ATTR_PURE__
void * memccpy_P(void *, const void *, int __val, size_t)
uint16_t PROGMEM prog_uint16_t
Definition: pgmspace.h:252
const char * strchrnul_P(const char *, int __val)
size_t strnlen_P(const char *, size_t)
Determine the length of a fixed-size string.
int strncmp_P(const char *, const char *, size_t) __ATTR_PURE__
char * strcasestr_P(const char *, const char *) __ATTR_PURE__
char * strcat_P(char *, const char *)
unsigned long long int uint64_t
Definition: stdint.h:117
const void * memchr_P(const void *, int __val, size_t __len)
Scan flash memory for a character.
int strncmp_PF(const char *s1, uint_farptr_t s2, size_t n) __ATTR_PURE__
Compare two strings with limited length.
char * strsep_P(char **__sp, const char *__delim)
Parse a string into tokens.
size_t strlen_PF(uint_farptr_t src)
Obtain the length of a string.
unsigned int uint16_t
Definition: stdint.h:93
uint8_t PROGMEM prog_uint8_t
Definition: pgmspace.h:216
size_t strnlen_PF(uint_farptr_t src, size_t len)
Determine the length of a fixed-size string.
int strcasecmp_PF(const char *s1, uint_farptr_t s2) __ATTR_PURE__
Compare two strings ignoring case.
size_t strlcat_P(char *, const char *, size_t)
Concatenate two strings.
int strncasecmp_PF(const char *s1, uint_farptr_t s2, size_t n) __ATTR_PURE__
Compare two strings ignoring case.
int16_t PROGMEM prog_int16_t
Definition: pgmspace.h:234