knIPV4Endpoint_fromStr

This commit is contained in:
Timerix22 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); kt_define(knIPV4Endpoint, NULL, __knIPV4Endpoint_toString);
Maybe knIPV4Address_fromStr(char* addrStr){ Maybe knIPV4Address_fromStr(char* addrStr, knIPV4Address* addrVal){
char* addrStr_src=addrStr; char* addrStr_src=addrStr;
char* errmsg_extra="wrong char"; char* errmsg_extra="wrong char";
u8 c; u8 c;
@ -48,8 +48,9 @@ Maybe knIPV4Address_fromStr(char* addrStr){
break; break;
} }
} }
//TODO UniStack for generic structs
return SUCCESS(UniUInt64(addr.UintBigEndian)); *addrVal=addr;
return MaybeNull;
} }
char* knIPV4Address_toString(knIPV4Address* address) { char* knIPV4Address_toString(knIPV4Address* address) {
@ -65,6 +66,23 @@ char* knIPV4Address_toString(knIPV4Address* address) {
return s; 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* knIPV4Endpoint_toString(knIPV4Endpoint* end) {
char* a = knIPV4Address_toString(&end->address); char* a = knIPV4Address_toString(&end->address);
char* p = toString_u64(end->port, 0, 0); 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_fromBytes(A, B, C, D) ((knIPV4Address){.bytes={A,B,C,D}})
#define knIPV4Address_fromU32(N) ((knIPV4Address){.UintBigEndian=N}) #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_ANY knIPV4Address_fromBytes(0,0,0,0)
#define knIPV4Address_LOOPBACK knIPV4Address_fromBytes(127,0,0,1) #define knIPV4Address_LOOPBACK knIPV4Address_fromBytes(127,0,0,1)
#define knIPV4Address_INVALID knIPV4Address_fromBytes(255,255,255,255) #define knIPV4Address_INVALID knIPV4Address_fromBytes(255,255,255,255)
#define knIPV4Address_isINVALID(ADDR) (ADDR.UintBigEndian == ~0) #define knIPV4Address_isINVALID(ADDR) (ADDR.UintBigEndian == ~0)
///@return Maybe<null>
Maybe knIPV4Address_fromStr(char* addrStr, knIPV4Address* addrPtr);
char* knIPV4Address_toString(knIPV4Address* address); char* knIPV4Address_toString(knIPV4Address* address);
@ -38,7 +39,10 @@ STRUCT(knIPV4Endpoint,
#define knIPV4Endpoint_create(ADDR, PORT) ((knIPV4Endpoint){ADDR, PORT}) #define knIPV4Endpoint_create(ADDR, PORT) ((knIPV4Endpoint){ADDR, PORT})
#define knIPV4Endpoint_INVALID knIPV4Endpoint_create(knIPV4Address_INVALID, knPort_INVALID) #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); char* knIPV4Endpoint_toString(knIPV4Endpoint* end);

View File

@ -3,7 +3,7 @@
i32 main(){ i32 main(){
if(setlocale(LC_CTYPE, "C.UTF-8")!=0) if(setlocale(LC_CTYPE, "C.UTF-8")!=0)
kprintf("\e[93msetlocale failed\n"); kprintf("\e[93msetlocale failed\n");
kt_beginInit(); kt_beginInit(true);
kt_initKerepTypes(); kt_initKerepTypes();
kt_endInit(); kt_endInit();
test_all(); test_all();

View File

@ -3,11 +3,10 @@
#include <pthread.h> #include <pthread.h>
static void __test_knIPV4Address_fromStr(char* addrStr, u8 a, u8 b, u8 c, u8 d){ static void __test_knIPV4Address_fromStr(char* addrStr, u8 a, u8 b, u8 c, u8 d){
tryLast(knIPV4Address_fromStr(addrStr), maybeAddr, ;)
knIPV4Address addr; knIPV4Address addr;
addr.UintBigEndian=(u32)maybeAddr.value.UInt64; tryLast(knIPV4Address_fromStr(addrStr, &addr), maybeAddr, ;)
kprintf("\e[92mknIPV4Address_fromStr(\e[96m%s\e[92m) -> ", addrStr); 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", kprintf("\e[91m%u.%u.%u.%u\n",
(u8)addr.bytes[0], (u8)addr.bytes[1], (u8)addr.bytes[2], (u8)addr.bytes[3]); (u8)addr.bytes[0], (u8)addr.bytes[1], (u8)addr.bytes[2], (u8)addr.bytes[3]);
throw("knIPV4Address_fromStr returned wrong value"); throw("knIPV4Address_fromStr returned wrong value");