From 7ba7201d3a628fd3107b74ee4b7fbbcae8fe97fa Mon Sep 17 00:00:00 2001 From: timerix Date: Sun, 14 Aug 2022 13:23:39 +0600 Subject: [PATCH] PACK() macro --- kerep.vcxproj | 11 ++++++++++- src/Autoarr/Autoarr.c | 8 ++++---- src/Network/README.md | 0 src/Network/knAddress.h | 2 +- src/Network/knPackage.h | 4 ++-- src/Network/knSocket.c | 6 +++--- src/Network/knSocket.h | 10 +++++----- src/Network/stdSocketHeaders.h | 3 ++- src/base/std.h | 11 ++++++++++- src/base/types.h | 4 ++-- tests/test_network.c | 11 ++++++++--- tests/test_searchtree.c | 4 ++-- tests/tests.h | 2 ++ 13 files changed, 51 insertions(+), 25 deletions(-) create mode 100644 src/Network/README.md diff --git a/kerep.vcxproj b/kerep.vcxproj index cd2ba68..8579686 100644 --- a/kerep.vcxproj +++ b/kerep.vcxproj @@ -32,6 +32,8 @@ + + @@ -44,6 +46,7 @@ + @@ -64,7 +67,11 @@ + + + + @@ -75,7 +82,7 @@ Win32Proj {52f0bd29-a3cb-47ce-b25d-ceaf5dfb2d73} kerep - 10.0.18362.0 + 10.0 @@ -218,6 +225,8 @@ Default stdcpp20 None + true + true Windows diff --git a/src/Autoarr/Autoarr.c b/src/Autoarr/Autoarr.c index 90346bb..48d595a 100644 --- a/src/Autoarr/Autoarr.c +++ b/src/Autoarr/Autoarr.c @@ -1,9 +1,9 @@ #include "Autoarr.h" -Autoarr_define(uint8) -Autoarr_define(int8) -Autoarr_define(uint16) -Autoarr_define(int16) +Autoarr_define(uint8); +Autoarr_define(int8); +Autoarr_define(uint16); +Autoarr_define(int16); Autoarr_define(uint32); Autoarr_define(int32); Autoarr_define(uint64); diff --git a/src/Network/README.md b/src/Network/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/Network/knAddress.h b/src/Network/knAddress.h index 737421e..ff42021 100644 --- a/src/Network/knAddress.h +++ b/src/Network/knAddress.h @@ -19,7 +19,7 @@ typedef union knIPV4Address { ///@return Maybe as Maybe Maybe knIPV4Address_fromStr(char* addrStr); -typedef struct __attribute__((__packed__)) knIPV4Endpoint { +typedef struct knIPV4Endpoint { knIPV4Address address; knPort port; } knIPV4Endpoint; diff --git a/src/Network/knPackage.h b/src/Network/knPackage.h index f5396f0..ab7aeca 100644 --- a/src/Network/knPackage.h +++ b/src/Network/knPackage.h @@ -10,9 +10,9 @@ extern "C" { #define KNPAC_MAX_DATA_SIZE (65535-sizeof(knPackage)+sizeof(uint8*)) -typedef enum __attribute__((__packed__)) knPacVersion { +typedef enum knPacVersion PACK({ knPac_V1 -} knPacVersion; +}) knPacVersion; static const char knPacHeader[5]={'k','n','p','a','c'}; diff --git a/src/Network/knSocket.c b/src/Network/knSocket.c index 7e23819..97ffa27 100644 --- a/src/Network/knSocket.c +++ b/src/Network/knSocket.c @@ -2,7 +2,7 @@ #include "stdSocketHeaders.h" -Maybe knSocket_open(knSockType sockType){ +Maybe knSocket_open(knSocketType sockType){ knSocket* newSocket=malloc(sizeof(knSocket)); newSocket->type=sockType; newSocket->channels=NULL; @@ -13,12 +13,12 @@ Maybe knSocket_open(knSockType sockType){ default: safethrow("unknown socket type", free(newSocket)); break; - case knSockType_TCP: + case knSocketType_TCP: newSocket->socketfd=socket(AF_INET, SOCK_STREAM, 0); if(newSocket->socketfd==-1) safethrow("can't create TCP socket", free(newSocket)); break; - case knSockType_UDP: + case knSocketType_UDP: newSocket->socketfd=socket(AF_INET, SOCK_DGRAM, 0); if(newSocket->socketfd==-1) safethrow("can't create UDP socket", free(newSocket)); diff --git a/src/Network/knSocket.h b/src/Network/knSocket.h index 272e4a1..337f012 100644 --- a/src/Network/knSocket.h +++ b/src/Network/knSocket.h @@ -9,12 +9,12 @@ extern "C" { #include "knPackage.h" -typedef enum __attribute__((__packed__)) knSockType { - knSockType_TCP, knSockType_UDP -} knSockType; +typedef enum knSocketType PACK({ + knSocketType_TCP, knSocketType_UDP +}) knSocketType; typedef struct knSocket { - knSockType type; + knSocketType type; uint16 channelsAmount; knChannel* channels; int64 socketfd; @@ -23,7 +23,7 @@ typedef struct knSocket { } knSocket; ///@return Maybe new socket -Maybe knSocket_open(knSockType sockType); +Maybe knSocket_open(knSocketType sockType); ///@return Maybe error or nothing Maybe knSocket_close(knSocket* socket); diff --git a/src/Network/stdSocketHeaders.h b/src/Network/stdSocketHeaders.h index 5c0cd0c..3be12d3 100644 --- a/src/Network/stdSocketHeaders.h +++ b/src/Network/stdSocketHeaders.h @@ -13,7 +13,8 @@ extern "C" { #include #include #include - #include + #include + #include #endif #if __cplusplus diff --git a/src/base/std.h b/src/base/std.h index 09193de..7d7138a 100644 --- a/src/base/std.h +++ b/src/base/std.h @@ -11,7 +11,6 @@ extern "C" { #include #include #include -#include #define dbg(N) printf("\e[95m%d\n",N) @@ -36,6 +35,7 @@ extern "C" { #pragma GCC error "unknown compiler" #endif + #ifdef _MSC_VER #define IFWIN(YES, NO) YES #define IFMSC(YES, NO) YES @@ -53,6 +53,15 @@ extern "C" { #define NULL ((void*)0) #endif + +#ifdef __GNUC__ + #define PACK(...) __VA_ARGS__ __attribute__((__packed__)) +#elif defined(_MSC_VER) + #define PACK(...) __pragma(pack(push, 1)) __VA_ARGS__ __pragma(pack(pop)) +#endif + + + #if __cplusplus } #endif \ No newline at end of file diff --git a/src/base/types.h b/src/base/types.h index e34d95f..49df7da 100644 --- a/src/base/types.h +++ b/src/base/types.h @@ -16,7 +16,7 @@ typedef int64_t int64; typedef uint64_t uint64; typedef float float32; typedef double float64; -typedef enum __attribute__((__packed__)) my_type { +typedef enum my_type PACK({ Null, Float32, Float64, Char, Bool, UInt8, Int8, UInt16, Int16, UInt32, Int32, UInt64, Int64, UInt8Ptr, Int8Ptr, UInt16Ptr, Int16Ptr, UInt32Ptr, Int32Ptr, UInt64Ptr, Int64Ptr, @@ -25,7 +25,7 @@ typedef enum __attribute__((__packed__)) my_type { AutoarrInt8Ptr, AutoarrUInt8Ptr, AutoarrInt16Ptr, AutoarrUInt16Ptr, AutoarrInt32Ptr, AutoarrUInt32Ptr, AutoarrInt64Ptr, AutoarrUInt64Ptr, AutoarrUnitypePtr, AutoarrKVPairPtr, knSocketPtr -} my_type; +}) my_type; #define my_type_last knSocketPtr const char* my_type_name(my_type t); diff --git a/tests/test_network.c b/tests/test_network.c index 2b52bce..8df3f07 100644 --- a/tests/test_network.c +++ b/tests/test_network.c @@ -20,15 +20,20 @@ void __test_knIPV4Address_fromStr(char* addrStr, uint8 a, uint8 b, uint8 c, uint void test_network(){ optime(__func__,1,({ printf("\e[96m------------[test_network]------------\n"); - if(sizeof(knIPV4Endpoint)!=sizeof(knPort)+sizeof(knIPV4Address)) - throw(ERR_WRONGTYPE); + + PRINT_SIZEOF(knIPV4Address); + PRINT_SIZEOF(knPort); + PRINT_SIZEOF(knIPV4Endpoint); + PRINT_SIZEOF(knPackage); + PRINT_SIZEOF(knChannel); + PRINT_SIZEOF(knSocket); test_knIPV4Address_fromStr(127,0,0,1); test_knIPV4Address_fromStr(34,255,45,0); test_knIPV4Address_fromStr(3,3,3,128); knSocket* s; - tryLast(knSocket_open(knSockType_TCP), maybeS) + tryLast(knSocket_open(knSocketType_TCP), maybeS) s=maybeS.value.VoidPtr; printf("\e[92mTCP socket created\n"); tryLast(knSocket_close(s);,_); diff --git a/tests/test_searchtree.c b/tests/test_searchtree.c index cb4600e..cff22a5 100644 --- a/tests/test_searchtree.c +++ b/tests/test_searchtree.c @@ -7,7 +7,7 @@ void printstnode(STNode* node){ "\n address: %p\n value: ",sizeof(STNode),node); printuni(node->value); // prints pointers to all existing branches - printf("\n branches: %p\n", node->branches); + /* printf("\n branches: %p\n", node->branches); if(node->branches) for(uint8 i=0;i<8;i++){ printf(" \e[90m[%u]=%p\n",i,node->branches[i]); if(node->branches[i]) @@ -18,7 +18,7 @@ void printstnode(STNode* node){ printf(" \e[90m[%u]=%p\n",iii,node->branches[i][ii][iii]); } - } + } */ } void test_searchtree(){ diff --git a/tests/tests.h b/tests/tests.h index 012a7e2..eb66a8f 100644 --- a/tests/tests.h +++ b/tests/tests.h @@ -15,6 +15,8 @@ void test_hashtable(); void test_dtsod(); void test_network(); +#define PRINT_SIZEOF(T) printf("\e[94m" #T " size: \e[96m" IFWIN("%llu", "%lu") "\n", sizeof(T)) + #if __cplusplus } #endif \ No newline at end of file