1#pragma once
 2
 3#include <pw.h>
 4
 5#ifdef __cplusplus
 6extern "C" {
 7#endif
 8
 9/*
10 * Parse IPv4 or IPv6 address, optionally followed by port
11 * and return PwType_SockAddr.
12 */
13#define pw_parse_inet_address(addr, result) _Generic((addr),  \
14             char*: _pw_parse_inet_address_ascii,  \
15          char8_t*: _pw_parse_inet_address_utf8,   \
16         char32_t*: _pw_parse_inet_address_utf32,  \
17        PwValuePtr: _pw_parse_inet_address         \
18    )((addr), (result))
19
20[[nodiscard]] bool _pw_parse_inet_address(PwValuePtr addr, PwValuePtr result);
21
22[[nodiscard]] static inline bool _pw_parse_inet_address_ascii(char*     addr, PwValuePtr result) { _PwValue a = PwStaticString(addr); return _pw_parse_inet_address(&a, result); }
23[[nodiscard]] static inline bool _pw_parse_inet_address_utf8 (char8_t*  addr, PwValuePtr result) { PwValue a = PW_NULL; if (!pw_create_string(addr, &a)) { return false; }  return _pw_parse_inet_address(&a, result); }
24[[nodiscard]] static inline bool _pw_parse_inet_address_utf32(char32_t* addr, PwValuePtr result) { _PwValue a = PwStaticStringUtf32(addr); return _pw_parse_inet_address(&a, result); }
25
26
27[[nodiscard]] bool pw_parse_subnet(PwValuePtr subnet, PwValuePtr netmask, PwValuePtr result);
28/*
29 * Parse IPv4 or IPv6 subnet.
30 * If subnet is in CIDR notation, netmask argument is not used.
31 * Return PwType_SockAddr.
32 */
33
34
35/*
36 * Split address and port separated by colon.
37 * Both parts can be empty string.
38 * Port can be a service name, understood by getaddrinfo.
39 */
40#define pw_split_addr_port(addr_port, addr, port) _Generic((addr_port),  \
41             char*: _pw_split_addr_port_ascii,  \
42          char8_t*: _pw_split_addr_port_utf8,   \
43         char32_t*: _pw_split_addr_port_utf32,  \
44        PwValuePtr: _pw_split_addr_port         \
45    )(addr_port, (addr), (port))
46
47[[nodiscard]] bool _pw_split_addr_port(PwValuePtr addr_port, PwValuePtr addr, PwValuePtr port);
48
49[[nodiscard]] static inline bool _pw_split_addr_port_ascii(char*     addr_port, PwValuePtr addr, PwValuePtr port) { _PwValue ap = PwStaticString(addr_port); return _pw_split_addr_port(&ap, addr, port); }
50[[nodiscard]] static inline bool _pw_split_addr_port_utf8 (char8_t*  addr_port, PwValuePtr addr, PwValuePtr port) { PwValue ap = PW_NULL; if (!pw_create_string(addr_port, &ap)) { return false; } return _pw_split_addr_port(&ap, addr, port); }
51[[nodiscard]] static inline bool _pw_split_addr_port_utf32(char32_t* addr_port, PwValuePtr addr, PwValuePtr port) { _PwValue ap = PwStaticStringUtf32(addr_port); return _pw_split_addr_port(&ap, addr, port); }
52
53
54#ifdef __cplusplus
55}
56#endif