21 uint8_t address[4] = {};
23 bool parse(
const char *value) {
25 if (value ==
nullptr) {
28 const size_t length = strnlen(value, 262);
29 if (length == 0 || length >= 262) {
32 const char *begin = value;
33 const char *end =
nullptr;
34 const char *portText =
nullptr;
35 if (value[0] ==
'[') {
38 end = strchr(begin,
']');
39 if (end ==
nullptr || end == begin) {
49 end = strchr(value,
':');
56 size_t size = end - begin;
57 if (size == 0 || size >=
sizeof(name)) {
60 if (portText !=
nullptr) {
62 if (*portText ==
'\0') {
66 for (
const char *p = portText; *p; p++) {
67 if (*p <
'0' || *p >
'9') {
70 number = number * 10 + (*p -
'0');
80 memcpy(name, begin, size);
83 for (
size_t i = 0; i < size; i++) {
84 const char c = name[i];
85 if (!((c >=
'0' && c <=
'9') || (c >=
'a' && c <=
'f') ||
86 (c >=
'A' && c <=
'F') || c ==
':' || c ==
'.')) {
93 const bool rootDot = name[size - 1] ==
'.';
101 for (
size_t i = 0; i < size; i++) {
102 const char c = name[i];
103 if (!((c >=
'0' && c <=
'9') || (c >=
'a' && c <=
'z') ||
104 (c >=
'A' && c <=
'Z') || c ==
'-' || c ==
'_' || c ==
'.')) {
107 if (c ==
'.' && (i == 0 || name[i - 1] ==
'.')) {
110 if (c !=
'.' && (c <
'0' || c >
'9')) {
115 return name[size - 1] !=
'.';
122 const char *p = name;
123 for (
int i = 0; i < 4; i++) {
124 const char *start = p;
125 unsigned int number = 0;
126 while (*p >=
'0' && *p <=
'9') {
127 number = number * 10 + (*p++ -
'0');
128 if (number > 255 || p - start > 3) {
132 if (p == start || (p - start > 1 && *start ==
'0')) {
140 }
else if (*p !=
'\0') {
147 bool matchesName(
const char *hostname)
const {
148 if (ipv4 || ipv6 || hostname ==
nullptr || hostname[0] ==
'\0') {
152 while (name[i] && hostname[i]) {
153 if (lower(name[i]) != lower(hostname[i])) {
158 if (hostname[i] !=
'\0') {
161 const char *suffix = name + i;
162 if (*suffix ==
'\0') {
165 const char *local =
".local";
166 while (*suffix && *local && lower(*suffix) == *local) {
170 return *suffix ==
'\0' && *local ==
'\0';
174 static char lower(
char c) {
175 return c >=
'A' && c <=
'Z' ? c + (
'a' -
'A') : c;