pgmspace.h(3avr)

πŸ“¦
version 2.0.0+Atmel3.7.0 Β· 2 versions
, in ubuntu noble

πŸ’– NAME πŸ’–

pgmspace.h β€” that's the header, bestie, and this is its manual page (3avr, avr-libc edition). πŸŽ€


✨ SYNOPSIS ✨

okay so this whole header is basically a PROGMEM starter pack. It ships you macros, typedefs, and a whole friend group of functions, and here's every single one, no cap. πŸ’…

πŸŽ€ Macros πŸŽ€

#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)

and here's the gossip on each one πŸ‘‡

  • PROGMEM β€” expands to __ATTR_PROGMEM__. that's the whole macro. iconic, minimal, no notes. ✨
  • PGM_P β€” literally just const char *. a cute lil alias. πŸŽ€
  • PGM_VOID_P β€” const void *. same energy, void edition. πŸ¦‹
  • PSTR(s) β€” casts s to ((const PROGMEM char *)(s)). your string literal's glow-up. πŸ’…

the _near crew β€” all of them take address_short and cast it to uint16_t on the way in:

  • pgm_read_byte_near(address_short) β€” __LPM((uint16_t)(address_short))
  • pgm_read_word_near(address_short) β€” __LPM_word((uint16_t)(address_short))
  • pgm_read_dword_near(address_short) β€” __LPM_dword((uint16_t)(address_short))
  • pgm_read_float_near(address_short) β€” __LPM_float((uint16_t)(address_short))
  • pgm_read_ptr_near(address_short) β€” (void*)__LPM_word((uint16_t)(address_short))

the _far crew β€” these take address_long and cast it to uint32_t:

  • pgm_read_byte_far(address_long) β€” __ELPM((uint32_t)(address_long))
  • pgm_read_word_far(address_long) β€” __ELPM_word((uint32_t)(address_long))
  • pgm_read_dword_far(address_long) β€” __ELPM_dword((uint32_t)(address_long))
  • pgm_read_float_far(address_long) β€” __ELPM_float((uint32_t)(address_long))
  • pgm_read_ptr_far(address_long) β€” (void*)__ELPM_word((uint32_t)(address_long))

and the no-suffix babes, who are literally just forwarding to their _near twins:

  • pgm_read_byte(address_short) β€” pgm_read_byte_near(address_short)
  • pgm_read_word(address_short) β€” pgm_read_word_near(address_short)
  • pgm_read_dword(address_short) β€” pgm_read_dword_near(address_short)
  • pgm_read_float(address_short) β€” pgm_read_float_near(address_short)
  • pgm_read_ptr(address_short) β€” pgm_read_ptr_near(address_short)
  • pgm_get_far_address(var) β€” listed with var as its argument and no expansion shown in the header, so that's all we're telling you. πŸ™ˆ

πŸ¦‹ Typedefs πŸ¦‹

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

eleven of them, every single one PROGMEM-qualified, all the sizes from int8_t up to uint64_t plus the classics:

  • prog_void, prog_char, prog_uchar
  • prog_int8_t, prog_uint8_t
  • prog_int16_t, prog_uint16_t
  • prog_int32_t, prog_uint32_t
  • prog_int64_t, prog_uint64_t

a whole rainbow of them 🌈


πŸ’… Functions πŸ’…

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)

the _P fam 🌸

  • memchr_P β€” the _P flavour of memchr, taking (const void *, int __val, size_t __len).
  • memcmp_P β€” memcmp's _P twin, marked __ATTR_PURE__.
  • memccpy_P β€” memccpy but _P, args (void *, const void *, int __val, size_t).
  • memcpy_P β€” yep, memcpy with a _P, (void *, const void *, size_t).
  • memmem_P β€” the _P memmem, __ATTR_PURE__ and all. πŸ”₯
  • memrchr_P β€” memrchr's _P self.
  • strcat_P β€” strcat, _P-ified.
  • strchr_P β€” strchr but _P, returns const char *.
  • strchrnul_P β€” strchrnul, _P edition.
  • strcmp_P β€” strcmp with the _P, __ATTR_PURE__ certified.
  • strcpy_P β€” strcpy's _P cousin.
  • strcasecmp_P β€” strcasecmp, _P, __ATTR_PURE__.
  • strcasestr_P β€” strcasestr, _P, __ATTR_PURE__.
  • strcspn_P β€” strcspn, _P, __ATTR_PURE__, args (const char *__s, const char *__reject).
  • strlcat_P β€” strlcat, _P style.
  • strlcpy_P β€” strlcpy, _P style.
  • strnlen_P β€” strnlen with a _P.
  • strncmp_P β€” strncmp, _P, __ATTR_PURE__.
  • strncasecmp_P β€” strncasecmp, _P, __ATTR_PURE__.
  • strncat_P β€” strncat, _P.
  • strncpy_P β€” strncpy, _P.
  • strpbrk_P β€” strpbrk, _P, __ATTR_PURE__, args (const char *__s, const char *__accept).
  • strrchr_P β€” strrchr, _P, returns const char *.
  • strsep_P β€” strsep, _P, args (char **__sp, const char *__delim).
  • strspn_P β€” strspn, _P, __ATTR_PURE__, args (const char *__s, const char *__accept).
  • strstr_P β€” strstr, _P, __ATTR_PURE__.
  • strtok_P β€” strtok, _P, args (char *__s, const char *__delim).
  • strtok_rP β€” bestie, look at the spelling: it's strtok_rP, not strtok_r_P. that's literally how it's written, and we respect it. args are (char *__s, const char *__delim, char **__last). πŸ’€

the _PF fam 🧚

these ones take a uint_farptr_t src (or s2) β€” that's the whole vibe:

  • strlen_PF (uint_farptr_t src)
  • strnlen_PF (uint_farptr_t src, size_t len)
  • memcpy_PF (void *dest, uint_farptr_t src, size_t len)
  • strcpy_PF (char *dest, uint_farptr_t src)
  • strncpy_PF (char *dest, uint_farptr_t src, size_t len)
  • strcat_PF (char *dest, uint_farptr_t src)
  • strlcat_PF (char *dst, uint_farptr_t src, size_t siz)
  • strncat_PF (char *dest, uint_farptr_t src, size_t len)
  • strcmp_PF (const char *s1, uint_farptr_t s2) β€” __ATTR_PURE__ 🫢
  • strncmp_PF (const char *s1, uint_farptr_t s2, size_t n) β€” __ATTR_PURE__
  • strcasecmp_PF (const char *s1, uint_farptr_t s2) β€” __ATTR_PURE__
  • strncasecmp_PF (const char *s1, uint_farptr_t s2, size_t n) β€” __ATTR_PURE__
  • strstr_PF (const char *s1, uint_farptr_t s2)
  • strlcpy_PF (char *dst, uint_farptr_t src, size_t siz)
  • memcmp_PF (const void *, uint_farptr_t, size_t) β€” __ATTR_PURE__

the one that's built different πŸ‘‘

  • static size_t strlen_P (const char *s) β€” yes bestie, it's declared static. that's not a typo, that's canon. ⭐

πŸ‘‘ Author πŸ‘‘

Generated automatically by Doxygen for avr-libc from the source code. so it's not a person, it's a whole robot glow-up. πŸ€–βœ¨


okay and finally, the lil sign-off: this page is living its best life at version 2.0.0, dated Fri Nov 24 2023 23:59:10, filed under pgmspace.h(3avr). slay, go read your program memory responsibly πŸ’œπŸŒΈ

πŸ“¦ where this page comes from