1 | /* |
2 | IPAddress.cpp - Base class that provides IPAddress |
3 | Copyright (c) 2011 Adrian McEwen. All right reserved. |
4 | |
5 | This library is free software; you can redistribute it and/or |
6 | modify it under the terms of the GNU Lesser General Public |
7 | License as published by the Free Software Foundation; either |
8 | version 2.1 of the License, or (at your option) any later version. |
9 | |
10 | This library is distributed in the hope that it will be useful, |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | Lesser General Public License for more details. |
14 | |
15 | You should have received a copy of the GNU Lesser General Public |
16 | License along with this library; if not, write to the Free Software |
17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
18 | */ |
19 |
|
20 | #include <Arduino.h> |
21 | #include <IPAddress.h> |
22 |
|
23 | IPAddress::IPAddress() |
24 | { |
25 | _address.dword = 0; |
26 | } |
27 |
|
28 | IPAddress::IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet) |
29 | { |
30 | _address.bytes[0] = first_octet; |
31 | _address.bytes[1] = second_octet; |
32 | _address.bytes[2] = third_octet; |
33 | _address.bytes[3] = fourth_octet; |
34 | } |
35 |
|
36 | IPAddress::IPAddress(uint32_t address) |
37 | { |
38 | _address.dword = address; |
39 | } |
40 |
|
41 | IPAddress::IPAddress(const uint8_t *address) |
42 | { |
43 | memcpy(_address.bytes, address, sizeof(_address.bytes)); |
44 | } |
45 |
|
46 | bool IPAddress::fromString(const char *address) |
47 | { |
48 | uint16_t acc = 0; // Accumulator |
49 | uint8_t dots = 0; |
50 |
|
51 | while (*address) |
52 | { |
53 | char c = *address++; |
54 | if (c >= '0' && c <= '9') |
55 | { |
56 | acc = acc * 10 + (c - '0'); |
57 | if (acc > 255) { |
58 | // Value out of [0..255] range |
59 | return false; |
60 | } |
61 | } |
62 | else if (c == '.') |
63 | { |
64 | if (dots == 3) { |
65 | // Too much dots (there must be 3 dots) |
66 | return false; |
67 | } |
68 | _address.bytes[dots++] = acc; |
69 | acc = 0; |
70 | } |
71 | else |
72 | { |
73 | // Invalid char |
74 | return false; |
75 | } |
76 | } |
77 |
|
78 | if (dots != 3) { |
79 | // Too few dots (there must be 3 dots) |
80 | return false; |
81 | } |
82 | _address.bytes[3] = acc; |
83 | return true; |
84 | } |
85 |
|
86 | IPAddress& IPAddress::operator=(const uint8_t *address) |
87 | { |
88 | memcpy(_address.bytes, address, sizeof(_address.bytes)); |
89 | return *this; |
90 | } |
91 |
|
92 | IPAddress& IPAddress::operator=(uint32_t address) |
93 | { |
94 | _address.dword = address; |
95 | return *this; |
96 | } |
97 |
|
98 | bool IPAddress::operator==(const uint8_t* addr) const |
99 | { |
100 | return memcmp(addr, _address.bytes, sizeof(_address.bytes)) == 0; |
101 | } |
102 |
|
103 | size_t IPAddress::printTo(Print& p) const |
104 | { |
105 | size_t n = 0; |
106 | for (int i =0; i < 3; i++) |
107 | { |
108 | n += p.print(_address.bytes[i], DEC); |
109 | n += p.print('.'); |
110 | } |
111 | n += p.print(_address.bytes[3], DEC); |
112 | return n; |
113 | } |
114 |
|
115 |
|