From 345e3c637ae60c33d93c9c7c8c08087077a3bd60 Mon Sep 17 00:00:00 2001 From: David McCurley <44048235+mrengineer7777@users.noreply.github.com> Date: Wed, 15 Feb 2023 06:22:30 -0600 Subject: [PATCH] WString Fix int64_t (#7765) WString Fix int64_t Fixed int64_t String support. Resolves issue #7760. Background: sprintf on esp32 doesn't support "%lld" parameter. It's possible to recompile the underlying libraries to add that option, but I have an easier solution. This has already been solved in ESP8266 version of WString by replacing sprintf() with itoa/ltoa/lltoa. This PR does the following: Fixes integer print issues by replacing sprintf() with itoa/ltoa/lltoa Moves concat(long long num), concat(unsigned long long num) location (match ESP8266) Cleans up code formatting (matches ESP8266) Co-authored-by: Me No Dev --- cores/esp32/WString.cpp | 113 ++++++++++++++++++---------------------- cores/esp32/WString.h | 15 +++--- 2 files changed, 58 insertions(+), 70 deletions(-) diff --git a/cores/esp32/WString.cpp b/cores/esp32/WString.cpp index 9b92fb845..302d7ac90 100644 --- a/cores/esp32/WString.cpp +++ b/cores/esp32/WString.cpp @@ -21,7 +21,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include +#include "Arduino.h" #include "WString.h" #include "stdlib_noniso.h" #include "esp32-hal-log.h" @@ -80,11 +80,7 @@ String::String(unsigned char value, unsigned char base) { String::String(int value, unsigned char base) { init(); char buf[2 + 8 * sizeof(int)]; - if (base == 10) { - sprintf(buf, "%d", value); - } else { - itoa(value, buf, base); - } + itoa(value, buf, base); *this = buf; } @@ -98,11 +94,7 @@ String::String(unsigned int value, unsigned char base) { String::String(long value, unsigned char base) { init(); char buf[2 + 8 * sizeof(long)]; - if (base==10) { - sprintf(buf, "%ld", value); - } else { - ltoa(value, buf, base); - } + ltoa(value, buf, base); *this = buf; } @@ -140,11 +132,7 @@ String::String(double value, unsigned int decimalPlaces) { String::String(long long value, unsigned char base) { init(); char buf[2 + 8 * sizeof(long long)]; - if (base==10) { - sprintf(buf, "%lld", value); // NOT SURE - NewLib Nano ... does it support %lld? - } else { - lltoa(value, buf, base); - } + lltoa(value, buf, base); *this = buf; } @@ -159,9 +147,9 @@ String::~String() { invalidate(); } -// /*********************************************/ -// /* Memory Management */ -// /*********************************************/ +/*********************************************/ +/* Memory Management */ +/*********************************************/ inline void String::init(void) { setSSO(false); @@ -221,8 +209,7 @@ bool String::changeBuffer(unsigned int maxStrLen) { // Copy the SSO buffer into allocated space memmove(newbuffer, sso.buff, sizeof(sso.buff)); } - if (newSize > oldSize) - { + if (newSize > oldSize) { memset(newbuffer + oldSize, 0, newSize - oldSize); } setSSO(false); @@ -234,9 +221,9 @@ bool String::changeBuffer(unsigned int maxStrLen) { return false; } -// /*********************************************/ -// /* Copy and Move */ -// /*********************************************/ +/*********************************************/ +/* Copy and Move */ +/*********************************************/ String & String::copy(const char *cstr, unsigned int length) { if(!reserve(length)) { @@ -292,12 +279,10 @@ void String::move(String &rhs) { String & String::operator =(const String &rhs) { if(this == &rhs) return *this; - if(rhs.buffer()) copy(rhs.buffer(), rhs.len()); else invalidate(); - return *this; } @@ -320,7 +305,6 @@ String & String::operator =(const char *cstr) { copy(cstr, strlen(cstr)); else invalidate(); - return *this; } @@ -333,9 +317,9 @@ String & String::operator =(const __FlashStringHelper *pstr) { return *this; } -// /*********************************************/ -// /* concat */ -// /*********************************************/ +/*********************************************/ +/* concat */ +/*********************************************/ bool String::concat(const String &s) { // Special case if we're concatting ourself (s += s;) since we may end up @@ -388,12 +372,14 @@ bool String::concat(char c) { bool String::concat(unsigned char num) { char buf[1 + 3 * sizeof(unsigned char)]; - return concat(buf, sprintf(buf, "%d", num)); + utoa(num, buf, 10); + return concat(buf, strlen(buf)); } bool String::concat(int num) { char buf[2 + 3 * sizeof(int)]; - return concat(buf, sprintf(buf, "%d", num)); + itoa(num, buf, 10); + return concat(buf, strlen(buf)); } bool String::concat(unsigned int num) { @@ -404,7 +390,8 @@ bool String::concat(unsigned int num) { bool String::concat(long num) { char buf[2 + 3 * sizeof(long)]; - return concat(buf, sprintf(buf, "%ld", num)); + ltoa(num, buf, 10); + return concat(buf, strlen(buf)); } bool String::concat(unsigned long num) { @@ -413,6 +400,18 @@ bool String::concat(unsigned long num) { return concat(buf, strlen(buf)); } +bool String::concat(long long num) { + char buf[2 + 3 * sizeof(long long)]; + lltoa(num, buf, 10); + return concat(buf, strlen(buf)); +} + +bool String::concat(unsigned long long num) { + char buf[1 + 3 * sizeof(unsigned long long)]; + ulltoa(num, buf, 10); + return concat(buf, strlen(buf)); +} + bool String::concat(float num) { char buf[20]; char* string = dtostrf(num, 4, 2, buf); @@ -425,17 +424,6 @@ bool String::concat(double num) { return concat(string, strlen(string)); } -bool String::concat(long long num) { - char buf[2 + 3 * sizeof(long long)]; - return concat(buf, sprintf(buf, "%lld", num)); // NOT SURE - NewLib Nano ... does it support %lld? -} - -bool String::concat(unsigned long long num) { - char buf[1 + 3 * sizeof(unsigned long long)]; - ulltoa(num, buf, 10); - return concat(buf, strlen(buf)); -} - bool String::concat(const __FlashStringHelper * str) { if (!str) return false; @@ -546,9 +534,9 @@ StringSumHelper & operator + (const StringSumHelper &lhs, const __FlashStringHel return a; } -// /*********************************************/ -// /* Comparison */ -// /*********************************************/ +/*********************************************/ +/* Comparison */ +/*********************************************/ int String::compareTo(const String &s) const { if(!buffer() || !s.buffer()) { @@ -650,9 +638,9 @@ bool String::endsWith(const String &s2) const { return strcmp(&buffer()[len() - s2.len()], s2.buffer()) == 0; } -// /*********************************************/ -// /* Character Access */ -// /*********************************************/ +/*********************************************/ +/* Character Access */ +/*********************************************/ char String::charAt(unsigned int loc) const { return operator[](loc); @@ -692,9 +680,9 @@ void String::getBytes(unsigned char *buf, unsigned int bufsize, unsigned int ind buf[n] = 0; } -// /*********************************************/ -// /* Search */ -// /*********************************************/ +/*********************************************/ +/* Search */ +/*********************************************/ int String::indexOf(char c) const { return indexOf(c, 0); @@ -703,7 +691,7 @@ int String::indexOf(char c) const { int String::indexOf(char ch, unsigned int fromIndex) const { if(fromIndex >= len()) return -1; - const char* temp = strchr(buffer() + fromIndex, ch); + const char *temp = strchr(buffer() + fromIndex, ch); if(temp == NULL) return -1; return temp - buffer(); @@ -773,9 +761,9 @@ String String::substring(unsigned int left, unsigned int right) const { return out; } -// /*********************************************/ -// /* Modification */ -// /*********************************************/ +/*********************************************/ +/* Modification */ +/*********************************************/ void String::replace(char find, char replace) { if(!buffer()) @@ -786,7 +774,7 @@ void String::replace(char find, char replace) { } } -void String::replace(const String& find, const String& replace) { +void String::replace(const String &find, const String &replace) { if(len() == 0 || find.len() == 0) return; int diff = replace.len() - find.len(); @@ -892,9 +880,9 @@ void String::trim(void) { wbuffer()[newlen] = 0; } -// /*********************************************/ -// /* Parsing / Conversion */ -// /*********************************************/ +/*********************************************/ +/* Parsing / Conversion */ +/*********************************************/ long String::toInt(void) const { if (buffer()) @@ -908,8 +896,7 @@ float String::toFloat(void) const { return 0; } -double String::toDouble(void) const -{ +double String::toDouble(void) const { if (buffer()) return atof(buffer()); return 0.0; diff --git a/cores/esp32/WString.h b/cores/esp32/WString.h index f7f0d814d..c0847a801 100644 --- a/cores/esp32/WString.h +++ b/cores/esp32/WString.h @@ -23,15 +23,13 @@ #define String_class_h #ifdef __cplusplus +#include + #include +#include #include #include -#include -#include -// An inherited class for holding the result of a concatenation. These -// result objects are assumed to be writable by subsequent concatenations. -class StringSumHelper; // an abstract class used as a means to proide a unique pointer type // but really has no body @@ -39,6 +37,10 @@ class __FlashStringHelper; #define FPSTR(pstr_pointer) (reinterpret_cast(pstr_pointer)) #define F(string_literal) (FPSTR(PSTR(string_literal))) +// An inherited class for holding the result of a concatenation. These +// result objects are assumed to be writable by subsequent concatenations. +class StringSumHelper; + // The string class class String { // use a function pointer to allow for "if (s)" without the @@ -107,7 +109,7 @@ class String { String & operator =(StringSumHelper &&rval); #endif - // concatenate (works w/ built-in types) + // concatenate (works w/ built-in types, same as assignment) // returns true on success, false on failure (in which case, the string // is left unchanged). if the argument is null or invalid, the @@ -265,7 +267,6 @@ class String { String substring(unsigned int beginIndex) const { return substring(beginIndex, len()); } - ; String substring(unsigned int beginIndex, unsigned int endIndex) const; // modification -- GitLab