pgmspace.h(3)
β¨ pgmspace.h β¨
okay bestie, gather round, because this is the avr-libc manual page for pgmspace.h and it's literally the blueprint for reading stuff out of PROGMEM on AVR, no cap π
πΈ NAME πΈ
pgmspace.h β that's it, that's the name, she's an icon and she doesn't need a subtitle π
π¦ SYNOPSIS π¦
π Macros
the whole macro squad, assembled:
#define PROGMEM __ATTR_PROGMEM__
#define PGM_P const char *
#define PGM_VOID_P const void *
#define PSTR(s) ((const PROGMEM char *)(s))
#define pgm_read_byte_near(address_short)
__LPM((uint16_t)(address_short))
#define pgm_read_word_near(address_short)
__LPM_word((uint16_t)(address_short))
#define pgm_read_dword_near(address_short)
__LPM_dword((uint16_t)(address_short))
#define pgm_read_float_near(address_short)
__LPM_float((uint16_t)(address_short))
#define pgm_read_ptr_near(address_short)
(void*)__LPM_word((uint16_t)(address_short))
#define pgm_read_byte_far(address_long)
__ELPM((uint32_t)(address_long))
#define pgm_read_word_far(address_long)
__ELPM_word((uint32_t)(address_long))
#define pgm_read_dword_far(address_long)
__ELPM_dword((uint32_t)(address_long))
#define pgm_read_float_far(address_long)
__ELPM_float((uint32_t)(address_long))
#define pgm_read_ptr_far(address_long)
(void*)__ELPM_word((uint32_t)(address_long))
#define pgm_read_byte(address_short) pgm_read_byte_near(address_short)
#define pgm_read_word(address_short) pgm_read_word_near(address_short)
#define pgm_read_dword(address_short)
pgm_read_dword_near(address_short)
#define pgm_read_float(address_short)
pgm_read_float_near(address_short)
#define pgm_read_ptr(address_short) pgm_read_ptr_near(address_short)
#define pgm_get_far_address(var)
the _near girlies take a uint16_t, the _far girlies take a uint32_t, and the un-suffixed versions are just the _near ones in a trench coat β they literally forward straight to their _near counterpart, periodt β¨
π§ Typedefs
all of these carry the PROGMEM attribute, so they're built different:
typedef void PROGMEM prog_void
typedef char PROGMEM prog_char
typedef unsigned char PROGMEM prog_uchar
typedef int8_t PROGMEM prog_int8_t
typedef uint8_t PROGMEM prog_uint8_t
typedef int16_t PROGMEM prog_int16_t
typedef uint16_t PROGMEM prog_uint16_t
typedef int32_t PROGMEM prog_int32_t
typedef uint32_t PROGMEM prog_uint32_t
typedef int64_t PROGMEM prog_int64_t
typedef uint64_t PROGMEM prog_uint64_t
π Functions
the full roster, in order, exactly as she serves them π
const void * memchr_P (const void *, int __val, size_t __len)
int memcmp_P (const void *, const void *, size_t) __ATTR_PURE__
void * memccpy_P (void *, const void *, int __val, size_t)
void * memcpy_P (void *, const void *, size_t)
void * memmem_P (const void *, size_t, const void *, size_t)
__ATTR_PURE__
const void * memrchr_P (const void *, int __val, size_t __len)
char * strcat_P (char *, const char *)
const char * strchr_P (const char *, int __val)
const char * strchrnul_P (const char *, int __val)
int strcmp_P (const char *, const char *) __ATTR_PURE__
char * strcpy_P (char *, const char *)
int strcasecmp_P (const char *, const char *) __ATTR_PURE__
char * strcasestr_P (const char *, const char *) __ATTR_PURE__
size_t strcspn_P (const char *__s, const char *__reject) __ATTR_PURE__
size_t strlcat_P (char *, const char *, size_t)
size_t strlcpy_P (char *, const char *, size_t)
size_t strnlen_P (const char *, size_t)
int strncmp_P (const char *, const char *, size_t) __ATTR_PURE__
int strncasecmp_P (const char *, const char *, size_t) __ATTR_PURE__
char * strncat_P (char *, const char *, size_t)
char * strncpy_P (char *, const char *, size_t)
char * strpbrk_P (const char *__s, const char *__accept) __ATTR_PURE__
const char * strrchr_P (const char *, int __val)
char * strsep_P (char **__sp, const char *__delim)
size_t strspn_P (const char *__s, const char *__accept) __ATTR_PURE__
char * strstr_P (const char *, const char *) __ATTR_PURE__
char * strtok_P (char *__s, const char *__delim)
char * strtok_rP (char *__s, const char *__delim, char **__last)
size_t strlen_PF (uint_farptr_t src)
size_t strnlen_PF (uint_farptr_t src, size_t len)
void * memcpy_PF (void *dest, uint_farptr_t src, size_t len)
char * strcpy_PF (char *dest, uint_farptr_t src)
char * strncpy_PF (char *dest, uint_farptr_t src, size_t len)
char * strcat_PF (char *dest, uint_farptr_t src)
size_t strlcat_PF (char *dst, uint_farptr_t src, size_t siz)
char * strncat_PF (char *dest, uint_farptr_t src, size_t len)
int strcmp_PF (const char *s1, uint_farptr_t s2) __ATTR_PURE__
int strncmp_PF (const char *s1, uint_farptr_t s2, size_t n)
__ATTR_PURE__
int strcasecmp_PF (const char *s1, uint_farptr_t s2) __ATTR_PURE__
int strncasecmp_PF (const char *s1, uint_farptr_t s2, size_t n)
__ATTR_PURE__
char * strstr_PF (const char *s1, uint_farptr_t s2)
size_t strlcpy_PF (char *dst, uint_farptr_t src, size_t siz)
int memcmp_PF (const void *, uint_farptr_t, size_t) __ATTR_PURE__
static size_t strlen_P (const char *s)
quick vibe check: the _P crew works on regular const char * pointers into PROGMEM, while the _PF crew takes a uint_farptr_t for far access π«Ά and strlen_P at the bottom is static β she's the special one, iykyk π
π Author
Generated automatically by Doxygen for avr-libc from the source code. (not a human author, just a robot doing her little documentation thing, and honestly? she ate β¨)
and that's the page, bestie π go forth and read your flash memory responsibly, mwah π
this little masterpiece is Version 2.1.0, dated Sat Jan 29 2022 β so when you cite her, you cite her right, fr fr π¦πΈπ
π¦ where this page comes from
- fedora 43: avr-libc 2.2.1-3.fc43 Β· BSD-3-Clause
- fedora 44: avr-libc 2.2.1-5.fc44 Β· BSD-3-Clause
- opensuse-leap 16.0: avr-libc 2.1.0-bp160.1.33 Β· BSD-3-Clause
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms