@@ -52,4 +52,37 @@ size_t IPAddress::printTo(Print& p) const | |||
return 4; | |||
} | |||
bool IPAddress::fromString(const char *address) | |||
{ | |||
uint16_t acc = 0; // Accumulator | |||
uint8_t dots = 0; | |||
while (*address) { | |||
char c = *address++; | |||
if (c >= '0' && c <= '9') { | |||
acc = acc * 10 + (c - '0'); | |||
if (acc > 255) { | |||
// Value out of [0..255] range | |||
return false; | |||
} | |||
} else if (c == '.') { | |||
if (dots == 3) { | |||
// Too much dots (there must be 3 dots) | |||
return false; | |||
} | |||
_address.bytes[dots++] = acc; | |||
acc = 0; | |||
} else { | |||
// Invalid char | |||
return false; | |||
} | |||
} | |||
if (dots != 3) { | |||
// Too few dots (there must be 3 dots) | |||
return false; | |||
} | |||
_address.bytes[3] = acc; | |||
return true; | |||
} | |||
#endif |
@@ -50,6 +50,11 @@ public: | |||
IPAddress(uint32_t address); | |||
IPAddress(const uint8_t *address); | |||
bool fromString(const char *address); | |||
bool fromString(const 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 | |||
operator uint32_t() { return _address.dword; }; |
@@ -11,3 +11,36 @@ size_t IPAddress::printTo(Print& p) const | |||
} | |||
} | |||
bool IPAddress::fromString(const char *address) | |||
{ | |||
unsigned int acc = 0; // Accumulator | |||
unsigned int dots = 0; | |||
while (*address) { | |||
char c = *address++; | |||
if (c >= '0' && c <= '9') { | |||
acc = acc * 10 + (c - '0'); | |||
if (acc > 255) { | |||
// Value out of [0..255] range | |||
return false; | |||
} | |||
} else if (c == '.') { | |||
if (dots == 3) { | |||
// Too much dots (there must be 3 dots) | |||
return false; | |||
} | |||
_address.bytes[dots++] = acc; | |||
acc = 0; | |||
} else { | |||
// Invalid char | |||
return false; | |||
} | |||
} | |||
if (dots != 3) { | |||
// Too few dots (there must be 3 dots) | |||
return false; | |||
} | |||
_address.bytes[3] = acc; | |||
return true; | |||
} | |||
@@ -27,6 +27,7 @@ | |||
#define IPAddress_h | |||
#include <Printable.h> | |||
#include <WString.h> | |||
// A class to make it easier to handle and pass around IP addresses | |||
@@ -65,6 +66,11 @@ public: | |||
_address.bytes[3] = *address++; | |||
} | |||
bool fromString(const char *address); | |||
bool fromString(const 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 | |||
operator uint32_t () { |