source: abuse/trunk/src/lisp/lisp.h @ 483

Last change on this file since 483 was 483, checked in by Sam Hocevar, 11 years ago

lisp: move all array-related functions to the LispArray? struct.

  • Property svn:keywords set to Id
File size: 6.0 KB
RevLine 
[56]1/*
2 *  Abuse - dark 2D side-scrolling platform game
3 *  Copyright (c) 1995 Crack dot Com
4 *
5 *  This software was released into the Public Domain. As with most public
6 *  domain software, no warranty is made or implied by Crack dot Com or
7 *  Jonathan Clark.
8 */
9
[2]10#ifndef __LISP_HPP_
11#define __LISP_HPP_
12
[11]13#include <stdint.h>
14
[481]15#include "lisp_opt.h"
[2]16
17#ifdef L_PROFILE
[481]18#include "timing.h"
[2]19#endif
20
21#define Cell void
22#define MAX_LISP_TOKEN_LEN 200
23enum { PERM_SPACE,
24       TMP_SPACE,
25       USER_SPACE,
26       GC_SPACE };
27
28#define FIXED_TRIG_SIZE 360               // 360 degrees stored in table
[43]29extern int32_t sin_table[FIXED_TRIG_SIZE];   // this should be filled in by external module
[2]30#define TBS 1662                          // atan table granularity
[43]31extern uint16_t atan_table[TBS];
[2]32#define NILP(x) (x==NULL)
33#define DEFINEDP(x) (x!=l_undefined)
34class bFILE;
35extern int current_space;
36extern bFILE *current_print_file;
37
38
39enum { L_BAD_CELL,   // error catching type
[124]40       L_CONS_CELL, L_NUMBER, L_SYMBOL,     L_SYS_FUNCTION, L_USER_FUNCTION,
[2]41       L_STRING, L_CHARACTER, L_C_FUNCTION, L_C_BOOL,       L_L_FUNCTION, L_POINTER,
42       L_OBJECT_VAR, L_1D_ARRAY,
43       L_FIXED_POINT, L_COLLECTED_OBJECT };
44
[482]45typedef uint32_t ltype;    // make sure structures aren't packed differently on various compiler
[19]46                       // and sure that word, etc are word aligned
[2]47
[482]48struct LispObject
[124]49{
[482]50    ltype type;
51};
[2]52
[482]53struct LispObjectVar : LispObject
[2]54{
[482]55    long number;
56};
[2]57
[482]58struct LispList : LispObject
[2]59{
[482]60    void *cdr, *car;
61};
[2]62
[482]63struct LispNumber : LispObject
[2]64{
[482]65    long num;
66};
[2]67
[482]68struct LispRedirect : LispObject
[2]69{
[482]70    void *new_reference;
71};
72
73struct LispSymbol : LispObject
74{
[2]75#ifdef L_PROFILE
[482]76    float time_taken;
[2]77#endif
[482]78    void *value, *function, *name;
79    LispSymbol *left, *right; // tree structure
80};
[2]81
[482]82struct LispSysFunction : LispObject
[2]83{
[482]84    short min_args, max_args;
85    short fun_number;
86};
[2]87
[482]88struct LispUserFunction : LispObject
[2]89{
90#ifndef NO_LIBS
[482]91    intptr_t alist, blist;      // id for cached blocks
[2]92#else
[482]93    void *arg_list, *block_list;
[2]94#endif
[482]95};
[2]96
[482]97struct LispArray : LispObject
[2]98{
[483]99    static LispArray *Create(int size, void *rest);
100
101    inline LispObject **GetData() { return data; }
102    LispObject *Get(long x);
103
[482]104    unsigned short size;
105    // size * sizeof (void *) follows1
[483]106
107private:
108    LispObject *data[1];
[482]109};
[2]110
[482]111struct LispString : LispObject
[2]112{
[482]113};
[2]114
[482]115struct LispChar : LispObject
[2]116{
[482]117    int16_t pad;
118    uint16_t ch;
119};
[2]120
[482]121struct LispPointer : LispObject
[2]122{
[482]123    void *addr;
124};
[2]125
126
[482]127struct LispFixedPoint : LispObject
[2]128{
[482]129    int32_t x;
130};
[2]131
[482]132static inline void *&CAR(void *x) { return ((LispList *)x)->car; }
133static inline void *&CDR(void *x) { return ((LispList *)x)->cdr; }
[2]134
135void perm_space();
136void tmp_space();
137void use_user_space(void *addr, long size);
138#define item_type(c) ((c) ? *((ltype *)c) : (ltype)L_CONS_CELL)
139void *lpointer_value(void *lpointer);
[16]140int32_t lnumber_value(void *lnumber);
[2]141char *lstring_value(void *lstring);
142unsigned short lcharacter_value(void *c);
143long lfixed_point_value(void *c);
144void *lisp_atom(void *i);
145void *lcdr(void *c);
146void *lcar(void *c);
147void *lisp_eq(void *n1, void *n2);
148void *lisp_equal(void *n1, void *n2);
[482]149LispSymbol *find_symbol(char const *name);
[2]150long list_length(void *i);
151void lprint(void *i);
152void *eval(void *prog);
153void *eval_block(void *list);
[482]154void *eval_function(LispSymbol *sym, void *arg_list);
155void *eval_user_fun(LispSymbol *sym, void *arg_list);
[39]156void *compile(char const *&s);
[2]157void *symbol_value(void *symbol);
158void *symbol_function(void *symbol);
159void *set_symbol_number(void *symbol, long num);
160void *set_symbol_value(void *symbol, void *value);
161void *symbol_name(void *symbol);
162void *assoc(void *item, void *list);
163void resize_tmp(int new_size);
164void resize_perm(int new_size);
[482]165LispSymbol *make_find_symbol(char const *name);
[2]166
167void push_onto_list(void *object, void *&list);
[482]168LispSymbol *add_c_object(void *symbol, int16_t number);
169LispSymbol *add_c_function(char const *name, short min_args, short max_args, short number);
170LispSymbol *add_c_bool_fun(char const *name, short min_args, short max_args, short number);
171LispSymbol *add_lisp_function(char const *name, short min_args, short max_args, short number);
[2]172int read_ltoken(char *&s, char *buffer);
[482]173LispList *new_cons_cell();
[2]174void print_trace_stack(int max_levels);
175
176
[482]177LispNumber *new_lisp_number(long num);
178LispPointer *new_lisp_pointer(void *addr);
179LispChar *new_lisp_character(uint16_t ch);
180LispString *new_lisp_string(char const *string);
181LispString *new_lisp_string(char const *string, int length);
182LispString *new_lisp_string(int length);
183LispFixedPoint *new_lisp_fixed_point(int32_t x);
184LispObjectVar *new_lisp_object_var(int16_t number);
185LispSysFunction *new_lisp_sys_function(int min_args, int max_args, int fun_number);
186LispSysFunction *new_lisp_c_function(int min_args, int max_args, int fun_number);
187LispSysFunction *new_lisp_c_bool(int min_args, int max_args, int fun_number);
[2]188
189#ifdef NO_LIBS
[482]190LispUserFunction *new_lisp_user_function(void *arg_list, void *block_list);
[2]191#else
[482]192LispUserFunction *new_lisp_user_function(intptr_t arg_list, intptr_t block_list);
[2]193#endif
194
[482]195LispSysFunction *new_user_lisp_function(int min_args, int max_args, int fun_number);
[2]196
197int end_of_program(char *s);
198void clear_tmp();
199void lisp_init(long perm_size, long tmp_size);
200void lisp_uninit();
[482]201extern LispSymbol *lsym_root;
[2]202
[480]203extern uint8_t *space[4], *free_space[4];
[2]204extern int space_size[4];
205void *nth(int num, void *list);
[43]206int32_t lisp_atan2(int32_t dy, int32_t dx);
207int32_t lisp_sin(int32_t x);
208int32_t lisp_cos(int32_t x);
[2]209void restore_heap(void *val, int heap);
210void *mark_heap(int heap);
211
212extern "C" {
213void lbreak(const char *format, ...);
214} ;
215
216extern void clisp_init();                      // external initalizer call by lisp_init()
217extern long c_caller(long number, void *arg);  // exten c function switches on number
218extern void *l_caller(long number, void *arg);  // exten lisp function switches on number
219
220extern void *l_obj_get(long number);  // exten lisp function switches on number
221extern void l_obj_set(long number, void *arg);  // exten lisp function switches on number
222extern void l_obj_print(long number);  // exten lisp function switches on number
223
224
225
226#endif
Note: See TracBrowser for help on using the repository browser.