1 /*
2  *  Abuse - dark 2D side-scrolling platform game
3  *  Copyright (c) 2005-2011 Sam Hocevar <sam@hocevar.net>
4  *
5  *  This software was released into the Public Domain. As with most public
6  *  domain software, no warranty is made or implied by Sam Hocevar.
7  */
8 
9 struct func
10 {
11     char const *name;
12     short min_args, max_args;
13 };
14 
15 /* select, digistr, load-file are not common lisp functions! */
16 
17 struct func sys_funcs[] =
18 {
19     { "print", 1, -1 }, /* 0 */
20     { "car", 1, 1 }, /* 1 */
21     { "cdr", 1, 1 }, /* 2 */
22     { "length", 0, -1 }, /* 3 */
23     { "list", 0, -1 }, /* 4 */
24     { "cons", 2, 2 }, /* 5 */
25     { "quote", 1, 1 }, /* 6 */
26     { "eq", 2, 2 }, /* 7 */
27     { "+", 0, -1 }, /* 8 */
28     { "-", 1, -1 }, /* 9 */
29     { "if", 2, 3 }, /* 10 */
30     { "setf", 2, 2 }, /* 11 */
31     { "symbol-list", 0, 0 }, /* 12 */
32     { "assoc", 2, 2 }, /* 13 */
33     { "null", 1, 1 }, /* 14 */
34     { "acons", 2, 2 }, /* 15 */
35     { "pairlis", 2, 2 }, /* 16 */
36     { "let", 1, -1 }, /* 17 */
37     { "defun", 2, -1 }, /* 18 */
38     { "atom", 1, 1 }, /* 19 */
39     { "not", 1, 1 }, /* 20 */
40     { "and", -1, -1 }, /* 21 */
41     { "or", -1, -1 }, /* 22 */
42     { "progn", -1, -1 }, /* 23 */
43     { "equal", 2, 2 }, /* 24 */
44     { "concatenate", 1, -1 }, /* 25 */
45     { "char-code", 1, 1 }, /* 26 */
46     { "code-char", 1, 1 }, /* 27 */
47     { "*", -1, -1 }, /* 28 */
48     { "/", 1, -1 }, /* 29 */
49     { "cond", -1, -1 }, /* 30 */
50     { "select", 1, -1 }, /* 31 */
51     { "function", 1, 1 }, /* 32 */
52     { "mapcar", 2, -1 }, /* 33 */
53     { "funcall", 1, -1 }, /* 34 */
54     { ">", 2, 2 }, /* 35 */
55     { "<", 2, 2 }, /* 36 */
56     { "tmp-space", 0, 0 }, /* 37 */
57     { "perm-space", 0, 0 }, /* 38 */
58     { "symbol-name", 1, 1 }, /* 39 */
59     { "trace", 0, -1 }, /* 40 */
60     { "untrace", 0, -1 }, /* 41 */
61     { "digstr", 2, 2 }, /* 42 */
62     { "compile-file", 1, 1 }, /* 43 */
63     { "abs", 1, 1 }, /* 44 */
64     { "min", 2, 2 }, /* 45 */
65     { "max", 2, 2 }, /* 46 */
66     { ">=", 2, 2 }, /* 47 */
67     { "<=", 2, 2 }, /* 48 */
68     { "backquote", 1, 1 }, /* 49 */
69     { "comma", 1, 1 }, /* 50 */
70     { "nth", 2, 2 }, /* 51 */
71     { "resize-tmp", 1, 1 }, /* 52 */
72     { "resize-perm", 1, 1 }, /* 53 */
73     { "cos", 1, 1 }, /* 54 */
74     { "sin", 1, 1 }, /* 55 */
75     { "atan2", 2, 2 }, /* 56 */
76     { "enum", 1, -1 }, /* 57 */
77     { "quit", 0, 0 }, /* 58 */
78     { "eval", 1, 1 }, /* 59 */
79     { "break", 0, 0 }, /* 60 */
80     { "mod", 2, 2 }, /* 61 */
81     { "write_profile", 1, 1 }, /* 62 */
82     { "setq", 2, 2 }, /* 63 */
83     { "for", 4, -1 }, /* 64 */
84     { "open_file", 2, -1 }, /* 65 */
85     { "load", 1, 1 }, /* 66 */
86     { "bit-and", 1, -1 }, /* 67 */
87     { "bit-or", 1, -1 }, /* 68 */
88     { "bit-xor", 1, -1 }, /* 69 */
89     { "make-array", 1, -1 }, /* 70 */
90     { "aref", 2, 2 }, /* 71 */
91     { "if-1progn", 2, 3 }, /* 72 */
92     { "if-2progn", 2, 3 }, /* 73 */
93     { "if-12progn", 2, 3 }, /* 74 */
94     { "eq0", 1, 1 }, /* 75 */
95     { "preport", 1, 1 }, /* 76 */
96     { "search", 2, 2 }, /* 77 */
97     { "elt", 2, 2 }, /* 78 */
98     { "listp", 1, 1 }, /* 79 */
99     { "numberp", 1, 1 }, /* 80 */
100     { "do", 2, 3 }, /* 81 */
101     { "gc", 0, 0 }, /* 82 */
102     { "schar", 2, 2 }, /* 83 */
103     { "symbolp", 1, 1 }, /* 84 */
104     { "num2str", 1, 1 }, /* 85 */
105     { "nconc", 2, -1 }, /* 86 */
106     { "first", 1, 1 }, /* 87 */
107     { "second", 1, 1 }, /* 88 */
108     { "third", 1, 1 }, /* 89 */
109     { "fourth", 1, 1 }, /* 90 */
110     { "fifth", 1, 1 }, /* 91 */
111     { "sixth", 1, 1 }, /* 92 */
112     { "seventh", 1, 1 }, /* 93 */
113     { "eighth", 1, 1 }, /* 94 */
114     { "ninth", 1, 1 }, /* 95 */
115     { "tenth", 1, 1 }, /* 96 */
116     { "substr", 3, 3 }, /* 97 */
117     { "local_load", 1, 1 }, /* 98 */
118 };
119 
120 enum sys_func_index
121 {
122     SYS_FUNC_PRINT = 0,
123     SYS_FUNC_CAR = 1,
124     SYS_FUNC_CDR = 2,
125     SYS_FUNC_LENGTH = 3,
126     SYS_FUNC_LIST = 4,
127     SYS_FUNC_CONS = 5,
128     SYS_FUNC_QUOTE = 6,
129     SYS_FUNC_EQ = 7,
130     SYS_FUNC_PLUS = 8,
131     SYS_FUNC_MINUS = 9,
132     SYS_FUNC_IF = 10,
133     SYS_FUNC_SETF = 11,
134     SYS_FUNC_SYMBOL_LIST = 12,
135     SYS_FUNC_ASSOC = 13,
136     SYS_FUNC_NULL = 14,
137     SYS_FUNC_ACONS = 15,
138     SYS_FUNC_PAIRLIS = 16,
139     SYS_FUNC_LET = 17,
140     SYS_FUNC_DEFUN = 18,
141     SYS_FUNC_ATOM = 19,
142     SYS_FUNC_NOT = 20,
143     SYS_FUNC_AND = 21,
144     SYS_FUNC_OR = 22,
145     SYS_FUNC_PROGN = 23,
146     SYS_FUNC_EQUAL = 24,
147     SYS_FUNC_CONCATENATE = 25,
148     SYS_FUNC_CHAR_CODE = 26,
149     SYS_FUNC_CODE_CHAR = 27,
150     SYS_FUNC_TIMES = 28,
151     SYS_FUNC_SLASH = 29,
152     SYS_FUNC_COND = 30,
153     SYS_FUNC_SELECT = 31,
154     SYS_FUNC_FUNCTION = 32,
155     SYS_FUNC_MAPCAR = 33,
156     SYS_FUNC_FUNCALL = 34,
157     SYS_FUNC_GT = 35,
158     SYS_FUNC_LT = 36,
159     SYS_FUNC_TMP_SPACE = 37,
160     SYS_FUNC_PERM_SPACE = 38,
161     SYS_FUNC_SYMBOL_NAME = 39,
162     SYS_FUNC_TRACE = 40,
163     SYS_FUNC_UNTRACE = 41,
164     SYS_FUNC_DIGSTR = 42,
165     SYS_FUNC_COMPILE_FILE = 43,
166     SYS_FUNC_ABS = 44,
167     SYS_FUNC_MIN = 45,
168     SYS_FUNC_MAX = 46,
169     SYS_FUNC_GE = 47,
170     SYS_FUNC_LE = 48,
171     SYS_FUNC_BACKQUOTE = 49,
172     SYS_FUNC_COMMA = 50,
173     SYS_FUNC_NTH = 51,
174     SYS_FUNC_RESIZE_TMP = 52,
175     SYS_FUNC_RESIZE_PERM = 53,
176     SYS_FUNC_COS = 54,
177     SYS_FUNC_SIN = 55,
178     SYS_FUNC_ATAN2 = 56,
179     SYS_FUNC_ENUM = 57,
180     SYS_FUNC_QUIT = 58,
181     SYS_FUNC_EVAL = 59,
182     SYS_FUNC_BREAK = 60,
183     SYS_FUNC_MOD = 61,
184     SYS_FUNC_WRITE_PROFILE = 62,
185     SYS_FUNC_SETQ = 63,
186     SYS_FUNC_FOR = 64,
187     SYS_FUNC_OPEN_FILE = 65,
188     SYS_FUNC_LOAD = 66,
189     SYS_FUNC_BIT_AND = 67,
190     SYS_FUNC_BIT_OR = 68,
191     SYS_FUNC_BIT_XOR = 69,
192     SYS_FUNC_MAKE_ARRAY = 70,
193     SYS_FUNC_AREF = 71,
194     SYS_FUNC_IF_1PROGN = 72,
195     SYS_FUNC_IF_2PROGN = 73,
196     SYS_FUNC_IF_12PROGN = 74,
197     SYS_FUNC_EQ0 = 75,
198     SYS_FUNC_PREPORT = 76,
199     SYS_FUNC_SEARCH = 77,
200     SYS_FUNC_ELT = 78,
201     SYS_FUNC_LISTP = 79,
202     SYS_FUNC_NUMBERP = 80,
203     SYS_FUNC_DO = 81,
204     SYS_FUNC_GC = 82,
205     SYS_FUNC_SCHAR = 83,
206     SYS_FUNC_SYMBOLP = 84,
207     SYS_FUNC_NUM2STR = 85,
208     SYS_FUNC_NCONC = 86,
209     SYS_FUNC_FIRST = 87,
210     SYS_FUNC_SECOND = 88,
211     SYS_FUNC_THIRD = 89,
212     SYS_FUNC_FOURTH = 90,
213     SYS_FUNC_FIFTH = 91,
214     SYS_FUNC_SIXTH = 92,
215     SYS_FUNC_SEVENTH = 93,
216     SYS_FUNC_EIGHTH = 94,
217     SYS_FUNC_NINTH = 95,
218     SYS_FUNC_TENTH = 96,
219     SYS_FUNC_SUBSTR = 97,
220     SYS_FUNC_LOCAL_LOAD = 98,
221 };
222 
223