pgmspace.h(3avr)
π 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 justconst char *. a cute lil alias. πPGM_VOID_Pβconst void *. same energy, void edition. π¦PSTR(s)β castssto((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 withvaras 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_ucharprog_int8_t,prog_uint8_tprog_int16_t,prog_uint16_tprog_int32_t,prog_uint32_tprog_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_Pflavour ofmemchr, taking(const void *, int __val, size_t __len).memcmp_Pβmemcmp's_Ptwin, marked__ATTR_PURE__.memccpy_Pβmemccpybut_P, args(void *, const void *, int __val, size_t).memcpy_Pβ yep,memcpywith a_P,(void *, const void *, size_t).memmem_Pβ the_Pmemmem,__ATTR_PURE__and all. π₯memrchr_Pβmemrchr's_Pself.strcat_Pβstrcat,_P-ified.strchr_Pβstrchrbut_P, returnsconst char *.strchrnul_Pβstrchrnul,_Pedition.strcmp_Pβstrcmpwith the_P,__ATTR_PURE__certified.strcpy_Pβstrcpy's_Pcousin.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,_Pstyle.strlcpy_Pβstrlcpy,_Pstyle.strnlen_Pβstrnlenwith 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, returnsconst 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'sstrtok_rP, notstrtok_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 declaredstatic. 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
- ubuntu noble: avr-libc 1:2.0.0+Atmel3.7.0-1 Β· BSD-3-Clause
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms