From 83c437fd1db794dcdcef759c328a06ec816566e4 Mon Sep 17 00:00:00 2001 From: "Jeroen F.J. Laros" Date: Fri, 17 Jun 2022 15:19:18 +0200 Subject: [PATCH 1/2] Added ESP core `printf` implementation. --- cores/arduino/Print.cpp | 30 ++++++++++++++++++++++++++++++ cores/arduino/Print.h | 2 ++ 2 files changed, 32 insertions(+) diff --git a/cores/arduino/Print.cpp b/cores/arduino/Print.cpp index 1e4c99a65..e3e1059c8 100644 --- a/cores/arduino/Print.cpp +++ b/cores/arduino/Print.cpp @@ -264,3 +264,33 @@ size_t Print::printFloat(double number, uint8_t digits) return n; } + +size_t Print::printf(const char *format, ...) +{ + char loc_buf[64]; + char * temp = loc_buf; + va_list arg; + va_list copy; + va_start(arg, format); + va_copy(copy, arg); + int len = vsnprintf(temp, sizeof(loc_buf), format, copy); + va_end(copy); + if(len < 0) { + va_end(arg); + return 0; + }; + if(len >= sizeof(loc_buf)){ + temp = (char*) malloc(len+1); + if(temp == NULL) { + va_end(arg); + return 0; + } + len = vsnprintf(temp, len+1, format, arg); + } + va_end(arg); + len = write((uint8_t*)temp, len); + if(temp != loc_buf){ + free(temp); + } + return len; +} diff --git a/cores/arduino/Print.h b/cores/arduino/Print.h index 0097cc11d..079032762 100644 --- a/cores/arduino/Print.h +++ b/cores/arduino/Print.h @@ -74,6 +74,8 @@ class Print size_t print(double, int = 2); size_t print(const Printable&); + size_t printf(const char * format, ...) __attribute__ ((format (printf, 2, 3))); + size_t println(const __FlashStringHelper *); size_t println(const String &s); size_t println(const char[]); From 5806b17e0b619a3b5751889886eeb992602b6af3 Mon Sep 17 00:00:00 2001 From: "Jeroen F.J. Laros" Date: Fri, 17 Jun 2022 19:24:20 +0200 Subject: [PATCH 2/2] Layout, indents and removed compiler warning. --- cores/arduino/Print.cpp | 48 ++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/cores/arduino/Print.cpp b/cores/arduino/Print.cpp index e3e1059c8..a1b556b49 100644 --- a/cores/arduino/Print.cpp +++ b/cores/arduino/Print.cpp @@ -267,30 +267,30 @@ size_t Print::printFloat(double number, uint8_t digits) size_t Print::printf(const char *format, ...) { - char loc_buf[64]; - char * temp = loc_buf; - va_list arg; - va_list copy; - va_start(arg, format); - va_copy(copy, arg); - int len = vsnprintf(temp, sizeof(loc_buf), format, copy); - va_end(copy); - if(len < 0) { - va_end(arg); - return 0; - }; - if(len >= sizeof(loc_buf)){ - temp = (char*) malloc(len+1); - if(temp == NULL) { - va_end(arg); - return 0; - } - len = vsnprintf(temp, len+1, format, arg); - } + char loc_buf[64]; + char* temp = loc_buf; + va_list arg; + va_list copy; + va_start(arg, format); + va_copy(copy, arg); + int len = vsnprintf(temp, sizeof(loc_buf), format, copy); + va_end(copy); + if (len < 0) { va_end(arg); - len = write((uint8_t*)temp, len); - if(temp != loc_buf){ - free(temp); + return 0; + } + if (len >= (int)sizeof(loc_buf)) { + temp = (char*)malloc(len + 1); + if (temp == NULL) { + va_end(arg); + return 0; } - return len; + len = vsnprintf(temp, len + 1, format, arg); + } + va_end(arg); + len = write((uint8_t*)temp, len); + if (temp != loc_buf) { + free(temp); + } + return len; }