knIPV4Endpoint_fromStr

This commit is contained in:
2024-01-04 00:29:55 +06:00
parent b430846a0e
commit 6ba06dcc0c
4 changed files with 31 additions and 10 deletions

View File

@@ -7,7 +7,7 @@ kt_define(knIPV4Address, NULL, __knIPV4Address_toString);
kt_define(knIPV4Endpoint, NULL, __knIPV4Endpoint_toString);
Maybe knIPV4Address_fromStr(char* addrStr){
Maybe knIPV4Address_fromStr(char* addrStr, knIPV4Address* addrVal){
char* addrStr_src=addrStr;
char* errmsg_extra="wrong char";
u8 c;
@@ -48,8 +48,9 @@ Maybe knIPV4Address_fromStr(char* addrStr){
break;
}
}
//TODO UniStack for generic structs
return SUCCESS(UniUInt64(addr.UintBigEndian));
*addrVal=addr;
return MaybeNull;
}
char* knIPV4Address_toString(knIPV4Address* address) {
@@ -65,6 +66,23 @@ char* knIPV4Address_toString(knIPV4Address* address) {
return s;
}
Maybe knIPV4Endpoint_fromStr(char* endStr, knIPV4Endpoint* endVal){
i32 sep_i = cptr_seekChar(endStr, ':', 0, 48);
if(sep_i < 7)
safethrow(cptr_concat("can't find ':' in '", endStr, "'"), ;);
char* portBegin = endStr+sep_i+1;
u64 port = knPort_INVALID;
if(sscanf(portBegin, "%llu", &port)!=1)
safethrow(cptr_concat("can't recognise port number in '", portBegin, "'"), ;)
knIPV4Address addr = knIPV4Address_INVALID;
try(knIPV4Address_fromStr(endStr, &addr), _m865, ;);
*endVal = knIPV4Endpoint_create(addr, port);
return MaybeNull;
}
char* knIPV4Endpoint_toString(knIPV4Endpoint* end) {
char* a = knIPV4Address_toString(&end->address);
char* p = toString_u64(end->port, 0, 0);

View File

@@ -19,14 +19,15 @@ kt_declare(knIPV4Address);
#define knIPV4Address_fromBytes(A, B, C, D) ((knIPV4Address){.bytes={A,B,C,D}})
#define knIPV4Address_fromU32(N) ((knIPV4Address){.UintBigEndian=N})
///@return Maybe<knIPV4Address> as Maybe<knIPV4Address>
Maybe knIPV4Address_fromStr(char* addrStr);
#define knIPV4Address_ANY knIPV4Address_fromBytes(0,0,0,0)
#define knIPV4Address_LOOPBACK knIPV4Address_fromBytes(127,0,0,1)
#define knIPV4Address_INVALID knIPV4Address_fromBytes(255,255,255,255)
#define knIPV4Address_isINVALID(ADDR) (ADDR.UintBigEndian == ~0)
///@return Maybe<null>
Maybe knIPV4Address_fromStr(char* addrStr, knIPV4Address* addrPtr);
char* knIPV4Address_toString(knIPV4Address* address);
@@ -38,7 +39,10 @@ STRUCT(knIPV4Endpoint,
#define knIPV4Endpoint_create(ADDR, PORT) ((knIPV4Endpoint){ADDR, PORT})
#define knIPV4Endpoint_INVALID knIPV4Endpoint_create(knIPV4Address_INVALID, knPort_INVALID)
#define knIPV4Address_isINVALID(ENDP) (knIPV4Address_isINVALID(ENDP.address) || knPort_isINVALID(ENDP.port))
#define knIPV4Endpoint_isINVALID(ENDP) (knIPV4Address_isINVALID(ENDP.address) || knPort_isINVALID(ENDP.port))
///@return Maybe<null>
Maybe knIPV4Endpoint_fromStr(char* endStr, knIPV4Endpoint* endVal);
char* knIPV4Endpoint_toString(knIPV4Endpoint* end);