1#include "stdio.h"
2#include "stdlib.h"
3#include "string.h"
4
5typedef struct Car {
6 char *make;
7 char *color;
8} Car;
9
10typedef struct Person {
11 char *name;
12 int id;
13 char *email;
14 Car *car;
15} Person;
16
17typedef struct {
18 char *bytes;
19 int pointer;
20} ByteWriter;
21
22ByteWriter *mb_new() {
23 ByteWriter *writer = malloc(sizeof(ByteWriter));
24 writer->bytes = malloc(128);
25 writer->pointer = 0;
26 return writer;
27}
28
29void mb_write_byte(ByteWriter *writer, char value) {
30 writer->bytes[writer->pointer] = value;
31 writer->pointer++;
32}
33
34void mb_write_int(ByteWriter *writer, int value) {
35 writer->bytes[writer->pointer + 0] = (value >> 24) & 0xFF;
36 writer->bytes[writer->pointer + 1] = (value >> 16) & 0xFF;
37 writer->bytes[writer->pointer + 2] = (value >> 8) & 0xFF;
38 writer->bytes[writer->pointer + 3] = (value) & 0xFF;
39
40 writer->pointer += 4;
41}
42
43void mb_write_bytearray(ByteWriter *writer, char *value, int length) {
44 mb_write_int(writer, length);
45 for (int i = 0; i < length; i++) {
46 mb_write_byte(writer, value[i]);
47 }
48}
49
50void mb_write_string(ByteWriter *writer, char *value) {
51 int length = strlen(value);
52 mb_write_int(writer, length);
53 for (int i = 0; i < length; i++) {
54 mb_write_byte(writer, value[i]);
55 }
56}
57
58ByteWriter *car_encode(Car car) {
59 ByteWriter *writer = mb_new();
60 mb_write_byte(writer, 1);
61 mb_write_string(writer, car.make);
62 mb_write_string(writer, car.color);
63
64 return writer;
65}
66
67ByteWriter *person_encode(Person person) {
68 ByteWriter *writer = mb_new();
69 mb_write_byte(writer, 1);
70
71 mb_write_string(writer, person.name);
72 mb_write_int(writer, person.id);
73 mb_write_string(writer, person.email);
74
75 if (person.car == NULL) {
76 mb_write_byte(writer, 0);
77 } else {
78 mb_write_byte(writer, 1);
79 ByteWriter *writer_car = car_encode(*person.car);
80 mb_write_bytearray(writer, writer_car->bytes, writer_car->pointer - 1);
81 }
82
83 return writer;
84}
85
86Person person_decode(char bytes[]) {
87 size_t bytes_size = sizeof(bytes);
88
89 char version = bytes[0];
90 if (version != 1) {
91 printf("version mismatch between decoder and buffer, errors might occur\n");
92 }
93}