A small lightweight library for typed cross-language communication.
at master 2.1 kB view raw
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}