From 4bbbfb8e8139e690ea084b72ccc2de71fdca1e08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Manuel=20Tom=C3=A1s?= Date: Sun, 2 Aug 2020 03:50:26 -0300 Subject: Simplify encoding and decoding --- src/common/file.cpp | 4 +-- src/common/ipc.cpp | 92 ++++++++++++++++++++++++++++++++++----------------- src/common/socket.cpp | 17 +++++++--- 3 files changed, 76 insertions(+), 37 deletions(-) (limited to 'src/common') diff --git a/src/common/file.cpp b/src/common/file.cpp index a9d8c2b..626f352 100644 --- a/src/common/file.cpp +++ b/src/common/file.cpp @@ -3,11 +3,9 @@ #include #include -class File { +struct File { int descriptor; - public: - File(const char *filepath, int flags) { descriptor = open(filepath, flags); } diff --git a/src/common/ipc.cpp b/src/common/ipc.cpp index d5a42e4..261b31f 100644 --- a/src/common/ipc.cpp +++ b/src/common/ipc.cpp @@ -1,7 +1,9 @@ #include +#define MESSAGE_SIZE 32 + enum Operation { - OP_NULL = 0, + OP_NULL, OP_MOVE1, OP_MOVE2, OP_MOVE4, @@ -11,32 +13,62 @@ enum Operation { OP_SHOW }; -void encode2(int16_t data, int8_t *message, size_t offset) { - message[offset] = data & 0x00ff; - message[offset + 1] = (data & 0xff00) >> 8; -} - -int16_t decode2(int8_t *message, size_t offset) { - return (int16_t)message[offset + 1] << 8 & 0xff00 - | (int16_t)message[offset] & 0x00ff; -} - -void encode4(int32_t data, int8_t *message, size_t offset) { - encode2( data & 0x0000ffff, message, offset); - encode2((data & 0xffff0000) >> 16, message, offset + 2); -} - -int32_t decode4(int8_t *message, size_t offset) { - return (int32_t)decode2(message, offset + 2) << 16 & 0xffff0000 - | (int32_t)decode2(message, offset) & 0x0000ffff; -} - -void encode8(int64_t data, int8_t *message, size_t offset) { - encode4( data & 0x00000000ffffffff, message, offset); - encode4((data & 0xffffffff00000000) >> 32, message, offset + 4); -} - -int64_t decode8(int8_t *message, size_t offset) { - return (int64_t)decode4(message, offset + 4) << 32 & 0xffffffff00000000 - | (int64_t)decode4(message, offset) & 0x00000000ffffffff; -} +struct Message { + uint8_t data[MESSAGE_SIZE] = {}; + int offset = 0; + + bool at_end() { + return data[offset] == 0; + } + + void encode1(int8_t input) { + data[offset++] = input; + } + + int8_t decode1() { + return data[offset++]; + } + + void encode2(int16_t input) { + data[offset++] = input >> 8; + data[offset++] = input; + } + + int16_t decode2() { + int16_t result = data[offset++]; + result <<= 8; + result |= data[offset++]; + return result; + } + + void encode4(int32_t input) { + for (int i = 3; i >= 0; i++) { + data[offset++] = input >> i * 8; + } + } + + int32_t decode4() { + int32_t result = data[offset++]; + for (int i = 0; i < 3; i++) { + result <<= 8; + result |= data[offset++]; + } + return result; + } + + void encode8(int64_t input) { + for (int i = 7; i >= 0; i++) { + data[offset++] = input >> i * 8; + } + } + + int64_t decode8() { + int64_t result = data[offset++]; + for (int i = 0; i < 7; i++) { + result <<= 8; + result |= data[offset++]; + } + return result; + } +}; + diff --git a/src/common/socket.cpp b/src/common/socket.cpp index 7eb4b46..7cd02e4 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -8,11 +8,9 @@ #define PORT 6969 -class Socket { +struct Socket { int descriptor; - public: - Socket() { descriptor = socket(AF_INET, SOCK_STREAM, 0); } @@ -60,14 +58,25 @@ class Socket { ::connect(descriptor, (sockaddr *) &addr, sizeof(sockaddr_in)); } - size_t send(void *msg, size_t length) { + size_t send(const void *msg, size_t length) { return write(descriptor, msg, length); } + size_t send(Message &msg) { + size_t result = write(descriptor, msg.data, msg.offset); + msg.offset = 0; + return result; + } + size_t recv(void *msg, size_t length) { return read(descriptor, msg, length); } + size_t recv(Message &msg) { + msg.offset = 0; + return read(descriptor, msg.data, MESSAGE_SIZE); + } + ~Socket() { close(descriptor); } -- cgit v1.2.3