summaryrefslogtreecommitdiff
path: root/src/fspec/bcode.h
blob: 3d216afbb7f0c27c12c67d420d2893656787e8ab (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
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#pragma once

#include <inttypes.h>
#include <stdint.h>
#include <stdbool.h>

/** maximum range of numbers */
#define PRI_FSPEC_NUM PRIu64
typedef uint64_t fspec_num;

enum fspec_visual {
   FSPEC_VISUAL_NUL,
   FSPEC_VISUAL_DEC,
   FSPEC_VISUAL_HEX,
   FSPEC_VISUAL_STR,
   FSPEC_VISUAL_LAST,
} __attribute__((packed));

enum fspec_type {
   FSPEC_TYPE_CODE,
   FSPEC_TYPE_CALL,
   FSPEC_TYPE_U8,
   FSPEC_TYPE_S8,
   FSPEC_TYPE_U16,
   FSPEC_TYPE_S16,
   FSPEC_TYPE_U32,
   FSPEC_TYPE_S32,
   FSPEC_TYPE_U64,
   FSPEC_TYPE_S64,
   FSPEC_TYPE_LAST,
} __attribute__((packed));

enum fspec_storage {
   FSPEC_STORAGE_DATA,
   FSPEC_STORAGE_LOCAL,
   FSPEC_STORAGE_LAST,
} __attribute__((packed));

enum fspec_builtin {
   FSPEC_BUILTIN_ADD,
   FSPEC_BUILTIN_SUB,
   FSPEC_BUILTIN_MUL,
   FSPEC_BUILTIN_DIV,
   FSPEC_BUILTIN_MOD,
   FSPEC_BUILTIN_BIT_AND,
   FSPEC_BUILTIN_BIT_OR,
   FSPEC_BUILTIN_BIT_XOR,
   FSPEC_BUILTIN_BIT_LEFT,
   FSPEC_BUILTIN_BIT_RIGHT,
   FSPEC_BUILTIN_DECLARE,
   FSPEC_BUILTIN_READ,
   FSPEC_BUILTIN_FILTER,
   FSPEC_BUILTIN_VISUAL,
   FSPEC_BUILTIN_LAST,
} __attribute__((packed));

enum fspec_op {
   FSPEC_OP_BUILTIN,
   FSPEC_OP_PUSH,
   FSPEC_OP_POP,
   FSPEC_OP_VAR,
   FSPEC_OP_LAST,
} __attribute__((packed));

struct fspec_bcode {
   char op, data[];
} __attribute__((packed));

#if 0
('fspc')(version)
OP_BUILTIN (declare) OP_PUSH OP_VAR8 (storage) OP_VAR8 (type) OP_VAR [name] OP_POP
OP_BUILTIN (filter)
OP_FUN FUN_ASSIGN VAR0 VAR [data]
OP_FUN FUN_READ
#endif

#if 0
uint8_t
fspec_op_get_num_args(const struct fspec_bcode *code);

const struct fspec_bcode*
fspec_op_next(const struct fspec_bcode *code, const void *end, const bool skip_args);

const struct fspec_bcode*
fspec_op_get_arg(const struct fspec_bcode *code, const void *end, const uint8_t nth, const uint32_t expect);

const struct fspec_arg*
fspec_arg_next(const struct fspec_bcode *code, const void *end, const uint8_t nth, const uint32_t expect);

fspec_num
fspec_ref_get_num(const struct fspec_bcode *code);
#endif