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(&a, addr)) { 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(&ap, addr_port)) { 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