Skip to content

Commit add6a30

Browse files
Mock stdio.h progmem functions
1 parent b133520 commit add6a30

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

Diff for: cpp/arduino/avr/pgmspace.h

+20
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ out.each { |l| puts d(l) }
1515
*/
1616

1717
#include <string.h>
18+
#include <stdio.h>
1819
#include <stdint.h>
20+
#include <stdarg.h>
1921

2022
#define PROGMEM
2123

@@ -99,3 +101,21 @@ inline int strncasecmp_PF(const char *s1, uint_farptr_t s2, size_t n) { return s
99101
inline char *strstr_PF(const char *s1, uint_farptr_t s2) { return (char*)strstr(s1, (const char*)s2); }
100102
inline int memcmp_PF(const void *s1, uint_farptr_t s2, size_t len) { return memcmp(s1, (const char*)s2, len); }
101103
inline size_t strlen_P(const char *src) { return strlen(src); }
104+
105+
// These are normally defined by stdio.h on AVR, but we cannot override that
106+
// include file (at least not without no longer being able to include the
107+
// original as well), so just define these here. It seems likely that any
108+
// sketch that uses these progmem-stdio functions will also include pgmspace.h
109+
inline int vfprintf_P(FILE *stream, const char *__fmt, va_list __ap) { return vfprintf(stream, __fmt, __ap); }
110+
inline int printf_P(const char *__fmt, ...) { va_list args; va_start(args, __fmt); return vprintf(__fmt, args); va_end(args); }
111+
inline int sprintf_P(char *s, const char *__fmt, ...) { va_list args; va_start(args, __fmt); return sprintf(s, __fmt, args); va_end(args); }
112+
inline int snprintf_P(char *s, size_t __n, const char *__fmt, ...) { va_list args; va_start(args, __fmt); return vsnprintf(s, __n, __fmt, args); va_end(args); }
113+
inline int vsprintf_P(char *s, const char *__fmt, va_list ap) { return vsprintf(s, __fmt, ap); }
114+
inline int vsnprintf_P(char *s, size_t __n, const char *__fmt, va_list ap) { return vsnprintf(s, __n, __fmt, ap); }
115+
inline int fprintf_P(FILE *stream, const char *__fmt, ...) { va_list args; va_start(args, __fmt); return vfprintf(stream, __fmt, args); va_end(args); }
116+
inline int fputs_P(const char *str, FILE *__stream) { return fputs(str, __stream); }
117+
inline int puts_P(const char *str) { return puts(str); }
118+
inline int vfscanf_P(FILE *stream, const char *__fmt, va_list __ap) { return vfscanf(stream, __fmt, __ap); }
119+
inline int fscanf_P(FILE *stream, const char *__fmt, ...) { va_list args; va_start(args, __fmt); return vfscanf(stream, __fmt, args); va_end(args); }
120+
inline int scanf_P(const char *__fmt, ...) { va_list args; va_start(args, __fmt); return vscanf(__fmt, args); va_end(args); }
121+
inline int sscanf_P(const char *buf, const char *__fmt, ...) { va_list args; va_start(args, __fmt); return vsscanf(buf, __fmt, args); va_end(args); }

0 commit comments

Comments
 (0)