diff --git a/src/Network/network_types.c b/src/Network/network_types.c index 875fe74..223c5b4 100644 --- a/src/Network/network_types.c +++ b/src/Network/network_types.c @@ -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); diff --git a/src/Network/network_types.h b/src/Network/network_types.h index 4bffc87..f167ddd 100644 --- a/src/Network/network_types.h +++ b/src/Network/network_types.h @@ -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 as Maybe -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 +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 +Maybe knIPV4Endpoint_fromStr(char* endStr, knIPV4Endpoint* endVal); char* knIPV4Endpoint_toString(knIPV4Endpoint* end); diff --git a/tests/main.cpp b/tests/main.cpp index 7623ef9..854eced 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -3,7 +3,7 @@ i32 main(){ if(setlocale(LC_CTYPE, "C.UTF-8")!=0) kprintf("\e[93msetlocale failed\n"); - kt_beginInit(); + kt_beginInit(true); kt_initKerepTypes(); kt_endInit(); test_all(); diff --git a/tests/test_network.c b/tests/test_network.c index b67199a..e0231e6 100644 --- a/tests/test_network.c +++ b/tests/test_network.c @@ -3,11 +3,10 @@ #include static void __test_knIPV4Address_fromStr(char* addrStr, u8 a, u8 b, u8 c, u8 d){ - tryLast(knIPV4Address_fromStr(addrStr), maybeAddr, ;) knIPV4Address addr; - addr.UintBigEndian=(u32)maybeAddr.value.UInt64; + tryLast(knIPV4Address_fromStr(addrStr, &addr), maybeAddr, ;) kprintf("\e[92mknIPV4Address_fromStr(\e[96m%s\e[92m) -> ", addrStr); - if(maybeAddr.value.UInt64!=knIPV4Address_fromBytes(a,b,c,d).UintBigEndian){ + if(addr.UintBigEndian != knIPV4Address_fromBytes(a,b,c,d).UintBigEndian){ kprintf("\e[91m%u.%u.%u.%u\n", (u8)addr.bytes[0], (u8)addr.bytes[1], (u8)addr.bytes[2], (u8)addr.bytes[3]); throw("knIPV4Address_fromStr returned wrong value");