Blame


1 fb1a36c0 2022-01-09 op /*
2 fb1a36c0 2022-01-09 op * Copyright (c) 2021 Omar Polo <op@omarpolo.com>
3 fb1a36c0 2022-01-09 op *
4 fb1a36c0 2022-01-09 op * Permission to use, copy, modify, and distribute this software for any
5 fb1a36c0 2022-01-09 op * purpose with or without fee is hereby granted, provided that the above
6 fb1a36c0 2022-01-09 op * copyright notice and this permission notice appear in all copies.
7 fb1a36c0 2022-01-09 op *
8 fb1a36c0 2022-01-09 op * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 fb1a36c0 2022-01-09 op * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 fb1a36c0 2022-01-09 op * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 fb1a36c0 2022-01-09 op * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 fb1a36c0 2022-01-09 op * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 fb1a36c0 2022-01-09 op * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 fb1a36c0 2022-01-09 op * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 fb1a36c0 2022-01-09 op */
16 fb1a36c0 2022-01-09 op
17 fb1a36c0 2022-01-09 op #ifndef SCRIPT_H
18 fb1a36c0 2022-01-09 op #define SCRIPT_H
19 fb1a36c0 2022-01-09 op
20 fb1a36c0 2022-01-09 op enum {
21 fb1a36c0 2022-01-09 op /* literals */
22 fb1a36c0 2022-01-09 op V_SYM,
23 fb1a36c0 2022-01-09 op V_STR,
24 fb1a36c0 2022-01-09 op V_NUM,
25 fb1a36c0 2022-01-09 op
26 fb1a36c0 2022-01-09 op /* foreign */
27 fb1a36c0 2022-01-09 op V_MSG,
28 fb1a36c0 2022-01-09 op V_QIDVEC,
29 fb1a36c0 2022-01-09 op V_QID,
30 fb1a36c0 2022-01-09 op
31 fb1a36c0 2022-01-09 op /* casted */
32 fb1a36c0 2022-01-09 op V_U8,
33 fb1a36c0 2022-01-09 op V_U16,
34 fb1a36c0 2022-01-09 op V_U32,
35 fb1a36c0 2022-01-09 op };
36 fb1a36c0 2022-01-09 op
37 fb1a36c0 2022-01-09 op struct value {
38 fb1a36c0 2022-01-09 op int type;
39 fb1a36c0 2022-01-09 op union {
40 fb1a36c0 2022-01-09 op char *str;
41 fb1a36c0 2022-01-09 op int64_t num;
42 fb1a36c0 2022-01-09 op uint8_t u8;
43 fb1a36c0 2022-01-09 op uint16_t u16;
44 fb1a36c0 2022-01-09 op uint32_t u32;
45 fb1a36c0 2022-01-09 op struct {
46 fb1a36c0 2022-01-09 op uint8_t *msg;
47 fb1a36c0 2022-01-09 op size_t len;
48 fb1a36c0 2022-01-09 op } msg;
49 fb1a36c0 2022-01-09 op struct {
50 fb1a36c0 2022-01-09 op uint8_t *start;
51 fb1a36c0 2022-01-09 op size_t len;
52 fb1a36c0 2022-01-09 op } qidvec;
53 fb1a36c0 2022-01-09 op uint8_t qid[QIDSIZE];
54 fb1a36c0 2022-01-09 op } v;
55 fb1a36c0 2022-01-09 op };
56 fb1a36c0 2022-01-09 op
57 fb1a36c0 2022-01-09 op enum {
58 fb1a36c0 2022-01-09 op OP_REST,
59 fb1a36c0 2022-01-09 op OP_ASSIGN,
60 fb1a36c0 2022-01-09 op OP_ASSERT,
61 fb1a36c0 2022-01-09 op OP_FUNCALL,
62 fb1a36c0 2022-01-09 op OP_LITERAL,
63 fb1a36c0 2022-01-09 op OP_VAR,
64 fb1a36c0 2022-01-09 op OP_CAST,
65 fb1a36c0 2022-01-09 op OP_CMP_EQ,
66 fb1a36c0 2022-01-09 op OP_CMP_LEQ,
67 fb1a36c0 2022-01-09 op OP_FACCESS,
68 fb1a36c0 2022-01-09 op OP_SFAIL,
69 fb1a36c0 2022-01-09 op OP_VARGS,
70 fb1a36c0 2022-01-09 op };
71 fb1a36c0 2022-01-09 op
72 fb1a36c0 2022-01-09 op struct proc;
73 fb1a36c0 2022-01-09 op
74 fb1a36c0 2022-01-09 op struct op {
75 fb1a36c0 2022-01-09 op struct op *next;
76 fb1a36c0 2022-01-09 op int type;
77 fb1a36c0 2022-01-09 op union {
78 fb1a36c0 2022-01-09 op struct {
79 fb1a36c0 2022-01-09 op char *name;
80 fb1a36c0 2022-01-09 op struct op *expr;
81 fb1a36c0 2022-01-09 op } assign;
82 fb1a36c0 2022-01-09 op struct op *assert;
83 fb1a36c0 2022-01-09 op struct {
84 fb1a36c0 2022-01-09 op struct proc *proc;
85 fb1a36c0 2022-01-09 op struct op *argv;
86 fb1a36c0 2022-01-09 op int argc;
87 fb1a36c0 2022-01-09 op } funcall;
88 fb1a36c0 2022-01-09 op struct value literal;
89 fb1a36c0 2022-01-09 op char *var;
90 fb1a36c0 2022-01-09 op struct {
91 fb1a36c0 2022-01-09 op struct op *expr;
92 fb1a36c0 2022-01-09 op int totype;
93 fb1a36c0 2022-01-09 op } cast;
94 fb1a36c0 2022-01-09 op struct {
95 fb1a36c0 2022-01-09 op struct op *a;
96 fb1a36c0 2022-01-09 op struct op *b;
97 fb1a36c0 2022-01-09 op } bin_cmp;
98 fb1a36c0 2022-01-09 op struct {
99 fb1a36c0 2022-01-09 op struct op *expr;
100 fb1a36c0 2022-01-09 op char *field;
101 fb1a36c0 2022-01-09 op } faccess;
102 fb1a36c0 2022-01-09 op struct {
103 fb1a36c0 2022-01-09 op char *msg;
104 fb1a36c0 2022-01-09 op struct op *expr;
105 fb1a36c0 2022-01-09 op } sfail;
106 fb1a36c0 2022-01-09 op } v;
107 fb1a36c0 2022-01-09 op };
108 fb1a36c0 2022-01-09 op
109 fb1a36c0 2022-01-09 op TAILQ_HEAD(bindings, binding);
110 fb1a36c0 2022-01-09 op struct binding {
111 fb1a36c0 2022-01-09 op TAILQ_ENTRY(binding) entry;
112 fb1a36c0 2022-01-09 op char *name;
113 fb1a36c0 2022-01-09 op struct value val;
114 fb1a36c0 2022-01-09 op
115 fb1a36c0 2022-01-09 op /*
116 fb1a36c0 2022-01-09 op * Hack to support varargs. We set a special variable named
117 fb1a36c0 2022-01-09 op * "..." that contains the list of ops that will evaluate to
118 fb1a36c0 2022-01-09 op * the arguments.
119 fb1a36c0 2022-01-09 op */
120 fb1a36c0 2022-01-09 op struct op *raw;
121 fb1a36c0 2022-01-09 op };
122 fb1a36c0 2022-01-09 op
123 fb1a36c0 2022-01-09 op TAILQ_HEAD(envs, env);
124 fb1a36c0 2022-01-09 op struct env {
125 fb1a36c0 2022-01-09 op TAILQ_ENTRY(env) entry;
126 fb1a36c0 2022-01-09 op struct bindings bindings;
127 fb1a36c0 2022-01-09 op };
128 fb1a36c0 2022-01-09 op
129 fb1a36c0 2022-01-09 op TAILQ_HEAD(opstacks, opstack);
130 fb1a36c0 2022-01-09 op struct opstack {
131 fb1a36c0 2022-01-09 op TAILQ_ENTRY(opstack) entry;
132 fb1a36c0 2022-01-09 op struct op base;
133 fb1a36c0 2022-01-09 op struct op *last;
134 fb1a36c0 2022-01-09 op int counter;
135 fb1a36c0 2022-01-09 op };
136 fb1a36c0 2022-01-09 op
137 fb1a36c0 2022-01-09 op TAILQ_HEAD(procs, proc);
138 fb1a36c0 2022-01-09 op struct proc {
139 fb1a36c0 2022-01-09 op TAILQ_ENTRY(proc) entry;
140 fb1a36c0 2022-01-09 op char *name;
141 fb1a36c0 2022-01-09 op int minargs;
142 fb1a36c0 2022-01-09 op int vararg;
143 fb1a36c0 2022-01-09 op char *args[MAXWELEM];
144 fb1a36c0 2022-01-09 op struct op *body;
145 fb1a36c0 2022-01-09 op int (*nativefn)(int);
146 fb1a36c0 2022-01-09 op };
147 fb1a36c0 2022-01-09 op
148 fb1a36c0 2022-01-09 op TAILQ_HEAD(tests, test);
149 fb1a36c0 2022-01-09 op struct test {
150 fb1a36c0 2022-01-09 op TAILQ_ENTRY(test) entry;
151 fb1a36c0 2022-01-09 op int shouldfail;
152 fb1a36c0 2022-01-09 op char *name;
153 fb1a36c0 2022-01-09 op struct op *body;
154 fb1a36c0 2022-01-09 op };
155 fb1a36c0 2022-01-09 op
156 fb1a36c0 2022-01-09 op enum {
157 fb1a36c0 2022-01-09 op EVAL_OK,
158 fb1a36c0 2022-01-09 op EVAL_ERR,
159 fb1a36c0 2022-01-09 op EVAL_SKIP,
160 fb1a36c0 2022-01-09 op };
161 fb1a36c0 2022-01-09 op
162 fb1a36c0 2022-01-09 op int global_set(char *, struct op *);
163 fb1a36c0 2022-01-09 op
164 fb1a36c0 2022-01-09 op struct op *newop(int);
165 fb1a36c0 2022-01-09 op void free_op_rec(struct op *);
166 fb1a36c0 2022-01-09 op void free_op(struct op *);
167 fb1a36c0 2022-01-09 op struct op *op_rest(void);
168 fb1a36c0 2022-01-09 op struct op *op_assign(char *, struct op *);
169 fb1a36c0 2022-01-09 op struct op *op_assert(struct op *);
170 fb1a36c0 2022-01-09 op struct op *op_var(char *);
171 fb1a36c0 2022-01-09 op struct op *op_lit_str(char *);
172 fb1a36c0 2022-01-09 op struct op *op_lit_num(uint64_t);
173 fb1a36c0 2022-01-09 op struct op *op_cmp_eq(struct op *, struct op *);
174 fb1a36c0 2022-01-09 op struct op *op_cmp_leq(struct op *, struct op *);
175 fb1a36c0 2022-01-09 op struct op *op_cast(struct op *, int);
176 fb1a36c0 2022-01-09 op struct op *op_faccess(struct op *, char *);
177 fb1a36c0 2022-01-09 op struct op *op_sfail(struct op *, char *);
178 fb1a36c0 2022-01-09 op struct op *op_vargs(void);
179 fb1a36c0 2022-01-09 op
180 9ded84e7 2022-05-10 op void ppf_val(FILE *, const struct value *);
181 9ded84e7 2022-05-10 op void pp_val(const struct value *);
182 fb1a36c0 2022-01-09 op const char *val_type(struct value *);
183 fb1a36c0 2022-01-09 op int val_trueish(struct value *);
184 fb1a36c0 2022-01-09 op int val_isnum(struct value *);
185 fb1a36c0 2022-01-09 op int64_t val_tonum(struct value *);
186 fb1a36c0 2022-01-09 op int val_eq(struct value *, struct value *);
187 fb1a36c0 2022-01-09 op int val_leq(struct value *, struct value *);
188 fb1a36c0 2022-01-09 op int val_cast(struct value *, int);
189 fb1a36c0 2022-01-09 op int val_faccess(struct value *, const char *, struct value *);
190 fb1a36c0 2022-01-09 op void pp_op(struct op *);
191 fb1a36c0 2022-01-09 op void pp_block(struct op *);
192 fb1a36c0 2022-01-09 op int eval(struct op *);
193 fb1a36c0 2022-01-09 op
194 fb1a36c0 2022-01-09 op /* funcall */
195 fb1a36c0 2022-01-09 op void prepare_funcall(void);
196 fb1a36c0 2022-01-09 op void push_arg(struct op *);
197 fb1a36c0 2022-01-09 op struct op *op_funcall(struct proc *);
198 fb1a36c0 2022-01-09 op
199 fb1a36c0 2022-01-09 op /* proc */
200 fb1a36c0 2022-01-09 op void add_builtin_proc(const char *name, int (*)(int), int, int);
201 fb1a36c0 2022-01-09 op void prepare_proc(void);
202 fb1a36c0 2022-01-09 op /* push_arg works on procs too */
203 fb1a36c0 2022-01-09 op int proc_setup_body(void);
204 fb1a36c0 2022-01-09 op void proc_done(char *name);
205 fb1a36c0 2022-01-09 op void block_push(struct op *);
206 fb1a36c0 2022-01-09 op struct proc *proc_by_name(const char *);
207 fb1a36c0 2022-01-09 op
208 fb1a36c0 2022-01-09 op /* testing */
209 fb1a36c0 2022-01-09 op void prepare_test(void);
210 a0ec53a2 2022-01-09 op void test_done(int, char *);
211 fb1a36c0 2022-01-09 op
212 fb1a36c0 2022-01-09 op /* np.y */
213 fb1a36c0 2022-01-09 op void loadfile(const char *);
214 fb1a36c0 2022-01-09 op
215 fb1a36c0 2022-01-09 op #endif