| @@ -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 () { | |||