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