1 /* xldmem.h - dynamic memory definitions */
2 /*	Copyright (c) 1987, by David Michael Betz
3         All Rights Reserved
4         Permission is granted for unrestricted non-commercial use	*/
5 
6 /* small fixnum range */
7 #define SFIXMIN		(-128)
8 #define SFIXMAX		255
9 #define SFIXSIZE	384
10 
11 /* character range */
12 #define CHARMIN		0
13 #define CHARMAX		255
14 #define CHARSIZE	256
15 
16 /* new node access macros */
17 #define ntype(x)	((x)->n_type)
18 
19 /* cons access macros */
20 #define car(x)		((x)->n_car)
21 #define cdr(x)		((x)->n_cdr)
22 #define rplaca(x,y)	((x)->n_car = (y))
23 #define rplacd(x,y)	((x)->n_cdr = (y))
24 
25 /* symbol access macros */
26 #define getvalue(x)	 ((x)->n_vdata[0])
27 #define setvalue(x,v)	 ((x)->n_vdata[0] = (v))
28 #define getfunction(x)	 ((x)->n_vdata[1])
29 #define setfunction(x,v) ((x)->n_vdata[1] = (v))
30 #define getplist(x)	 ((x)->n_vdata[2])
31 #define setplist(x,v)	 ((x)->n_vdata[2] = (v))
32 #define getpname(x)	 ((x)->n_vdata[3])
33 #define setpname(x,v)	 ((x)->n_vdata[3] = (v))
34 #define SYMSIZE		4
35 
36 /* closure access macros */
37 #define getname(x)     	((x)->n_vdata[0])
38 #define setname(x,v)   	((x)->n_vdata[0] = (v))
39 #define gettype(x)    	((x)->n_vdata[1])
40 #define settype(x,v)  	((x)->n_vdata[1] = (v))
41 #define getargs(x)     	((x)->n_vdata[2])
42 #define setargs(x,v)   	((x)->n_vdata[2] = (v))
43 #define getoargs(x)    	((x)->n_vdata[3])
44 #define setoargs(x,v)  	((x)->n_vdata[3] = (v))
45 #define getrest(x)     	((x)->n_vdata[4])
46 #define setrest(x,v)   	((x)->n_vdata[4] = (v))
47 #define getkargs(x)    	((x)->n_vdata[5])
48 #define setkargs(x,v)  	((x)->n_vdata[5] = (v))
49 #define getaargs(x)    	((x)->n_vdata[6])
50 #define setaargs(x,v)  	((x)->n_vdata[6] = (v))
51 #define getbody(x)     	((x)->n_vdata[7])
52 #define setbody(x,v)   	((x)->n_vdata[7] = (v))
53 /* use closure_getenv to avoid Unix getenv conflict */
54 #define closure_getenv(x)	((x)->n_vdata[8])
55 #define setenv(x,v)	((x)->n_vdata[8] = (v))
56 #define getfenv(x)	((x)->n_vdata[9])
57 #define setfenv(x,v)	((x)->n_vdata[9] = (v))
58 #define getlambda(x)	((x)->n_vdata[10])
59 #define setlambda(x,v)	((x)->n_vdata[10] = (v))
60 #define CLOSIZE		11
61 
62 /* vector access macros */
63 #define getsize(x)	((x)->n_vsize)
64 #define getelement(x,i)	((x)->n_vdata[i])
65 #define setelement(x,i,v) ((x)->n_vdata[i] = (v))
66 
67 /* object access macros */
68 #define getclass(x)	((x)->n_vdata[0])
69 #define getivar(x,i)	((x)->n_vdata[i+1])
70 #define setivar(x,i,v)	((x)->n_vdata[i+1] = (v))
71 
72 /* subr/fsubr access macros */
73 #define getsubr(x)	((x)->n_subr)
74 #define getoffset(x)	((x)->n_offset)
75 
76 /* fixnum/flonum/char access macros */
77 #define getfixnum(x)    ((x)->n_fixnum)
78 #define getflonum(x)	((x)->n_flonum)
79 #define getchcode(x)	((x)->n_chcode)
80 
81 /* string access macros */
82 #define getstring(x)	((x)->n_string)
83 #define getslength(x)	((x)->n_strlen)
84 
85 /* file stream access macros */
86 #define getfile(x)	((x)->n_fp)
87 #define setfile(x,v)	((x)->n_fp = (v))
88 #define getsavech(x)	((x)->n_savech)
89 #define setsavech(x,v)	((x)->n_savech = (v))
90 
91 /* unnamed stream access macros */
92 #define gethead(x)	((x)->n_car)
93 #define sethead(x,v)	((x)->n_car = (v))
94 #define gettail(x)	((x)->n_cdr)
95 #define settail(x,v)	((x)->n_cdr = (v))
96 
97 /* extern access macros */
98 #define getdesc(x)	((x)->n_desc)
99 #define setdesc(x,d)	((x)->n_desc = (d))
100 #define getinst(x)	((x)->n_inst)
101 #define setinst(x,i)	((x)->n_inst = (i))
102 
103 /* node types */
104 #define FREE_NODE	0
105 #define SUBR	1
106 #define FSUBR	2
107 #define CONS	3
108 #define SYMBOL	4
109 #define FIXNUM	5
110 #define FLONUM	6
111 #define STRING	7
112 #define OBJECT	8
113 #define STREAM	9
114 #define VECTOR	10
115 #define CLOSURE	11
116 #define CHAR	12
117 #define USTREAM	13
118 #define EXTERN  14
119 
120 /* node flags */
121 #define WATCH   4
122 
123 /* subr/fsubr node */
124 #define n_subr		n_info.n_xsubr.xs_subr
125 #define n_offset	n_info.n_xsubr.xs_offset
126 
127 /* cons node */
128 #define n_car		n_info.n_xcons.xc_car
129 #define n_cdr		n_info.n_xcons.xc_cdr
130 
131 /* fixnum node */
132 #define n_fixnum	n_info.n_xfixnum.xf_fixnum
133 
134 /* flonum node */
135 #define n_flonum	n_info.n_xflonum.xf_flonum
136 /* character node */
137 #define n_chcode	n_info.n_xchar.xc_chcode
138 
139 /* string node */
140 #define n_string	n_info.n_xstring.xs_string
141 #define n_strlen	n_info.n_xstring.xs_length
142 
143 /* stream node */
144 #define n_fp		n_info.n_xstream.xs_fp
145 #define n_savech	n_info.n_xstream.xs_savech
146 
147 /* vector/object node */
148 #define n_vsize		n_info.n_xvector.xv_size
149 #define n_vdata		n_info.n_xvector.xv_data
150 
151 /* extern node */
152 #define n_desc		n_info.n_xextern.xe_desc
153 #define n_inst		n_info.n_xextern.xe_inst
154 
155 struct node;
156 
157 /* xtype_desc structure */
158 typedef struct xtype_desc_struct {
159     char *type_name;
160     struct node *type_symbol;
161     void (*free_meth)(void*);
162     void (*print_meth)(struct node *, void*);
163     void (*save_meth)(FILE*, void*);
164     unsigned char * (*restore_meth)(FILE*);
165     void (*mark_meth)(void*);
166 } *xtype_desc;
167 
168 /* node structure */
169 typedef struct node {
170     char n_type;		/* type of node */
171     char n_flags;		/* flag bits */
172     union ninfo { 		/* value */
173         struct xsubr {		/* subr/fsubr node */
174             struct node *(*xs_subr)(void);	/* function pointer */
175             int xs_offset;		/* offset into funtab */
176         } n_xsubr;
177         struct xcons {		/* cons node */
178             struct node *xc_car;	/* the car pointer */
179             struct node *xc_cdr;	/* the cdr pointer */
180         } n_xcons;
181         struct xfixnum {	/* fixnum node */
182             FIXTYPE xf_fixnum;		/* fixnum value */
183         } n_xfixnum;
184         struct xflonum {	/* flonum node */
185             FLOTYPE xf_flonum;		/* flonum value */
186         } n_xflonum;
187         struct xchar {		/* character node */
188             int xc_chcode;		/* character code */
189         } n_xchar;
190         struct xstring {	/* string node */
191             int xs_length;		/* string length */
192             unsigned char *xs_string;	/* string pointer */
193         } n_xstring;
194         struct xstream { 	/* stream node */
195             FILE *xs_fp;		/* the file pointer */
196             int xs_savech;		/* lookahead character */
197         } n_xstream;
198         struct xvector {	/* vector/object/symbol/structure node */
199             int xv_size;		/* vector size */
200             struct node **xv_data;	/* vector data */
201         } n_xvector;
202         struct xextern {	/* external data type */
203             struct xtype_desc_struct *xe_desc;	/* ptr to type descriptor */
204             unsigned char *xe_inst;		/* pointer to external data */
205         } n_xextern;
206     } n_info;
207 } *LVAL;
208 
209 /* memory segment structure definition */
210 typedef struct segment {
211     int sg_size;
212     struct segment *sg_next;
213     struct node sg_nodes[1];
214 } SEGMENT;
215 
216