UIPEthernet library for Arduino IDE, Eclipse with arduino plugin and MBED/SMeshStudio (AVR,STM32F,ESP8266,Intel ARC32,Nordic nRF51,Teensy boards,Realtek Ameba(RTL8195A,RTL8710)), ENC28j60 network chip. Compatible with Wiznet W5100 Ethernet library API. Compiled and tested on Nucleo-F302R8. Master repository is: https://github.com/UIPEthernet/UIPEthernet/

Committer:
cassyarduino
Date:
Tue Jan 23 15:08:43 2018 +0100
Revision:
39:deeb00b81cc9
Parent:
35:f9f3a91fe4d4
Release: 2.0.4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cassyarduino 7:ef1f092165eb 1 /*
cassyarduino 7:ef1f092165eb 2 WString.h - String library for Wiring & Arduino
cassyarduino 7:ef1f092165eb 3 ...mostly rewritten by Paul Stoffregen...
cassyarduino 7:ef1f092165eb 4 Copyright (c) 2009-10 Hernando Barragan. All right reserved.
cassyarduino 7:ef1f092165eb 5 Copyright 2011, Paul Stoffregen, paul@pjrc.com
cassyarduino 7:ef1f092165eb 6
cassyarduino 7:ef1f092165eb 7 This library is free software; you can redistribute it and/or
cassyarduino 7:ef1f092165eb 8 modify it under the terms of the GNU Lesser General Public
cassyarduino 7:ef1f092165eb 9 License as published by the Free Software Foundation; either
cassyarduino 7:ef1f092165eb 10 version 2.1 of the License, or (at your option) any later version.
cassyarduino 7:ef1f092165eb 11
cassyarduino 7:ef1f092165eb 12 This library is distributed in the hope that it will be useful,
cassyarduino 7:ef1f092165eb 13 but WITHOUT ANY WARRANTY; without even the implied warranty of
cassyarduino 7:ef1f092165eb 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
cassyarduino 7:ef1f092165eb 15 Lesser General Public License for more details.
cassyarduino 7:ef1f092165eb 16
cassyarduino 7:ef1f092165eb 17 You should have received a copy of the GNU Lesser General Public
cassyarduino 7:ef1f092165eb 18 License along with this library; if not, write to the Free Software
cassyarduino 7:ef1f092165eb 19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
cassyarduino 7:ef1f092165eb 20 */
cassyarduino 35:f9f3a91fe4d4 21 #if !defined(ARDUINO_ARCH_AVR) && !defined(ARDUINO_ARCH_SAM)
cassyarduino 7:ef1f092165eb 22
cassyarduino 7:ef1f092165eb 23 #ifndef String_class_h
cassyarduino 7:ef1f092165eb 24 #define String_class_h
cassyarduino 7:ef1f092165eb 25 #ifdef __cplusplus
cassyarduino 7:ef1f092165eb 26
cassyarduino 7:ef1f092165eb 27 #include <stdlib.h>
cassyarduino 7:ef1f092165eb 28 #include <string.h>
cassyarduino 7:ef1f092165eb 29 #include <ctype.h>
cassyarduino 35:f9f3a91fe4d4 30
cassyarduino 35:f9f3a91fe4d4 31 #if defined(__MBED__)
cassyarduino 35:f9f3a91fe4d4 32 #include <mbed/pgmspace.h>
cassyarduino 35:f9f3a91fe4d4 33 #endif
cassyarduino 35:f9f3a91fe4d4 34
cassyarduino 35:f9f3a91fe4d4 35 #if defined(ARDUINO)
cassyarduino 35:f9f3a91fe4d4 36 #include <avr/pgmspace.h>
cassyarduino 35:f9f3a91fe4d4 37 #endif
cassyarduino 7:ef1f092165eb 38
cassyarduino 7:ef1f092165eb 39 // When compiling programs with this class, the following gcc parameters
cassyarduino 7:ef1f092165eb 40 // dramatically increase performance and memory (RAM) efficiency, typically
cassyarduino 7:ef1f092165eb 41 // with little or no increase in code size.
cassyarduino 7:ef1f092165eb 42 // -felide-constructors
cassyarduino 7:ef1f092165eb 43 // -std=c++0x
cassyarduino 7:ef1f092165eb 44
cassyarduino 7:ef1f092165eb 45 class __FlashStringHelper;
cassyarduino 7:ef1f092165eb 46 //#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
cassyarduino 7:ef1f092165eb 47
cassyarduino 7:ef1f092165eb 48 // An inherited class for holding the result of a concatenation. These
cassyarduino 7:ef1f092165eb 49 // result objects are assumed to be writable by subsequent concatenations.
cassyarduino 7:ef1f092165eb 50 class StringSumHelper;
cassyarduino 7:ef1f092165eb 51
cassyarduino 7:ef1f092165eb 52 // The string class
cassyarduino 7:ef1f092165eb 53 class String
cassyarduino 7:ef1f092165eb 54 {
cassyarduino 7:ef1f092165eb 55 // use a function pointer to allow for "if (s)" without the
cassyarduino 7:ef1f092165eb 56 // complications of an operator bool(). for more information, see:
cassyarduino 7:ef1f092165eb 57 // http://www.artima.com/cppsource/safebool.html
cassyarduino 7:ef1f092165eb 58 typedef void (String::*StringIfHelperType)() const;
cassyarduino 7:ef1f092165eb 59 void StringIfHelper() const {}
cassyarduino 7:ef1f092165eb 60
cassyarduino 7:ef1f092165eb 61 public:
cassyarduino 7:ef1f092165eb 62 // constructors
cassyarduino 7:ef1f092165eb 63 // creates a copy of the initial value.
cassyarduino 7:ef1f092165eb 64 // if the initial value is null or invalid, or if memory allocation
cassyarduino 7:ef1f092165eb 65 // fails, the string will be marked as invalid (i.e. "if (s)" will
cassyarduino 7:ef1f092165eb 66 // be false).
cassyarduino 7:ef1f092165eb 67 String(const char *cstr = "");
cassyarduino 7:ef1f092165eb 68 String(const String &str);
cassyarduino 7:ef1f092165eb 69 String(const __FlashStringHelper *str);
cassyarduino 7:ef1f092165eb 70 #if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
cassyarduino 7:ef1f092165eb 71 String(String &&rval);
cassyarduino 7:ef1f092165eb 72 String(StringSumHelper &&rval);
cassyarduino 7:ef1f092165eb 73 #endif
cassyarduino 7:ef1f092165eb 74 explicit String(char c);
cassyarduino 7:ef1f092165eb 75 explicit String(unsigned char, unsigned char base=10);
cassyarduino 7:ef1f092165eb 76 explicit String(int, unsigned char base=10);
cassyarduino 7:ef1f092165eb 77 explicit String(unsigned int, unsigned char base=10);
cassyarduino 7:ef1f092165eb 78 explicit String(long, unsigned char base=10);
cassyarduino 7:ef1f092165eb 79 explicit String(unsigned long, unsigned char base=10);
cassyarduino 7:ef1f092165eb 80 explicit String(float, unsigned char decimalPlaces=2);
cassyarduino 7:ef1f092165eb 81 explicit String(double, unsigned char decimalPlaces=2);
cassyarduino 7:ef1f092165eb 82 ~String(void);
cassyarduino 7:ef1f092165eb 83
cassyarduino 7:ef1f092165eb 84 // memory management
cassyarduino 7:ef1f092165eb 85 // return true on success, false on failure (in which case, the string
cassyarduino 7:ef1f092165eb 86 // is left unchanged). reserve(0), if successful, will validate an
cassyarduino 7:ef1f092165eb 87 // invalid string (i.e., "if (s)" will be true afterwards)
cassyarduino 7:ef1f092165eb 88 unsigned char reserve(unsigned int size);
cassyarduino 7:ef1f092165eb 89 inline unsigned int length(void) const {return len;}
cassyarduino 7:ef1f092165eb 90
cassyarduino 7:ef1f092165eb 91 // creates a copy of the assigned value. if the value is null or
cassyarduino 7:ef1f092165eb 92 // invalid, or if the memory allocation fails, the string will be
cassyarduino 7:ef1f092165eb 93 // marked as invalid ("if (s)" will be false).
cassyarduino 7:ef1f092165eb 94 String & operator = (const String &rhs);
cassyarduino 7:ef1f092165eb 95 String & operator = (const char *cstr);
cassyarduino 7:ef1f092165eb 96 String & operator = (const __FlashStringHelper *str);
cassyarduino 7:ef1f092165eb 97 #if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
cassyarduino 7:ef1f092165eb 98 String & operator = (String &&rval);
cassyarduino 7:ef1f092165eb 99 String & operator = (StringSumHelper &&rval);
cassyarduino 7:ef1f092165eb 100 #endif
cassyarduino 7:ef1f092165eb 101
cassyarduino 7:ef1f092165eb 102 // concatenate (works w/ built-in types)
cassyarduino 7:ef1f092165eb 103
cassyarduino 7:ef1f092165eb 104 // returns true on success, false on failure (in which case, the string
cassyarduino 7:ef1f092165eb 105 // is left unchanged). if the argument is null or invalid, the
cassyarduino 7:ef1f092165eb 106 // concatenation is considered unsucessful.
cassyarduino 7:ef1f092165eb 107 unsigned char concat(const String &str);
cassyarduino 7:ef1f092165eb 108 unsigned char concat(const char *cstr);
cassyarduino 7:ef1f092165eb 109 unsigned char concat(char c);
cassyarduino 7:ef1f092165eb 110 unsigned char concat(unsigned char c);
cassyarduino 7:ef1f092165eb 111 unsigned char concat(int num);
cassyarduino 7:ef1f092165eb 112 unsigned char concat(unsigned int num);
cassyarduino 7:ef1f092165eb 113 unsigned char concat(long num);
cassyarduino 7:ef1f092165eb 114 unsigned char concat(unsigned long num);
cassyarduino 7:ef1f092165eb 115 unsigned char concat(float num);
cassyarduino 7:ef1f092165eb 116 unsigned char concat(double num);
cassyarduino 7:ef1f092165eb 117 unsigned char concat(const __FlashStringHelper * str);
cassyarduino 7:ef1f092165eb 118
cassyarduino 7:ef1f092165eb 119 // if there's not enough memory for the concatenated value, the string
cassyarduino 7:ef1f092165eb 120 // will be left unchanged (but this isn't signalled in any way)
cassyarduino 7:ef1f092165eb 121 String & operator += (const String &rhs) {concat(rhs); return (*this);}
cassyarduino 7:ef1f092165eb 122 String & operator += (const char *cstr) {concat(cstr); return (*this);}
cassyarduino 7:ef1f092165eb 123 String & operator += (char c) {concat(c); return (*this);}
cassyarduino 7:ef1f092165eb 124 String & operator += (unsigned char num) {concat(num); return (*this);}
cassyarduino 7:ef1f092165eb 125 String & operator += (int num) {concat(num); return (*this);}
cassyarduino 7:ef1f092165eb 126 String & operator += (unsigned int num) {concat(num); return (*this);}
cassyarduino 7:ef1f092165eb 127 String & operator += (long num) {concat(num); return (*this);}
cassyarduino 7:ef1f092165eb 128 String & operator += (unsigned long num) {concat(num); return (*this);}
cassyarduino 7:ef1f092165eb 129 String & operator += (float num) {concat(num); return (*this);}
cassyarduino 7:ef1f092165eb 130 String & operator += (double num) {concat(num); return (*this);}
cassyarduino 7:ef1f092165eb 131 String & operator += (const __FlashStringHelper *str){concat(str); return (*this);}
cassyarduino 7:ef1f092165eb 132
cassyarduino 7:ef1f092165eb 133 friend StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs);
cassyarduino 7:ef1f092165eb 134 friend StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr);
cassyarduino 7:ef1f092165eb 135 friend StringSumHelper & operator + (const StringSumHelper &lhs, char c);
cassyarduino 7:ef1f092165eb 136 friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char num);
cassyarduino 7:ef1f092165eb 137 friend StringSumHelper & operator + (const StringSumHelper &lhs, int num);
cassyarduino 7:ef1f092165eb 138 friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num);
cassyarduino 7:ef1f092165eb 139 friend StringSumHelper & operator + (const StringSumHelper &lhs, long num);
cassyarduino 7:ef1f092165eb 140 friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num);
cassyarduino 7:ef1f092165eb 141 friend StringSumHelper & operator + (const StringSumHelper &lhs, float num);
cassyarduino 7:ef1f092165eb 142 friend StringSumHelper & operator + (const StringSumHelper &lhs, double num);
cassyarduino 7:ef1f092165eb 143 friend StringSumHelper & operator + (const StringSumHelper &lhs, const __FlashStringHelper *rhs);
cassyarduino 7:ef1f092165eb 144
cassyarduino 7:ef1f092165eb 145 // comparison (only works w/ Strings and "strings")
cassyarduino 7:ef1f092165eb 146 operator StringIfHelperType() const { return buffer ? &String::StringIfHelper : 0; }
cassyarduino 7:ef1f092165eb 147 int compareTo(const String &s) const;
cassyarduino 7:ef1f092165eb 148 unsigned char equals(const String &s) const;
cassyarduino 7:ef1f092165eb 149 unsigned char equals(const char *cstr) const;
cassyarduino 7:ef1f092165eb 150 unsigned char operator == (const String &rhs) const {return equals(rhs);}
cassyarduino 7:ef1f092165eb 151 unsigned char operator == (const char *cstr) const {return equals(cstr);}
cassyarduino 7:ef1f092165eb 152 unsigned char operator != (const String &rhs) const {return !equals(rhs);}
cassyarduino 7:ef1f092165eb 153 unsigned char operator != (const char *cstr) const {return !equals(cstr);}
cassyarduino 7:ef1f092165eb 154 unsigned char operator < (const String &rhs) const;
cassyarduino 7:ef1f092165eb 155 unsigned char operator > (const String &rhs) const;
cassyarduino 7:ef1f092165eb 156 unsigned char operator <= (const String &rhs) const;
cassyarduino 7:ef1f092165eb 157 unsigned char operator >= (const String &rhs) const;
cassyarduino 7:ef1f092165eb 158 unsigned char equalsIgnoreCase(const String &s) const;
cassyarduino 7:ef1f092165eb 159 unsigned char startsWith( const String &prefix) const;
cassyarduino 7:ef1f092165eb 160 unsigned char startsWith(const String &prefix, unsigned int offset) const;
cassyarduino 7:ef1f092165eb 161 unsigned char endsWith(const String &suffix) const;
cassyarduino 7:ef1f092165eb 162
cassyarduino 7:ef1f092165eb 163 // character acccess
cassyarduino 7:ef1f092165eb 164 char charAt(unsigned int index) const;
cassyarduino 7:ef1f092165eb 165 void setCharAt(unsigned int index, char c);
cassyarduino 7:ef1f092165eb 166 char operator [] (unsigned int index) const;
cassyarduino 7:ef1f092165eb 167 char& operator [] (unsigned int index);
cassyarduino 7:ef1f092165eb 168 void getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index=0) const;
cassyarduino 7:ef1f092165eb 169 void toCharArray(char *buf, unsigned int bufsize, unsigned int index=0) const
cassyarduino 7:ef1f092165eb 170 {getBytes((unsigned char *)buf, bufsize, index);}
cassyarduino 7:ef1f092165eb 171 const char * c_str() const { return buffer; }
cassyarduino 7:ef1f092165eb 172 const char* begin() { return c_str(); }
cassyarduino 7:ef1f092165eb 173 const char* end() { return c_str() + length(); }
cassyarduino 7:ef1f092165eb 174
cassyarduino 7:ef1f092165eb 175 // search
cassyarduino 7:ef1f092165eb 176 int indexOf( char ch ) const;
cassyarduino 7:ef1f092165eb 177 int indexOf( char ch, unsigned int fromIndex ) const;
cassyarduino 7:ef1f092165eb 178 int indexOf( const String &str ) const;
cassyarduino 7:ef1f092165eb 179 int indexOf( const String &str, unsigned int fromIndex ) const;
cassyarduino 7:ef1f092165eb 180 int lastIndexOf( char ch ) const;
cassyarduino 7:ef1f092165eb 181 int lastIndexOf( char ch, unsigned int fromIndex ) const;
cassyarduino 7:ef1f092165eb 182 int lastIndexOf( const String &str ) const;
cassyarduino 7:ef1f092165eb 183 int lastIndexOf( const String &str, unsigned int fromIndex ) const;
cassyarduino 7:ef1f092165eb 184 String substring( unsigned int beginIndex ) const { return substring(beginIndex, len); };
cassyarduino 7:ef1f092165eb 185 String substring( unsigned int beginIndex, unsigned int endIndex ) const;
cassyarduino 7:ef1f092165eb 186
cassyarduino 7:ef1f092165eb 187 // modification
cassyarduino 7:ef1f092165eb 188 void replace(char find, char replace);
cassyarduino 7:ef1f092165eb 189 void replace(const String& find, const String& replace);
cassyarduino 7:ef1f092165eb 190 void remove(unsigned int index);
cassyarduino 7:ef1f092165eb 191 void remove(unsigned int index, unsigned int count);
cassyarduino 7:ef1f092165eb 192 void toLowerCase(void);
cassyarduino 7:ef1f092165eb 193 void toUpperCase(void);
cassyarduino 7:ef1f092165eb 194 void trim(void);
cassyarduino 7:ef1f092165eb 195
cassyarduino 7:ef1f092165eb 196 // parsing/conversion
cassyarduino 7:ef1f092165eb 197 long toInt(void) const;
cassyarduino 7:ef1f092165eb 198 float toFloat(void) const;
cassyarduino 7:ef1f092165eb 199
cassyarduino 7:ef1f092165eb 200 protected:
cassyarduino 7:ef1f092165eb 201 char *buffer; // the actual char array
cassyarduino 7:ef1f092165eb 202 unsigned int capacity; // the array length minus one (for the '\0')
cassyarduino 7:ef1f092165eb 203 unsigned int len; // the String length (not counting the '\0')
cassyarduino 7:ef1f092165eb 204 protected:
cassyarduino 7:ef1f092165eb 205 void init(void);
cassyarduino 7:ef1f092165eb 206 void invalidate(void);
cassyarduino 7:ef1f092165eb 207 unsigned char changeBuffer(unsigned int maxStrLen);
cassyarduino 7:ef1f092165eb 208 unsigned char concat(const char *cstr, unsigned int length);
cassyarduino 7:ef1f092165eb 209
cassyarduino 7:ef1f092165eb 210 // copy and move
cassyarduino 7:ef1f092165eb 211 String & copy(const char *cstr, unsigned int length);
cassyarduino 7:ef1f092165eb 212 String & copy(const __FlashStringHelper *pstr, unsigned int length);
cassyarduino 7:ef1f092165eb 213 #if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
cassyarduino 7:ef1f092165eb 214 void move(String &rhs);
cassyarduino 7:ef1f092165eb 215 #endif
cassyarduino 7:ef1f092165eb 216 };
cassyarduino 7:ef1f092165eb 217
cassyarduino 7:ef1f092165eb 218 class StringSumHelper : public String
cassyarduino 7:ef1f092165eb 219 {
cassyarduino 7:ef1f092165eb 220 public:
cassyarduino 7:ef1f092165eb 221 StringSumHelper(const String &s) : String(s) {}
cassyarduino 7:ef1f092165eb 222 StringSumHelper(const char *p) : String(p) {}
cassyarduino 7:ef1f092165eb 223 StringSumHelper(char c) : String(c) {}
cassyarduino 7:ef1f092165eb 224 StringSumHelper(unsigned char num) : String(num) {}
cassyarduino 7:ef1f092165eb 225 StringSumHelper(int num) : String(num) {}
cassyarduino 7:ef1f092165eb 226 StringSumHelper(unsigned int num) : String(num) {}
cassyarduino 7:ef1f092165eb 227 StringSumHelper(long num) : String(num) {}
cassyarduino 7:ef1f092165eb 228 StringSumHelper(unsigned long num) : String(num) {}
cassyarduino 7:ef1f092165eb 229 StringSumHelper(float num) : String(num) {}
cassyarduino 7:ef1f092165eb 230 StringSumHelper(double num) : String(num) {}
cassyarduino 7:ef1f092165eb 231 };
cassyarduino 7:ef1f092165eb 232
cassyarduino 7:ef1f092165eb 233 #endif // __cplusplus
cassyarduino 7:ef1f092165eb 234 #endif // String_class_h
cassyarduino 35:f9f3a91fe4d4 235 #endif