aboutsummaryrefslogtreecommitdiffstats
path: root/creole.h
blob: da6b6625c8f075331c7fa89e0eaa357c73496785 (plain) (blame)
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#ifndef CREOLE_H
#define CREOLE_H

#include <limits.h>
#include <stddef.h>

#ifndef CREOLE_WORD
# define CREOLE_WORD unsigned int
# define CREOLE_WORD_MAX UINT_MAX
#endif

#define CREOLE_MAX_ARG 3

typedef CREOLE_WORD creole_word;

enum creole_opcode {
	CREOLE_NOOP = 0,
	CREOLE_PUSH = 1,
	CREOLE_POP = 2,
	CREOLE_ADD = 3,
	CREOLE_MUL = 4,
	CREOLE_DIV = 5,
	CREOLE_JL = 6,
	CREOLE_CLB = 7,
	CREOLE_SYS = 8,
	CREOLE_OPCODE_LEN
};

enum creole_word_flag {
	CREOLE_IMMEDIATE,
	CREOLE_REGISTER,
	CREOLE_WORD_FLAGS_LEN
};

enum creole_compiler_ret {
	CREOLE_COMPILE_OK,
	CREOLE_OPCODE_READ_ERROR,
	CREOLE_OPCODE_MALFORMED,
	CREOLE_ARG_READ_ERROR,
	CREOLE_ARG_MALFORMED,
	CREOLE_LAST_READ_ERROR,
	CREOLE_LAST_MALFORMED,
	CREOLE_LABEL_OVERFLOW,
	CREOLE_TYPE_ERROR,
	CREOLE_COMPILE_RET_LEN
};

struct creole_ins {
	enum creole_opcode opcode;
	unsigned char w_flags[3];
	creole_word w[3];
};

struct creole_env {
	creole_word *reg;
	size_t reglen;

	size_t *lab;
	size_t lablen;

	creole_word *stk;
	size_t stkptr, stklen;

	struct creole_ins *prg;
	size_t prgptr, prgend, prglen;
};

struct creole_reader {
	unsigned char *p;
	size_t left;
};

int creole_encode(creole_word i, unsigned encode_to, unsigned high_bits,
                  unsigned char buf[7]);
enum creole_compiler_ret
creole_parse_line(struct creole_ins *ins, struct creole_reader *r);

#endif /* CREOLE_H */