From 35bea57d103a61db9a985f5de4c4b06f293d85f7 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Sat, 23 Jan 2021 02:06:04 +0100 Subject: [PATCH] Removed more bullshit useless dumb code --- CMakeLists.txt | 4 - cores/esp32/Arduino.h | 1 - cores/esp32/IPAddress.cpp | 4 +- cores/esp32/IPAddress.h | 9 +- cores/esp32/IPv6Address.cpp | 4 +- cores/esp32/IPv6Address.h | 7 +- cores/esp32/MD5Builder.cpp | 117 ----- cores/esp32/MD5Builder.h | 75 --- cores/esp32/Print.cpp | 16 +- cores/esp32/Print.h | 8 +- cores/esp32/Stream.cpp | 8 +- cores/esp32/Stream.h | 4 +- cores/esp32/StreamString.cpp | 67 --- cores/esp32/StreamString.h | 39 -- cores/esp32/WString.cpp | 861 ----------------------------------- cores/esp32/WString.h | 362 --------------- cores/esp32/base64.cpp | 64 --- cores/esp32/base64.h | 13 - libraries/FS/src/FS.cpp | 12 +- libraries/FS/src/FS.h | 12 +- libraries/FS/src/vfs_api.cpp | 19 +- 21 files changed, 52 insertions(+), 1654 deletions(-) delete mode 100644 cores/esp32/MD5Builder.cpp delete mode 100644 cores/esp32/MD5Builder.h delete mode 100644 cores/esp32/StreamString.cpp delete mode 100644 cores/esp32/StreamString.h delete mode 100644 cores/esp32/WString.cpp delete mode 100644 cores/esp32/WString.h delete mode 100644 cores/esp32/base64.cpp delete mode 100644 cores/esp32/base64.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a73f7a55..fc5c1733 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,4 @@ set(CORE_SRCS - cores/esp32/base64.cpp cores/esp32/cbuf.cpp cores/esp32/esp32-hal-adc.c cores/esp32/esp32-hal-bt.c @@ -26,17 +25,14 @@ set(CORE_SRCS cores/esp32/libb64/cdecode.c cores/esp32/libb64/cencode.c cores/esp32/main.cpp - cores/esp32/MD5Builder.cpp cores/esp32/Print.cpp cores/esp32/stdlib_noniso.c cores/esp32/Stream.cpp - cores/esp32/StreamString.cpp cores/esp32/USB.cpp cores/esp32/USBCDC.cpp cores/esp32/wiring_pulse.c cores/esp32/wiring_shift.c cores/esp32/WMath.cpp - cores/esp32/WString.cpp ) set(LIBRARY_SRCS diff --git a/cores/esp32/Arduino.h b/cores/esp32/Arduino.h index cf140343..679e2740 100644 --- a/cores/esp32/Arduino.h +++ b/cores/esp32/Arduino.h @@ -146,7 +146,6 @@ void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val); #include #include "WCharacter.h" -#include "WString.h" #include "Stream.h" #include "Printable.h" #include "Print.h" diff --git a/cores/esp32/IPAddress.cpp b/cores/esp32/IPAddress.cpp index cabfdf32..2e4a91f1 100644 --- a/cores/esp32/IPAddress.cpp +++ b/cores/esp32/IPAddress.cpp @@ -72,11 +72,11 @@ size_t IPAddress::printTo(Print& p) const return n; } -String IPAddress::toString() const +std::string IPAddress::toString() const { char szRet[16]; sprintf(szRet,"%u.%u.%u.%u", _address.bytes[0], _address.bytes[1], _address.bytes[2], _address.bytes[3]); - return String(szRet); + return std::string(szRet); } bool IPAddress::fromString(const char *address) diff --git a/cores/esp32/IPAddress.h b/cores/esp32/IPAddress.h index 1498ad4a..295d911e 100644 --- a/cores/esp32/IPAddress.h +++ b/cores/esp32/IPAddress.h @@ -21,8 +21,9 @@ #define IPAddress_h #include -#include -#include +#include + +#include "Printable.h" // A class to make it easier to handle and pass around IP addresses @@ -52,7 +53,7 @@ public: virtual ~IPAddress() {} bool fromString(const char *address); - bool fromString(const String &address) { return fromString(address.c_str()); } + bool fromString(const std::string &address) { return fromString(address.c_str()); } // Overloaded cast operator to allow IPAddress objects to be used where a pointer // to a four-byte uint8_t array is expected @@ -81,7 +82,7 @@ public: IPAddress& operator=(uint32_t address); virtual size_t printTo(Print& p) const; - String toString() const; + std::string toString() const; friend class EthernetClass; friend class UDP; diff --git a/cores/esp32/IPv6Address.cpp b/cores/esp32/IPv6Address.cpp index 7d3c0de5..25516588 100644 --- a/cores/esp32/IPv6Address.cpp +++ b/cores/esp32/IPv6Address.cpp @@ -61,7 +61,7 @@ size_t IPv6Address::printTo(Print& p) const return n; } -String IPv6Address::toString() const +std::string IPv6Address::toString() const { char szRet[40]; sprintf(szRet,"%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", @@ -69,7 +69,7 @@ String IPv6Address::toString() const _address.bytes[4], _address.bytes[5], _address.bytes[6], _address.bytes[7], _address.bytes[8], _address.bytes[9], _address.bytes[10], _address.bytes[11], _address.bytes[12], _address.bytes[13], _address.bytes[14], _address.bytes[15]); - return String(szRet); + return std::string(szRet); } bool IPv6Address::fromString(const char *address) diff --git a/cores/esp32/IPv6Address.h b/cores/esp32/IPv6Address.h index e61d0e7b..86ee84ac 100644 --- a/cores/esp32/IPv6Address.h +++ b/cores/esp32/IPv6Address.h @@ -21,7 +21,8 @@ #define IPv6Address_h #include -#include +#include + #include // A class to make it easier to handle and pass around IP addresses @@ -51,7 +52,7 @@ public: virtual ~IPv6Address() {} bool fromString(const char *address); - bool fromString(const String &address) { return fromString(address.c_str()); } + bool fromString(const std::string &address) { return fromString(address.c_str()); } operator const uint8_t*() const { @@ -84,7 +85,7 @@ public: IPv6Address& operator=(const uint8_t *address); virtual size_t printTo(Print& p) const; - String toString() const; + std::string toString() const; friend class UDP; friend class Client; diff --git a/cores/esp32/MD5Builder.cpp b/cores/esp32/MD5Builder.cpp deleted file mode 100644 index f2168f4e..00000000 --- a/cores/esp32/MD5Builder.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* - Copyright (c) 2015 Hristo Gochkov. All rights reserved. - This file is part of the esp8266 core for Arduino environment. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ -#include -#include - -uint8_t hex_char_to_byte(uint8_t c) -{ - return (c >= 'a' && c <= 'f') ? (c - ((uint8_t)'a' - 0xa)) : - (c >= 'A' && c <= 'F') ? (c - ((uint8_t)'A' - 0xA)) : - (c >= '0' && c<= '9') ? (c - (uint8_t)'0') : 0; -} - -void MD5Builder::begin(void) -{ - memset(_buf, 0x00, 16); - MD5Init(&_ctx); -} - -void MD5Builder::add(uint8_t * data, uint16_t len) -{ - MD5Update(&_ctx, data, len); -} - -void MD5Builder::addHexString(const char * data) -{ - uint16_t i, len = strlen(data); - uint8_t * tmp = (uint8_t*)malloc(len/2); - if(tmp == NULL) { - return; - } - for(i=0; i 0) && (maxLengthLeft > 0)) { - - // determine number of bytes to read - int readBytes = bytesAvailable; - if(readBytes > maxLengthLeft) { - readBytes = maxLengthLeft ; // read only until max_len - } - if(readBytes > buf_size) { - readBytes = buf_size; // not read more the buffer can handle - } - - // read data and check if we got something - int numBytesRead = stream.readBytes(buf, readBytes); - if(numBytesRead< 1) { - return false; - } - - // Update MD5 with buffer payload - MD5Update(&_ctx, buf, numBytesRead); - - // update available number of bytes - maxLengthLeft -= numBytesRead; - bytesAvailable = stream.available(); - } - free(buf); - return true; -} - -void MD5Builder::calculate(void) -{ - MD5Final(_buf, &_ctx); -} - -void MD5Builder::getBytes(uint8_t * output) -{ - memcpy(output, _buf, 16); -} - -void MD5Builder::getChars(char * output) -{ - for(uint8_t i = 0; i < 16; i++) { - sprintf(output + (i * 2), "%02x", _buf[i]); - } -} - -String MD5Builder::toString(void) -{ - char out[33]; - getChars(out); - return String(out); -} diff --git a/cores/esp32/MD5Builder.h b/cores/esp32/MD5Builder.h deleted file mode 100644 index 0e6daa47..00000000 --- a/cores/esp32/MD5Builder.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - Copyright (c) 2015 Hristo Gochkov. All rights reserved. - This file is part of the esp8266 core for Arduino environment. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ -#ifndef __ESP8266_MD5_BUILDER__ -#define __ESP8266_MD5_BUILDER__ - -#include -#include - -#include "esp_system.h" -#ifdef ESP_IDF_VERSION_MAJOR // IDF 4+ -#if CONFIG_IDF_TARGET_ESP32 // ESP32/PICO-D4 -#include "esp32/rom/md5_hash.h" -#elif CONFIG_IDF_TARGET_ESP32S2 -#include "esp32s2/rom/md5_hash.h" -#else -#error Target CONFIG_IDF_TARGET is not supported -#endif -#else // ESP32 Before IDF 4.0 -#include "rom/md5_hash.h" -#endif - -class MD5Builder -{ -private: - struct MD5Context _ctx; - uint8_t _buf[16]; -public: - void begin(void); - void add(uint8_t * data, uint16_t len); - void add(const char * data) - { - add((uint8_t*)data, strlen(data)); - } - void add(char * data) - { - add((const char*)data); - } - void add(String data) - { - add(data.c_str()); - } - void addHexString(const char * data); - void addHexString(char * data) - { - addHexString((const char*)data); - } - void addHexString(String data) - { - addHexString(data.c_str()); - } - bool addStream(Stream & stream, const size_t maxLen); - void calculate(void); - void getBytes(uint8_t * output); - void getChars(char * output); - String toString(void); -}; - - -#endif diff --git a/cores/esp32/Print.cpp b/cores/esp32/Print.cpp index 3636d99e..3fb9ff00 100644 --- a/cores/esp32/Print.cpp +++ b/cores/esp32/Print.cpp @@ -74,12 +74,7 @@ size_t Print::printf(const char *format, ...) return len; } -size_t Print::print(const __FlashStringHelper *ifsh) -{ - return print(reinterpret_cast(ifsh)); -} - -size_t Print::print(const String &s) +size_t Print::print(const std::string &s) { return write(s.c_str(), s.length()); } @@ -152,13 +147,6 @@ size_t Print::print(double n, int digits) return printFloat(n, digits); } -size_t Print::println(const __FlashStringHelper *ifsh) -{ - size_t n = print(ifsh); - n += println(); - return n; -} - size_t Print::print(const Printable& x) { return x.printTo(*this); @@ -183,7 +171,7 @@ size_t Print::println(void) return print("\r\n"); } -size_t Print::println(const String &s) +size_t Print::println(const std::string &s) { size_t n = print(s); n += println(); diff --git a/cores/esp32/Print.h b/cores/esp32/Print.h index 15d07357..e5e8abf6 100644 --- a/cores/esp32/Print.h +++ b/cores/esp32/Print.h @@ -22,8 +22,8 @@ #include #include +#include -#include "WString.h" #include "Printable.h" #define DEC 10 @@ -73,8 +73,7 @@ public: } size_t printf(const char * format, ...) __attribute__ ((format (printf, 2, 3))); - size_t print(const __FlashStringHelper *); - size_t print(const String &); + size_t print(const std::string &); size_t print(const char[]); size_t print(char); size_t print(unsigned char, int = DEC); @@ -88,8 +87,7 @@ public: size_t print(const Printable&); size_t print(struct tm * timeinfo, const char * format = NULL); - size_t println(const __FlashStringHelper *); - size_t println(const String &s); + size_t println(const std::string &s); size_t println(const char[]); size_t println(char); size_t println(unsigned char, int = DEC); diff --git a/cores/esp32/Stream.cpp b/cores/esp32/Stream.cpp index 7d1649a6..1885a2d8 100644 --- a/cores/esp32/Stream.cpp +++ b/cores/esp32/Stream.cpp @@ -313,9 +313,9 @@ size_t Stream::readBytesUntil(char terminator, char *buffer, size_t length) return index; // return number of characters, not including null terminator } -String Stream::readString() +std::string Stream::readString() { - String ret; + std::string ret; int c = timedRead(); while(c >= 0) { ret += (char) c; @@ -324,9 +324,9 @@ String Stream::readString() return ret; } -String Stream::readStringUntil(char terminator) +std::string Stream::readStringUntil(char terminator) { - String ret; + std::string ret; int c = timedRead(); while(c >= 0 && c != terminator) { ret += (char) c; diff --git a/cores/esp32/Stream.h b/cores/esp32/Stream.h index 2debee7e..5a8cf68b 100644 --- a/cores/esp32/Stream.h +++ b/cores/esp32/Stream.h @@ -115,8 +115,8 @@ public: // returns the number of characters placed in the buffer (0 means no valid data found) // Arduino String functions to be added here - virtual String readString(); - String readStringUntil(char terminator); + virtual std::string readString(); + std::string readStringUntil(char terminator); protected: long parseInt(char skipChar); // as above but the given skipChar is ignored diff --git a/cores/esp32/StreamString.cpp b/cores/esp32/StreamString.cpp deleted file mode 100644 index f50b6825..00000000 --- a/cores/esp32/StreamString.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/** - StreamString.cpp - - Copyright (c) 2015 Markus Sattler. All rights reserved. - This file is part of the esp8266 core for Arduino environment. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - */ - -#include -#include "StreamString.h" - -size_t StreamString::write(const uint8_t *data, size_t size) { - if(size && data) { - const unsigned int newlen = length() + size; - if(reserve(newlen + 1)) { - memcpy((void *) (wbuffer() + len()), (const void *) data, size); - setLen(newlen); - *(wbuffer() + newlen) = 0x00; // add null for string end - return size; - } - } - return 0; -} - -size_t StreamString::write(uint8_t data) { - return concat((char) data); -} - -int StreamString::available() { - return length(); -} - -int StreamString::read() { - if(length()) { - char c = charAt(0); - remove(0, 1); - return c; - - } - return -1; -} - -int StreamString::peek() { - if(length()) { - char c = charAt(0); - return c; - } - return -1; -} - -void StreamString::flush() { -} - diff --git a/cores/esp32/StreamString.h b/cores/esp32/StreamString.h deleted file mode 100644 index dbdf3fb0..00000000 --- a/cores/esp32/StreamString.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - StreamString.h - - Copyright (c) 2015 Markus Sattler. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -*/ - -#ifndef STREAMSTRING_H_ -#define STREAMSTRING_H_ - - -class StreamString: public Stream, public String -{ -public: - size_t write(const uint8_t *buffer, size_t size) override; - size_t write(uint8_t data) override; - - int available() override; - int read() override; - int peek() override; - void flush() override; -}; - - -#endif /* STREAMSTRING_H_ */ diff --git a/cores/esp32/WString.cpp b/cores/esp32/WString.cpp deleted file mode 100644 index aee4b1c9..00000000 --- a/cores/esp32/WString.cpp +++ /dev/null @@ -1,861 +0,0 @@ -/* - WString.cpp - String library for Wiring & Arduino - ...mostly rewritten by Paul Stoffregen... - Copyright (c) 2009-10 Hernando Barragan. All rights reserved. - Copyright 2011, Paul Stoffregen, paul@pjrc.com - Modified by Ivan Grokhotkov, 2014 - esp8266 support - Modified by Michael C. Miller, 2015 - esp8266 progmem support - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include "WString.h" -#include "stdlib_noniso.h" - -/*********************************************/ -/* Constructors */ -/*********************************************/ - -String::String(const char *cstr) { - init(); - if (cstr) - copy(cstr, strlen(cstr)); -} - -String::String(const String &value) { - init(); - *this = value; -} - -String::String(const __FlashStringHelper *pstr) { - init(); - *this = pstr; // see operator = -} - -#ifdef __GXX_EXPERIMENTAL_CXX0X__ -String::String(String &&rval) { - init(); - move(rval); -} - -String::String(StringSumHelper &&rval) { - init(); - move(rval); -} -#endif - -String::String(char c) { - init(); - char buf[2]; - buf[0] = c; - buf[1] = 0; - *this = buf; -} - -String::String(unsigned char value, unsigned char base) { - init(); - char buf[1 + 8 * sizeof(unsigned char)]; - utoa(value, buf, base); - *this = buf; -} - -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); - } - *this = buf; -} - -String::String(unsigned int value, unsigned char base) { - init(); - char buf[1 + 8 * sizeof(unsigned int)]; - utoa(value, buf, base); - *this = buf; -} - -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); - } - *this = buf; -} - -String::String(unsigned long value, unsigned char base) { - init(); - char buf[1 + 8 * sizeof(unsigned long)]; - ultoa(value, buf, base); - *this = buf; -} - -String::String(float value, unsigned char decimalPlaces) { - init(); - char buf[33]; - *this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf); -} - -String::String(double value, unsigned char decimalPlaces) { - init(); - char buf[33]; - *this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf); -} - -String::~String() { - invalidate(); -} - -// /*********************************************/ -// /* Memory Management */ -// /*********************************************/ - -inline void String::init(void) { - setSSO(false); - setCapacity(0); - setLen(0); - setBuffer(nullptr); -} - -void String::invalidate(void) { - if(!isSSO() && wbuffer()) - free(wbuffer()); - init(); -} - -unsigned char String::reserve(unsigned int size) { - if(buffer() && capacity() >= size) - return 1; - if(changeBuffer(size)) { - if(len() == 0) - wbuffer()[0] = 0; - return 1; - } - return 0; -} - -unsigned char String::changeBuffer(unsigned int maxStrLen) { - // Can we use SSO here to avoid allocation? - if (maxStrLen < sizeof(sso.buff) - 1) { - if (isSSO() || !buffer()) { - // Already using SSO, nothing to do - uint16_t oldLen = len(); - setSSO(true); - setLen(oldLen); - return 1; - } else { // if bufptr && !isSSO() - // Using bufptr, need to shrink into sso.buff - char temp[sizeof(sso.buff)]; - memcpy(temp, buffer(), maxStrLen); - free(wbuffer()); - uint16_t oldLen = len(); - setSSO(true); - setLen(oldLen); - memcpy(wbuffer(), temp, maxStrLen); - return 1; - } - } - // Fallthrough to normal allocator - size_t newSize = (maxStrLen + 16) & (~0xf); - // Make sure we can fit newsize in the buffer - if (newSize > CAPACITY_MAX) { - return false; - } - uint16_t oldLen = len(); - char *newbuffer = (char *) realloc(isSSO() ? nullptr : wbuffer(), newSize); - if (newbuffer) { - size_t oldSize = capacity() + 1; // include NULL. - if (isSSO()) { - // Copy the SSO buffer into allocated space - memmove(newbuffer, sso.buff, sizeof(sso.buff)); - } - if (newSize > oldSize) - { - memset(newbuffer + oldSize, 0, newSize - oldSize); - } - setSSO(false); - setCapacity(newSize - 1); - setLen(oldLen); // Needed in case of SSO where len() never existed - setBuffer(newbuffer); - return 1; - } - return 0; -} - -// /*********************************************/ -// /* Copy and Move */ -// /*********************************************/ - -String & String::copy(const char *cstr, unsigned int length) { - if(!reserve(length)) { - invalidate(); - return *this; - } - setLen(length); - memmove(wbuffer(), cstr, length + 1); - return *this; -} - -String & String::copy(const __FlashStringHelper *pstr, unsigned int length) { - if (!reserve(length)) { - invalidate(); - return *this; - } - setLen(length); - memcpy_P(wbuffer(), (PGM_P)pstr, length + 1); // We know wbuffer() cannot ever be in PROGMEM, so memcpy safe here - return *this; -} - -#ifdef __GXX_EXPERIMENTAL_CXX0X__ -void String::move(String &rhs) { - if(buffer()) { - if(capacity() >= rhs.len()) { - memmove(wbuffer(), rhs.buffer(), rhs.length() + 1); - setLen(rhs.len()); - rhs.invalidate(); - return; - } else { - if (!isSSO()) { - free(wbuffer()); - setBuffer(nullptr); - } - } - } - if (rhs.isSSO()) { - setSSO(true); - memmove(sso.buff, rhs.sso.buff, sizeof(sso.buff)); - } else { - setSSO(false); - setBuffer(rhs.wbuffer()); - } - setCapacity(rhs.capacity()); - setLen(rhs.len()); - rhs.setSSO(false); - rhs.setCapacity(0); - rhs.setLen(0); - rhs.setBuffer(nullptr); -} -#endif - -String & String::operator =(const String &rhs) { - if(this == &rhs) - return *this; - - if(rhs.buffer()) - copy(rhs.buffer(), rhs.len()); - else - invalidate(); - - return *this; -} - -#ifdef __GXX_EXPERIMENTAL_CXX0X__ -String & String::operator =(String &&rval) { - if(this != &rval) - move(rval); - return *this; -} - -String & String::operator =(StringSumHelper &&rval) { - if(this != &rval) - move(rval); - return *this; -} -#endif - -String & String::operator =(const char *cstr) { - if(cstr) - copy(cstr, strlen(cstr)); - else - invalidate(); - - return *this; -} - -String & String::operator = (const __FlashStringHelper *pstr) -{ - if (pstr) copy(pstr, strlen_P((PGM_P)pstr)); - else invalidate(); - - return *this; -} - -// /*********************************************/ -// /* concat */ -// /*********************************************/ - -unsigned char String::concat(const String &s) { - // Special case if we're concatting ourself (s += s;) since we may end up - // realloc'ing the buffer and moving s.buffer in the method called - if (&s == this) { - unsigned int newlen = 2 * len(); - if (!s.buffer()) - return 0; - if (s.len() == 0) - return 1; - if (!reserve(newlen)) - return 0; - memmove(wbuffer() + len(), buffer(), len()); - setLen(newlen); - wbuffer()[len()] = 0; - return 1; - } else { - return concat(s.buffer(), s.len()); - } -} - -unsigned char String::concat(const char *cstr, unsigned int length) { - unsigned int newlen = len() + length; - if(!cstr) - return 0; - if(length == 0) - return 1; - if(!reserve(newlen)) - return 0; - if (cstr >= wbuffer() && cstr < wbuffer() + len()) - // compatible with SSO in ram #6155 (case "x += x.c_str()") - memmove(wbuffer() + len(), cstr, length + 1); - else - // compatible with source in flash #6367 - memcpy_P(wbuffer() + len(), cstr, length + 1); - setLen(newlen); - return 1; -} - -unsigned char String::concat(const char *cstr) { - if(!cstr) - return 0; - return concat(cstr, strlen(cstr)); -} - -unsigned char String::concat(char c) { - char buf[2]; - buf[0] = c; - buf[1] = 0; - return concat(buf, 1); -} - -unsigned char String::concat(unsigned char num) { - char buf[1 + 3 * sizeof(unsigned char)]; - sprintf(buf, "%d", num); - return concat(buf, strlen(buf)); -} - -unsigned char String::concat(int num) { - char buf[2 + 3 * sizeof(int)]; - sprintf(buf, "%d", num); - return concat(buf, strlen(buf)); -} - -unsigned char String::concat(unsigned int num) { - char buf[1 + 3 * sizeof(unsigned int)]; - utoa(num, buf, 10); - return concat(buf, strlen(buf)); -} - -unsigned char String::concat(long num) { - char buf[2 + 3 * sizeof(long)]; - sprintf(buf, "%ld", num); - return concat(buf, strlen(buf)); -} - -unsigned char String::concat(unsigned long num) { - char buf[1 + 3 * sizeof(unsigned long)]; - ultoa(num, buf, 10); - return concat(buf, strlen(buf)); -} - -unsigned char String::concat(float num) { - char buf[20]; - char* string = dtostrf(num, 4, 2, buf); - return concat(string, strlen(string)); -} - -unsigned char String::concat(double num) { - char buf[20]; - char* string = dtostrf(num, 4, 2, buf); - return concat(string, strlen(string)); -} - -unsigned char String::concat(const __FlashStringHelper * str) { - if (!str) return 0; - int length = strlen_P((PGM_P)str); - if (length == 0) return 1; - unsigned int newlen = len() + length; - if (!reserve(newlen)) return 0; - memcpy_P(wbuffer() + len(), (PGM_P)str, length + 1); - setLen(newlen); - return 1; -} - -/*********************************************/ -/* Concatenate */ -/*********************************************/ - -StringSumHelper & operator +(const StringSumHelper &lhs, const String &rhs) { - StringSumHelper &a = const_cast(lhs); - if(!a.concat(rhs.buffer(), rhs.len())) - a.invalidate(); - return a; -} - -StringSumHelper & operator +(const StringSumHelper &lhs, const char *cstr) { - StringSumHelper &a = const_cast(lhs); - if(!cstr || !a.concat(cstr, strlen(cstr))) - a.invalidate(); - return a; -} - -StringSumHelper & operator +(const StringSumHelper &lhs, char c) { - StringSumHelper &a = const_cast(lhs); - if(!a.concat(c)) - a.invalidate(); - return a; -} - -StringSumHelper & operator +(const StringSumHelper &lhs, unsigned char num) { - StringSumHelper &a = const_cast(lhs); - if(!a.concat(num)) - a.invalidate(); - return a; -} - -StringSumHelper & operator +(const StringSumHelper &lhs, int num) { - StringSumHelper &a = const_cast(lhs); - if(!a.concat(num)) - a.invalidate(); - return a; -} - -StringSumHelper & operator +(const StringSumHelper &lhs, unsigned int num) { - StringSumHelper &a = const_cast(lhs); - if(!a.concat(num)) - a.invalidate(); - return a; -} - -StringSumHelper & operator +(const StringSumHelper &lhs, long num) { - StringSumHelper &a = const_cast(lhs); - if(!a.concat(num)) - a.invalidate(); - return a; -} - -StringSumHelper & operator +(const StringSumHelper &lhs, unsigned long num) { - StringSumHelper &a = const_cast(lhs); - if(!a.concat(num)) - a.invalidate(); - return a; -} - -StringSumHelper & operator +(const StringSumHelper &lhs, float num) { - StringSumHelper &a = const_cast(lhs); - if(!a.concat(num)) - a.invalidate(); - return a; -} - -StringSumHelper & operator +(const StringSumHelper &lhs, double num) { - StringSumHelper &a = const_cast(lhs); - if(!a.concat(num)) - a.invalidate(); - return a; -} - -StringSumHelper & operator + (const StringSumHelper &lhs, const __FlashStringHelper *rhs) -{ - StringSumHelper &a = const_cast(lhs); - if (!a.concat(rhs)) - a.invalidate(); - return a; -} - -// /*********************************************/ -// /* Comparison */ -// /*********************************************/ - -int String::compareTo(const String &s) const { - if(!buffer() || !s.buffer()) { - if(s.buffer() && s.len() > 0) - return 0 - *(unsigned char *) s.buffer(); - if(buffer() && len() > 0) - return *(unsigned char *) buffer(); - return 0; - } - return strcmp(buffer(), s.buffer()); -} - -unsigned char String::equals(const String &s2) const { - return (len() == s2.len() && compareTo(s2) == 0); -} - -unsigned char String::equals(const char *cstr) const { - if(len() == 0) - return (cstr == NULL || *cstr == 0); - if(cstr == NULL) - return buffer()[0] == 0; - return strcmp(buffer(), cstr) == 0; -} - -unsigned char String::operator<(const String &rhs) const { - return compareTo(rhs) < 0; -} - -unsigned char String::operator>(const String &rhs) const { - return compareTo(rhs) > 0; -} - -unsigned char String::operator<=(const String &rhs) const { - return compareTo(rhs) <= 0; -} - -unsigned char String::operator>=(const String &rhs) const { - return compareTo(rhs) >= 0; -} - -unsigned char String::equalsIgnoreCase(const String &s2) const { - if(this == &s2) - return 1; - if(len() != s2.len()) - return 0; - if(len() == 0) - return 1; - const char *p1 = buffer(); - const char *p2 = s2.buffer(); - while(*p1) { - if(tolower(*p1++) != tolower(*p2++)) - return 0; - } - return 1; -} - -unsigned char String::equalsConstantTime(const String &s2) const { - // To avoid possible time-based attacks present function - // compares given strings in a constant time. - if(len() != s2.len()) - return 0; - //at this point lengths are the same - if(len() == 0) - return 1; - //at this point lenghts are the same and non-zero - const char *p1 = buffer(); - const char *p2 = s2.buffer(); - unsigned int equalchars = 0; - unsigned int diffchars = 0; - while(*p1) { - if(*p1 == *p2) - ++equalchars; - else - ++diffchars; - ++p1; - ++p2; - } - //the following should force a constant time eval of the condition without a compiler "logical shortcut" - unsigned char equalcond = (equalchars == len()); - unsigned char diffcond = (diffchars == 0); - return (equalcond & diffcond); //bitwise AND -} - -unsigned char String::startsWith(const String &s2) const { - if(len() < s2.len()) - return 0; - return startsWith(s2, 0); -} - -unsigned char String::startsWith(const String &s2, unsigned int offset) const { - if(offset > (unsigned)(len() - s2.len()) || !buffer() || !s2.buffer()) - return 0; - return strncmp(&buffer()[offset], s2.buffer(), s2.len()) == 0; -} - -unsigned char String::endsWith(const String &s2) const { - if(len() < s2.len() || !buffer() || !s2.buffer()) - return 0; - return strcmp(&buffer()[len() - s2.len()], s2.buffer()) == 0; -} - -// /*********************************************/ -// /* Character Access */ -// /*********************************************/ - -char String::charAt(unsigned int loc) const { - return operator[](loc); -} - -void String::setCharAt(unsigned int loc, char c) { - if(loc < len()) - wbuffer()[loc] = c; -} - -char & String::operator[](unsigned int index) { - static char dummy_writable_char; - if(index >= len() || !buffer()) { - dummy_writable_char = 0; - return dummy_writable_char; - } - return wbuffer()[index]; -} - -char String::operator[](unsigned int index) const { - if(index >= len() || !buffer()) - return 0; - return buffer()[index]; -} - -void String::getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index) const { - if(!bufsize || !buf) - return; - if(index >= len()) { - buf[0] = 0; - return; - } - unsigned int n = bufsize - 1; - if(n > len() - index) - n = len() - index; - strncpy((char *) buf, buffer() + index, n); - buf[n] = 0; -} - -// /*********************************************/ -// /* Search */ -// /*********************************************/ - -int String::indexOf(char c) const { - return indexOf(c, 0); -} - -int String::indexOf(char ch, unsigned int fromIndex) const { - if(fromIndex >= len()) - return -1; - const char* temp = strchr(buffer() + fromIndex, ch); - if(temp == NULL) - return -1; - return temp - buffer(); -} - -int String::indexOf(const String &s2) const { - return indexOf(s2, 0); -} - -int String::indexOf(const String &s2, unsigned int fromIndex) const { - if(fromIndex >= len()) - return -1; - const char *found = strstr(buffer() + fromIndex, s2.buffer()); - if(found == NULL) - return -1; - return found - buffer(); -} - -int String::lastIndexOf(char theChar) const { - return lastIndexOf(theChar, len() - 1); -} - -int String::lastIndexOf(char ch, unsigned int fromIndex) const { - if(fromIndex >= len()) - return -1; - char tempchar = buffer()[fromIndex + 1]; - wbuffer()[fromIndex + 1] = '\0'; - char* temp = strrchr(wbuffer(), ch); - wbuffer()[fromIndex + 1] = tempchar; - if(temp == NULL) - return -1; - return temp - buffer(); -} - -int String::lastIndexOf(const String &s2) const { - return lastIndexOf(s2, len() - s2.len()); -} - -int String::lastIndexOf(const String &s2, unsigned int fromIndex) const { - if(s2.len() == 0 || len() == 0 || s2.len() > len()) - return -1; - if(fromIndex >= len()) - fromIndex = len() - 1; - int found = -1; - for(char *p = wbuffer(); p <= wbuffer() + fromIndex; p++) { - p = strstr(p, s2.buffer()); - if(!p) - break; - if((unsigned int) (p - wbuffer()) <= fromIndex) - found = p - buffer(); - } - return found; -} - -String String::substring(unsigned int left, unsigned int right) const { - if(left > right) { - unsigned int temp = right; - right = left; - left = temp; - } - String out; - if(left >= len()) - return out; - if(right > len()) - right = len(); - char temp = buffer()[right]; // save the replaced character - wbuffer()[right] = '\0'; - out = wbuffer() + left; // pointer arithmetic - wbuffer()[right] = temp; //restore character - return out; -} - -// /*********************************************/ -// /* Modification */ -// /*********************************************/ - -void String::replace(char find, char replace) { - if(!buffer()) - return; - for(char *p = wbuffer(); *p; p++) { - if(*p == find) - *p = replace; - } -} - -void String::replace(const String& find, const String& replace) { - if(len() == 0 || find.len() == 0) - return; - int diff = replace.len() - find.len(); - char *readFrom = wbuffer(); - char *foundAt; - if(diff == 0) { - while((foundAt = strstr(readFrom, find.buffer())) != NULL) { - memmove(foundAt, replace.buffer(), replace.len()); - readFrom = foundAt + replace.len(); - } - } else if(diff < 0) { - char *writeTo = wbuffer(); - while((foundAt = strstr(readFrom, find.buffer())) != NULL) { - unsigned int n = foundAt - readFrom; - memmove(writeTo, readFrom, n); - writeTo += n; - memmove(writeTo, replace.buffer(), replace.len()); - writeTo += replace.len(); - readFrom = foundAt + find.len(); - setLen(len() + diff); - } - memmove(writeTo, readFrom, strlen(readFrom)+1); - } else { - unsigned int size = len(); // compute size needed for result - while((foundAt = strstr(readFrom, find.buffer())) != NULL) { - readFrom = foundAt + find.len(); - size += diff; - } - if(size == len()) - return; - if(size > capacity() && !changeBuffer(size)) - return; // XXX: tell user! - int index = len() - 1; - while(index >= 0 && (index = lastIndexOf(find, index)) >= 0) { - readFrom = wbuffer() + index + find.len(); - memmove(readFrom + diff, readFrom, len() - (readFrom - buffer())); - int newLen = len() + diff; - memmove(wbuffer() + index, replace.buffer(), replace.len()); - setLen(newLen); - wbuffer()[newLen] = 0; - index--; - } - } -} - -void String::remove(unsigned int index) { - // Pass the biggest integer as the count. The remove method - // below will take care of truncating it at the end of the - // string. - remove(index, (unsigned int) -1); -} - -void String::remove(unsigned int index, unsigned int count) { - if(index >= len()) { - return; - } - if(count <= 0) { - return; - } - if(count > len() - index) { - count = len() - index; - } - char *writeTo = wbuffer() + index; - unsigned int newlen = len() - count; - setLen(newlen); - memmove(writeTo, wbuffer() + index + count, newlen - index); - wbuffer()[newlen] = 0; -} - -void String::toLowerCase(void) { - if(!buffer()) - return; - for(char *p = wbuffer(); *p; p++) { - *p = tolower(*p); - } -} - -void String::toUpperCase(void) { - if(!buffer()) - return; - for(char *p = wbuffer(); *p; p++) { - *p = toupper(*p); - } -} - -void String::trim(void) { - if(!buffer() || len() == 0) - return; - char *begin = wbuffer(); - while(isspace(*begin)) - begin++; - char *end = wbuffer() + len() - 1; - while(isspace(*end) && end >= begin) - end--; - unsigned int newlen = end + 1 - begin; - setLen(newlen); - if(begin > buffer()) - memmove(wbuffer(), begin, newlen); - wbuffer()[newlen] = 0; -} - -// /*********************************************/ -// /* Parsing / Conversion */ -// /*********************************************/ - -long String::toInt(void) const { - if (buffer()) - return atol(buffer()); - return 0; -} - -float String::toFloat(void) const { - if (buffer()) - return atof(buffer()); - return 0; -} - -double String::toDouble(void) const -{ - if (buffer()) - return atof(buffer()); - return 0.0; -} - -// global empty string to allow returning const String& with nothing - -const String emptyString; diff --git a/cores/esp32/WString.h b/cores/esp32/WString.h deleted file mode 100644 index 9111d9aa..00000000 --- a/cores/esp32/WString.h +++ /dev/null @@ -1,362 +0,0 @@ -/* - WString.h - String library for Wiring & Arduino - ...mostly rewritten by Paul Stoffregen... - Copyright (c) 2009-10 Hernando Barragan. All right reserved. - Copyright 2011, Paul Stoffregen, paul@pjrc.com - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef String_class_h -#define String_class_h -#ifdef __cplusplus - -#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 -class __FlashStringHelper; -#define FPSTR(pstr_pointer) (reinterpret_cast(pstr_pointer)) -#define F(string_literal) (FPSTR(PSTR(string_literal))) - -// The string class -class String { - // use a function pointer to allow for "if (s)" without the - // complications of an operator bool(). for more information, see: - // http://www.artima.com/cppsource/safebool.html - typedef void (String::*StringIfHelperType)() const; - void StringIfHelper() const { - } - - public: - // constructors - // creates a copy of the initial value. - // if the initial value is null or invalid, or if memory allocation - // fails, the string will be marked as invalid (i.e. "if (s)" will - // be false). - String(const char *cstr = ""); - String(const String &str); - String(const __FlashStringHelper *str); -#ifdef __GXX_EXPERIMENTAL_CXX0X__ - String(String &&rval); - String(StringSumHelper &&rval); -#endif - explicit String(char c); - explicit String(unsigned char, unsigned char base = 10); - explicit String(int, unsigned char base = 10); - explicit String(unsigned int, unsigned char base = 10); - explicit String(long, unsigned char base = 10); - explicit String(unsigned long, unsigned char base = 10); - explicit String(float, unsigned char decimalPlaces = 2); - explicit String(double, unsigned char decimalPlaces = 2); - ~String(void); - - // memory management - // return true on success, false on failure (in which case, the string - // is left unchanged). reserve(0), if successful, will validate an - // invalid string (i.e., "if (s)" will be true afterwards) - unsigned char reserve(unsigned int size); - inline unsigned int length(void) const { - if(buffer()) { - return len(); - } else { - return 0; - } - } - inline void clear(void) { - setLen(0); - } - inline bool isEmpty(void) const { - return length() == 0; - } - - // creates a copy of the assigned value. if the value is null or - // invalid, or if the memory allocation fails, the string will be - // marked as invalid ("if (s)" will be false). - String & operator =(const String &rhs); - String & operator =(const char *cstr); - String & operator = (const __FlashStringHelper *str); -#ifdef __GXX_EXPERIMENTAL_CXX0X__ - String & operator =(String &&rval); - String & operator =(StringSumHelper &&rval); -#endif - - // concatenate (works w/ built-in types) - - // returns true on success, false on failure (in which case, the string - // is left unchanged). if the argument is null or invalid, the - // concatenation is considered unsuccessful. - unsigned char concat(const String &str); - unsigned char concat(const char *cstr); - unsigned char concat(char c); - unsigned char concat(unsigned char c); - unsigned char concat(int num); - unsigned char concat(unsigned int num); - unsigned char concat(long num); - unsigned char concat(unsigned long num); - unsigned char concat(float num); - unsigned char concat(double num); - unsigned char concat(const __FlashStringHelper * str); - - // if there's not enough memory for the concatenated value, the string - // will be left unchanged (but this isn't signalled in any way) - String & operator +=(const String &rhs) { - concat(rhs); - return (*this); - } - String & operator +=(const char *cstr) { - concat(cstr); - return (*this); - } - String & operator +=(char c) { - concat(c); - return (*this); - } - String & operator +=(unsigned char num) { - concat(num); - return (*this); - } - String & operator +=(int num) { - concat(num); - return (*this); - } - String & operator +=(unsigned int num) { - concat(num); - return (*this); - } - String & operator +=(long num) { - concat(num); - return (*this); - } - String & operator +=(unsigned long num) { - concat(num); - return (*this); - } - String & operator +=(float num) { - concat(num); - return (*this); - } - String & operator +=(double num) { - concat(num); - return (*this); - } - String & operator += (const __FlashStringHelper *str){ - concat(str); - return (*this); - } - - friend StringSumHelper & operator +(const StringSumHelper &lhs, const String &rhs); - friend StringSumHelper & operator +(const StringSumHelper &lhs, const char *cstr); - friend StringSumHelper & operator +(const StringSumHelper &lhs, char c); - friend StringSumHelper & operator +(const StringSumHelper &lhs, unsigned char num); - friend StringSumHelper & operator +(const StringSumHelper &lhs, int num); - friend StringSumHelper & operator +(const StringSumHelper &lhs, unsigned int num); - friend StringSumHelper & operator +(const StringSumHelper &lhs, long num); - friend StringSumHelper & operator +(const StringSumHelper &lhs, unsigned long num); - friend StringSumHelper & operator +(const StringSumHelper &lhs, float num); - friend StringSumHelper & operator +(const StringSumHelper &lhs, double num); - friend StringSumHelper & operator +(const StringSumHelper &lhs, const __FlashStringHelper *rhs); - - // comparison (only works w/ Strings and "strings") - operator StringIfHelperType() const { - return buffer() ? &String::StringIfHelper : 0; - } - int compareTo(const String &s) const; - unsigned char equals(const String &s) const; - unsigned char equals(const char *cstr) const; - unsigned char operator ==(const String &rhs) const { - return equals(rhs); - } - unsigned char operator ==(const char *cstr) const { - return equals(cstr); - } - unsigned char operator !=(const String &rhs) const { - return !equals(rhs); - } - unsigned char operator !=(const char *cstr) const { - return !equals(cstr); - } - unsigned char operator <(const String &rhs) const; - unsigned char operator >(const String &rhs) const; - unsigned char operator <=(const String &rhs) const; - unsigned char operator >=(const String &rhs) const; - unsigned char equalsIgnoreCase(const String &s) const; - unsigned char equalsConstantTime(const String &s) const; - unsigned char startsWith(const String &prefix) const; - unsigned char startsWith(const char *prefix) const { - return this->startsWith(String(prefix)); - } - unsigned char startsWith(const __FlashStringHelper *prefix) const { - return this->startsWith(String(prefix)); - } - unsigned char startsWith(const String &prefix, unsigned int offset) const; - unsigned char endsWith(const String &suffix) const; - unsigned char endsWith(const char *suffix) const { - return this->endsWith(String(suffix)); - } - unsigned char endsWith(const __FlashStringHelper * suffix) const { - return this->endsWith(String(suffix)); - } - - // character access - char charAt(unsigned int index) const; - void setCharAt(unsigned int index, char c); - char operator [](unsigned int index) const; - char& operator [](unsigned int index); - void getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index = 0) const; - void toCharArray(char *buf, unsigned int bufsize, unsigned int index = 0) const { - getBytes((unsigned char *) buf, bufsize, index); - } - const char* c_str() const { return buffer(); } - char* begin() { return wbuffer(); } - char* end() { return wbuffer() + length(); } - const char* begin() const { return c_str(); } - const char* end() const { return c_str() + length(); } - - // search - int indexOf(char ch) const; - int indexOf(char ch, unsigned int fromIndex) const; - int indexOf(const String &str) const; - int indexOf(const String &str, unsigned int fromIndex) const; - int lastIndexOf(char ch) const; - int lastIndexOf(char ch, unsigned int fromIndex) const; - int lastIndexOf(const String &str) const; - int lastIndexOf(const String &str, unsigned int fromIndex) const; - String substring(unsigned int beginIndex) const { - return substring(beginIndex, len()); - } - ; - String substring(unsigned int beginIndex, unsigned int endIndex) const; - - // modification - void replace(char find, char replace); - void replace(const String &find, const String &replace); - void replace(const char *find, const String &replace) { - this->replace(String(find), replace); - } - void replace(const __FlashStringHelper *find, const String &replace) { - this->replace(String(find), replace); - } - void replace(const char *find, const char *replace) { - this->replace(String(find), String(replace)); - } - void replace(const __FlashStringHelper *find, const char *replace) { - this->replace(String(find), String(replace)); - } - void replace(const __FlashStringHelper *find, const __FlashStringHelper *replace) { - this->replace(String(find), String(replace)); - } - void remove(unsigned int index); - void remove(unsigned int index, unsigned int count); - void toLowerCase(void); - void toUpperCase(void); - void trim(void); - - // parsing/conversion - long toInt(void) const; - float toFloat(void) const; - double toDouble(void) const; - - protected: - // Contains the string info when we're not in SSO mode - struct _ptr { - char * buff; - uint16_t cap; - uint16_t len; - }; - // This allows strings up up to 11 (10 + \0 termination) without any extra space. - enum { SSOSIZE = sizeof(struct _ptr) + 4 - 1 }; // Characters to allocate space for SSO, must be 12 or more - struct _sso { - char buff[SSOSIZE]; - unsigned char len : 7; // Ensure only one byte is allocated by GCC for the bitfields - unsigned char isSSO : 1; - } __attribute__((packed)); // Ensure that GCC doesn't expand the flag byte to a 32-bit word for alignment issues - enum { CAPACITY_MAX = 65535 }; // If typeof(cap) changed from uint16_t, be sure to update this enum to the max value storable in the type - union { - struct _ptr ptr; - struct _sso sso; - }; - // Accessor functions - inline bool isSSO() const { return sso.isSSO; } - inline unsigned int len() const { return isSSO() ? sso.len : ptr.len; } - inline unsigned int capacity() const { return isSSO() ? (unsigned int)SSOSIZE - 1 : ptr.cap; } // Size of max string not including terminal NUL - inline void setSSO(bool set) { sso.isSSO = set; } - inline void setLen(int len) { if (isSSO()) sso.len = len; else ptr.len = len; } - inline void setCapacity(int cap) { if (!isSSO()) ptr.cap = cap; } - inline void setBuffer(char *buff) { if (!isSSO()) ptr.buff = buff; } - // Buffer accessor functions - inline const char *buffer() const { return (const char *)(isSSO() ? sso.buff : ptr.buff); } - inline char *wbuffer() const { return isSSO() ? const_cast(sso.buff) : ptr.buff; } // Writable version of buffer - - protected: - void init(void); - void invalidate(void); - unsigned char changeBuffer(unsigned int maxStrLen); - unsigned char concat(const char *cstr, unsigned int length); - - // copy and move - String & copy(const char *cstr, unsigned int length); - String & copy(const __FlashStringHelper *pstr, unsigned int length); -#ifdef __GXX_EXPERIMENTAL_CXX0X__ - void move(String &rhs); -#endif -}; - -class StringSumHelper: public String { - public: - StringSumHelper(const String &s) : - String(s) { - } - StringSumHelper(const char *p) : - String(p) { - } - StringSumHelper(char c) : - String(c) { - } - StringSumHelper(unsigned char num) : - String(num) { - } - StringSumHelper(int num) : - String(num) { - } - StringSumHelper(unsigned int num) : - String(num) { - } - StringSumHelper(long num) : - String(num) { - } - StringSumHelper(unsigned long num) : - String(num) { - } - StringSumHelper(float num) : - String(num) { - } - StringSumHelper(double num) : - String(num) { - } -}; - -extern const String emptyString; - -#endif // __cplusplus -#endif // String_class_h diff --git a/cores/esp32/base64.cpp b/cores/esp32/base64.cpp deleted file mode 100644 index 1fc144e2..00000000 --- a/cores/esp32/base64.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/** - * base64.cpp - * - * Created on: 09.12.2015 - * - * Copyright (c) 2015 Markus Sattler. All rights reserved. - * This file is part of the ESP31B core for Arduino. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include "Arduino.h" -extern "C" { -#include "libb64/cdecode.h" -#include "libb64/cencode.h" -} -#include "base64.h" - -/** - * convert input data to base64 - * @param data const uint8_t * - * @param length size_t - * @return String - */ -String base64::encode(const uint8_t * data, size_t length) -{ - size_t size = base64_encode_expected_len(length) + 1; - char * buffer = (char *) malloc(size); - if(buffer) { - base64_encodestate _state; - base64_init_encodestate(&_state); - int len = base64_encode_block((const char *) &data[0], length, &buffer[0], &_state); - len = base64_encode_blockend((buffer + len), &_state); - - String base64 = String(buffer); - free(buffer); - return base64; - } - return String("-FAIL-"); -} - -/** - * convert input data to base64 - * @param text const String& - * @return String - */ -String base64::encode(const String& text) -{ - return base64::encode((uint8_t *) text.c_str(), text.length()); -} - diff --git a/cores/esp32/base64.h b/cores/esp32/base64.h deleted file mode 100644 index 97095817..00000000 --- a/cores/esp32/base64.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef CORE_BASE64_H_ -#define CORE_BASE64_H_ - -class base64 -{ -public: - static String encode(const uint8_t * data, size_t length); - static String encode(const String& text); -private: -}; - - -#endif /* CORE_BASE64_H_ */ diff --git a/libraries/FS/src/FS.cpp b/libraries/FS/src/FS.cpp index ab4f5d52..0dda18b1 100644 --- a/libraries/FS/src/FS.cpp +++ b/libraries/FS/src/FS.cpp @@ -177,7 +177,7 @@ void File::rewindDirectory(void) _p->rewindDirectory(); } -File FS::open(const String& path, const char* mode) +File FS::open(const std::string& path, const char* mode) { return open(path.c_str(), mode); } @@ -199,7 +199,7 @@ bool FS::exists(const char* path) return _impl->exists(path); } -bool FS::exists(const String& path) +bool FS::exists(const std::string& path) { return exists(path.c_str()); } @@ -212,7 +212,7 @@ bool FS::remove(const char* path) return _impl->remove(path); } -bool FS::remove(const String& path) +bool FS::remove(const std::string& path) { return remove(path.c_str()); } @@ -225,7 +225,7 @@ bool FS::rename(const char* pathFrom, const char* pathTo) return _impl->rename(pathFrom, pathTo); } -bool FS::rename(const String& pathFrom, const String& pathTo) +bool FS::rename(const std::string& pathFrom, const std::string& pathTo) { return rename(pathFrom.c_str(), pathTo.c_str()); } @@ -239,7 +239,7 @@ bool FS::mkdir(const char *path) return _impl->mkdir(path); } -bool FS::mkdir(const String &path) +bool FS::mkdir(const std::string &path) { return mkdir(path.c_str()); } @@ -252,7 +252,7 @@ bool FS::rmdir(const char *path) return _impl->rmdir(path); } -bool FS::rmdir(const String &path) +bool FS::rmdir(const std::string &path) { return rmdir(path.c_str()); } diff --git a/libraries/FS/src/FS.h b/libraries/FS/src/FS.h index d63fc5da..4926f8ed 100644 --- a/libraries/FS/src/FS.h +++ b/libraries/FS/src/FS.h @@ -89,22 +89,22 @@ public: FS(FSImplPtr impl) : _impl(impl) { } File open(const char* path, const char* mode = FILE_READ); - File open(const String& path, const char* mode = FILE_READ); + File open(const std::string& path, const char* mode = FILE_READ); bool exists(const char* path); - bool exists(const String& path); + bool exists(const std::string& path); bool remove(const char* path); - bool remove(const String& path); + bool remove(const std::string& path); bool rename(const char* pathFrom, const char* pathTo); - bool rename(const String& pathFrom, const String& pathTo); + bool rename(const std::string& pathFrom, const std::string& pathTo); bool mkdir(const char *path); - bool mkdir(const String &path); + bool mkdir(const std::string &path); bool rmdir(const char *path); - bool rmdir(const String &path); + bool rmdir(const std::string &path); protected: diff --git a/libraries/FS/src/vfs_api.cpp b/libraries/FS/src/vfs_api.cpp index 346b7a93..6ee24bee 100644 --- a/libraries/FS/src/vfs_api.cpp +++ b/libraries/FS/src/vfs_api.cpp @@ -388,6 +388,19 @@ boolean VFSFileImpl::isDirectory(void) return _isDirectory; } +namespace { +bool string_starts_with(std::string const &fullString, std::string const &begin) { + return fullString.rfind(begin, 0) == 0; +} +bool string_ends_with(std::string const &fullString, std::string const &ending) { + if (fullString.length() >= ending.length()) { + return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending)); + } else { + return false; + } +} +} + FileImplPtr VFSFileImpl::openNextFile(const char* mode) { if(!_isDirectory || !_d) { @@ -400,9 +413,9 @@ FileImplPtr VFSFileImpl::openNextFile(const char* mode) if(file->d_type != DT_REG && file->d_type != DT_DIR) { return openNextFile(mode); } - String fname = String(file->d_name); - String name = String(_path); - if(!fname.startsWith("/") && !name.endsWith("/")) { + std::string fname = std::string(file->d_name); + std::string name = std::string(_path); + if(!string_starts_with(fname, "/") && !string_ends_with(name, "/")) { name += "/"; } name += fname;