6 * Created on September 7, 2017, 3:38 PM
9 #include "serializer.h"
14 #define SERIALBUFFERLENGTH 4096
16 Serializer::Serializer(const char *file) :
17 buffer((char *) ourmalloc(SERIALBUFFERLENGTH)),
19 bufferlength(SERIALBUFFERLENGTH) {
20 filedesc = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
26 void Serializer::flushBuffer() {
27 ssize_t datatowrite = bufferoffset;
30 ssize_t byteswritten = write(filedesc, &buffer[index], datatowrite);
31 if (byteswritten == -1)
33 datatowrite -= byteswritten;
34 index += byteswritten;
39 Serializer::~Serializer() {
41 if (-1 == close(filedesc)) {
47 void Serializer::mywrite(const void *__buf, size_t __n) {
48 char *towrite = (char *) __buf;
49 if (__n > SERIALBUFFERLENGTH * 2) {
50 if (bufferoffset != 0)
53 ssize_t result = write(filedesc, &towrite, __n);
54 if (result != (ssize_t) __n)
61 uint spacefree = bufferlength - bufferoffset;
62 uint datatowrite = spacefree > __n ? __n : spacefree;
63 memcpy(&buffer[bufferoffset], towrite, datatowrite);
64 bufferoffset += datatowrite;
66 if (spacefree < __n) {
69 towrite += datatowrite;
70 } else if (spacefree == __n) {
81 void serializeBooleanEdge(Serializer *serializer, BooleanEdge be, bool isTopLevel) {
82 if (be == BooleanEdge(NULL)) {
85 be.getBoolean()->serialize(serializer);
86 ASTNodeType type = BOOLEANEDGE;
87 serializer->mywrite(&type, sizeof(ASTNodeType));
88 Boolean *boolean = be.getRaw();
89 serializer->mywrite(&boolean, sizeof(Boolean *));
90 serializer->mywrite(&isTopLevel, sizeof(bool));