aboutsummaryrefslogtreecommitdiff
path: root/drawing/op.ha
blob: 532fd75eb5927382ebf2972b6c6d6db605449b13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use io;
use endian;

export type op_circle = struct {
	pos: pos,
	radius: u8,
	color: u32
};
export type op_other = void;

export type op = (op_circle| op_other);

def SER_LEN: size = 13;


// return value must be freed... for now. ehh
export fn ser_op(op: op) []u8 = {
	const opc = op as op_circle;
	let buf: []u8 = alloc([0...],SER_LEN);
	endian::leputu32(buf[0..4], opc.pos.0: u32);
	endian::leputu32(buf[4..8], opc.pos.1: u32);
	endian::leputu32(buf[8..12], opc.color: u32);
	buf[12] = opc.radius;
	return buf;
};

export fn deser_op(bytes: []u8) op = {
	assert(len(bytes) == SER_LEN, "wrong length somehow");
	return op_circle {
		pos = (endian::legetu32(bytes[0..4]): i32,
			endian::legetu32(bytes[4..8]): i32),
		color = endian::legetu32(bytes[8..12]),
		radius = bytes[12],
	};
};