summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJuan Manuel Tomás <jtomas1815@gmail.com>2020-08-02 03:50:26 -0300
committerJuan Manuel Tomás <jtomas1815@gmail.com>2020-08-03 23:56:03 -0300
commit4bbbfb8e8139e690ea084b72ccc2de71fdca1e08 (patch)
tree0ea15129b752d00f96c6a91e88ec303fd90d7860 /src
parent83ec165fddc5f9ee99a8e2aa75d188c45253a0fa (diff)
downloadjet-4bbbfb8e8139e690ea084b72ccc2de71fdca1e08.tar.gz
jet-4bbbfb8e8139e690ea084b72ccc2de71fdca1e08.zip
Simplify encoding and decoding
Diffstat (limited to 'src')
-rw-r--r--src/client/jetc.cpp36
-rw-r--r--src/common/file.cpp4
-rw-r--r--src/common/ipc.cpp92
-rw-r--r--src/common/socket.cpp17
-rw-r--r--src/server/client.cpp41
5 files changed, 109 insertions, 81 deletions
diff --git a/src/client/jetc.cpp b/src/client/jetc.cpp
index cdb570e..cfe3db7 100644
--- a/src/client/jetc.cpp
+++ b/src/client/jetc.cpp
@@ -12,13 +12,13 @@
Socket io;
Window window;
Cursor cursor(window);
+Message msg;
void update() {
- int8_t msg[5];
- msg[0] = OP_SHOW;
- encode2(window.width, msg, 1);
- encode2(window.height, msg, 3);
- io.send(msg, 5);
+ msg.encode1(OP_SHOW);
+ msg.encode2(window.width);
+ msg.encode2(window.height);
+ io.send(msg);
io.recv(window.view, window.width * window.height);
io.recv(window.line_ends, window.height);
@@ -27,33 +27,29 @@ void update() {
}
void move_left() {
- int8_t mov[2];
- mov[0] = OP_MOVE1;
- mov[1] = -1;
- io.send(mov, 2);
+ msg.encode1(OP_MOVE1);
+ msg.encode1(-1);
+ io.send(msg);
cursor.move_left();
}
void move_right() {
- int8_t mov[2];
- mov[0] = OP_MOVE1;
- mov[1] = 1;
- io.send(mov, 2);
+ msg.encode1(OP_MOVE1);
+ msg.encode1(1);
+ io.send(msg);
cursor.move_right();
}
void delete_element() {
- int8_t del;
- del = OP_DELETE;
- io.send(&del, 1);
+ msg.encode1(OP_DELETE);
+ io.send(msg);
cursor.move_left();
}
void insert_element(int input) {
- int8_t ins[2];
- ins[0] = OP_INSERT;
- ins[1] = input;
- io.send(ins, 2);
+ msg.encode1(OP_INSERT);
+ msg.encode1(input);
+ io.send(msg);
cursor.move_right();
}
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 <sys/stat.h>
#include <fcntl.h>
-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 <stdint.h>
+#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);
}
diff --git a/src/server/client.cpp b/src/server/client.cpp
index 75c1c38..7932436 100644
--- a/src/server/client.cpp
+++ b/src/server/client.cpp
@@ -1,58 +1,51 @@
-#define MAX_MSG_SIZE 8
#define pos(x, y) (x) + (y) * window_w
struct Client {
Socket io;
Point cursor;
Point window_start;
+ Message msg;
Client(const Buffer &b, int fd) : io(fd), cursor(b), window_start(cursor) {}
void parse_message() {
- int8_t message[MAX_MSG_SIZE] = {};
- io.recv(message, MAX_MSG_SIZE - 1);
- int8_t *iter = message;
- while (iter[0]) {
- switch (iter[0]) {
+ size_t length = io.recv(msg);
+ while (msg.offset < length) {
+ switch (msg.decode1()) {
case OP_MOVE1:
- move(iter[1]);
- iter += 2;
+ move(msg.decode1());
break;
case OP_MOVE2:
- move(decode2(iter, 1));
- iter += 3;
+ move(msg.decode2());
break;
case OP_MOVE4:
- move(decode4(iter, 1));
- iter += 5;
+ move(msg.decode4());
break;
case OP_MOVE8:
- move(decode8(iter, 1));
- iter += 9;
+ move(msg.decode8());
break;
case OP_INSERT:
- push(iter[1]);
- iter += 2;
+ push(msg.decode1());
break;
case OP_DELETE:
pop();
- iter += 1;
break;
case OP_SHOW:
- show(decode2(iter, 1), decode2(iter, 3));
- iter += 5;
+ int width = msg.decode2();
+ int height = msg.decode2();
+ show(width, height);
break;
- default:
- iter++;
}
}
- for (int i = 0; i < MAX_MSG_SIZE; i++) {
- if (message[i])
- printf("%02hhx ", message[i]);
+#if 1
+ for (int i = 0; i < length; i++) {
+ if (msg.data[i])
+ printf("%02hhx ", msg.data[i]);
else
printf(".. ");
}
printf("\n");
+#endif
}
void show(size_t window_w, size_t window_h) {