Blame


1 c734c0e9 2021-08-03 op /*
2 c734c0e9 2021-08-03 op * Copyright (c) 2021 Omar Polo <op@omarpolo.com>
3 c734c0e9 2021-08-03 op *
4 c734c0e9 2021-08-03 op * Permission to use, copy, modify, and distribute this software for any
5 c734c0e9 2021-08-03 op * purpose with or without fee is hereby granted, provided that the above
6 c734c0e9 2021-08-03 op * copyright notice and this permission notice appear in all copies.
7 c734c0e9 2021-08-03 op *
8 c734c0e9 2021-08-03 op * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 c734c0e9 2021-08-03 op * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 c734c0e9 2021-08-03 op * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 c734c0e9 2021-08-03 op * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 c734c0e9 2021-08-03 op * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 c734c0e9 2021-08-03 op * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 c734c0e9 2021-08-03 op * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 c734c0e9 2021-08-03 op */
16 c734c0e9 2021-08-03 op
17 c734c0e9 2021-08-03 op #ifndef SCRIPT_H
18 c734c0e9 2021-08-03 op #define SCRIPT_H
19 c734c0e9 2021-08-03 op
20 c734c0e9 2021-08-03 op #include "kamid.h"
21 c734c0e9 2021-08-03 op
22 c734c0e9 2021-08-03 op enum {
23 c734c0e9 2021-08-03 op /* literals */
24 c734c0e9 2021-08-03 op V_SYM,
25 c734c0e9 2021-08-03 op V_STR,
26 c734c0e9 2021-08-03 op V_NUM,
27 c734c0e9 2021-08-03 op
28 c734c0e9 2021-08-03 op /* foreign */
29 c734c0e9 2021-08-03 op V_QID,
30 c734c0e9 2021-08-03 op
31 c734c0e9 2021-08-03 op /* casted */
32 c734c0e9 2021-08-03 op V_U8,
33 c734c0e9 2021-08-03 op V_U16,
34 c734c0e9 2021-08-03 op V_U32,
35 c734c0e9 2021-08-03 op };
36 c734c0e9 2021-08-03 op
37 c734c0e9 2021-08-03 op struct value {
38 c734c0e9 2021-08-03 op int type;
39 c734c0e9 2021-08-03 op union {
40 c734c0e9 2021-08-03 op char *str;
41 c734c0e9 2021-08-03 op uint64_t num;
42 c734c0e9 2021-08-03 op uint8_t qid[QIDSIZE];
43 c734c0e9 2021-08-03 op } v;
44 c734c0e9 2021-08-03 op };
45 c734c0e9 2021-08-03 op
46 c734c0e9 2021-08-03 op enum {
47 c734c0e9 2021-08-03 op OP_ASSIGN,
48 c734c0e9 2021-08-03 op OP_ASSERT,
49 c734c0e9 2021-08-03 op OP_FUNCALL,
50 c734c0e9 2021-08-03 op OP_LITERAL,
51 c734c0e9 2021-08-03 op OP_VAR,
52 c734c0e9 2021-08-03 op OP_CAST,
53 c734c0e9 2021-08-03 op OP_CMP_EQ,
54 c734c0e9 2021-08-03 op };
55 c734c0e9 2021-08-03 op
56 c734c0e9 2021-08-03 op struct proc;
57 c734c0e9 2021-08-03 op
58 c734c0e9 2021-08-03 op struct op {
59 c734c0e9 2021-08-03 op struct op *next;
60 c734c0e9 2021-08-03 op int type;
61 c734c0e9 2021-08-03 op union {
62 c734c0e9 2021-08-03 op struct {
63 c734c0e9 2021-08-03 op char *name;
64 c734c0e9 2021-08-03 op struct op *expr;
65 c734c0e9 2021-08-03 op } assign;
66 c734c0e9 2021-08-03 op struct op *assert;
67 c734c0e9 2021-08-03 op struct {
68 c734c0e9 2021-08-03 op struct proc *proc;
69 c734c0e9 2021-08-03 op struct op *argv;
70 c734c0e9 2021-08-03 op int argc;
71 c734c0e9 2021-08-03 op } funcall;
72 c734c0e9 2021-08-03 op struct value literal;
73 c734c0e9 2021-08-03 op char *var;
74 c734c0e9 2021-08-03 op struct {
75 c734c0e9 2021-08-03 op struct op *expr;
76 c734c0e9 2021-08-03 op int totype;
77 c734c0e9 2021-08-03 op } cast;
78 c734c0e9 2021-08-03 op struct {
79 c734c0e9 2021-08-03 op struct op *a;
80 c734c0e9 2021-08-03 op struct op *b;
81 c734c0e9 2021-08-03 op } cmp_eq;
82 c734c0e9 2021-08-03 op } v;
83 c734c0e9 2021-08-03 op };
84 c734c0e9 2021-08-03 op
85 d9d02161 2021-08-04 op TAILQ_HEAD(opstacks, opstack);
86 d9d02161 2021-08-04 op struct opstack {
87 d9d02161 2021-08-04 op TAILQ_ENTRY(opstack) entry;
88 d9d02161 2021-08-04 op struct op base;
89 d9d02161 2021-08-04 op struct op *last;
90 d9d02161 2021-08-04 op int counter;
91 d9d02161 2021-08-04 op };
92 d9d02161 2021-08-04 op
93 c734c0e9 2021-08-03 op TAILQ_HEAD(procs, proc);
94 c734c0e9 2021-08-03 op struct proc {
95 c734c0e9 2021-08-03 op TAILQ_ENTRY(proc) entry;
96 c734c0e9 2021-08-03 op char *name;
97 c734c0e9 2021-08-03 op int minargs;
98 c734c0e9 2021-08-03 op int varargs;
99 c734c0e9 2021-08-03 op char *args[MAXWELEM];
100 c734c0e9 2021-08-03 op struct op *body;
101 c734c0e9 2021-08-03 op int (*nativefn)(int);
102 c734c0e9 2021-08-03 op };
103 c734c0e9 2021-08-03 op
104 c734c0e9 2021-08-03 op TAILQ_HEAD(tests, test);
105 c734c0e9 2021-08-03 op struct test {
106 c734c0e9 2021-08-03 op TAILQ_ENTRY(test) entry;
107 c734c0e9 2021-08-03 op char *name;
108 c734c0e9 2021-08-03 op char *dir;
109 d9d02161 2021-08-04 op struct op *body;
110 c734c0e9 2021-08-03 op };
111 c734c0e9 2021-08-03 op
112 c734c0e9 2021-08-03 op enum {
113 333d8d7d 2021-08-04 op EVAL_OK,
114 333d8d7d 2021-08-04 op EVAL_ERR,
115 333d8d7d 2021-08-04 op EVAL_SKIP,
116 c734c0e9 2021-08-03 op };
117 c734c0e9 2021-08-03 op
118 c734c0e9 2021-08-03 op void global_set(char *, struct op *);
119 c734c0e9 2021-08-03 op
120 c734c0e9 2021-08-03 op struct op *newop(int);
121 c734c0e9 2021-08-03 op void free_op(struct op *);
122 c734c0e9 2021-08-03 op struct op *op_assign(char *, struct op *);
123 c734c0e9 2021-08-03 op struct op *op_assert(struct op *);
124 c734c0e9 2021-08-03 op struct op *op_var(char *);
125 c734c0e9 2021-08-03 op struct op *op_lit_str(char *);
126 c734c0e9 2021-08-03 op struct op *op_lit_num(uint64_t);
127 c734c0e9 2021-08-03 op struct op *op_cmp_eq(struct op *, struct op *);
128 c734c0e9 2021-08-03 op struct op *op_cast(struct op *, int);
129 c734c0e9 2021-08-03 op
130 c734c0e9 2021-08-03 op void pp_val(struct value *);
131 c734c0e9 2021-08-03 op int val_trueish(struct value *);
132 c734c0e9 2021-08-03 op int val_eq(struct value *, struct value *);
133 c734c0e9 2021-08-03 op void pp_op(struct op *);
134 c734c0e9 2021-08-03 op void pp_block(struct op *);
135 c734c0e9 2021-08-03 op int eval(struct op *);
136 c734c0e9 2021-08-03 op
137 c734c0e9 2021-08-03 op /* funcall */
138 d9d02161 2021-08-04 op void prepare_funcall(void);
139 c734c0e9 2021-08-03 op void push_arg(struct op *);
140 d9d02161 2021-08-04 op struct op *op_funcall(struct proc *);
141 c734c0e9 2021-08-03 op
142 c734c0e9 2021-08-03 op /* proc */
143 c734c0e9 2021-08-03 op void add_builtin_proc(const char *name, int (*)(int));
144 d9d02161 2021-08-04 op void prepare_proc(void);
145 c734c0e9 2021-08-03 op /* push_arg works on procs too */
146 d9d02161 2021-08-04 op int proc_setup_body(void);
147 d9d02161 2021-08-04 op void proc_done(char *name);
148 c734c0e9 2021-08-03 op void block_push(struct op *);
149 c734c0e9 2021-08-03 op struct proc *proc_by_name(const char *);
150 c734c0e9 2021-08-03 op
151 c734c0e9 2021-08-03 op /* testing */
152 d9d02161 2021-08-04 op void prepare_test(void);
153 d9d02161 2021-08-04 op void test_done(char *, char *);
154 c734c0e9 2021-08-03 op
155 c734c0e9 2021-08-03 op /* np.y */
156 c734c0e9 2021-08-03 op void loadfile(const char *);
157 c734c0e9 2021-08-03 op
158 c734c0e9 2021-08-03 op #endif