1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22: #ifndef EMACS_LISP_H
23: #define EMACS_LISP_H
24:
25:
26: #if defined (PROTOTYPES) || defined (WINDOWSNT)
27: #define P_(proto) proto
28: #else
29: #define P_(proto) ()
30: #endif
31:
32: #if 0
33:
34:
35:
36:
37: #define GC_CHECK_STRING_BYTES 1
38:
39:
40:
41: #define GC_CHECK_STRING_OVERRUN 1
42:
43:
44:
45: #define GC_CHECK_STRING_FREE_LIST 1
46:
47:
48:
49: #define XMALLOC_OVERRUN_CHECK 1
50:
51:
52:
53:
54: #endif
55:
56: #ifdef GC_CHECK_CONS_LIST
57: #define CHECK_CONS_LIST() check_cons_list()
58: #else
59: #define CHECK_CONS_LIST() 0
60: #endif
61:
62:
63: #ifdef _LP64
64: #ifndef EMACS_INT
65: #define EMACS_INT long
66: #define BITS_PER_EMACS_INT BITS_PER_LONG
67: #endif
68: #ifndef EMACS_UINT
69: #define EMACS_UINT unsigned long
70: #endif
71: #else
72: #ifndef EMACS_INT
73: #define EMACS_INT int
74: #define BITS_PER_EMACS_INT BITS_PER_INT
75: #endif
76: #ifndef EMACS_UINT
77: #define EMACS_UINT unsigned int
78: #endif
79: #endif
80:
81:
82: extern int suppress_checking;
83: extern void die P_((const char *, const char *, int)) NO_RETURN;
84:
85: #ifdef ENABLE_CHECKING
86:
87: #define CHECK(check,msg) (((check) || suppress_checking \
88: ? (void) 0 \
89: : die ((msg), __FILE__, __LINE__)), \
90: 0)
91: #else
92:
93:
94: #define CHECK(check,msg) ((check),0)
95:
96: #endif
97:
98:
99:
100:
101: #ifdef USE_LISP_UNION_TYPE
102: #undef NO_UNION_TYPE
103: #endif
104:
105:
106:
107: #ifndef ENABLE_CHECKING
108: #define eassert(X) (void) 0
109: #else
110: #if defined (__GNUC__) && __GNUC__ >= 2 && defined (__STDC__)
111: #define eassert(cond) CHECK(cond,"assertion failed: " #cond)
112: #else
113: #define eassert(cond) CHECK(cond,"assertion failed")
114: #endif
115: #endif
116:
117:
118:
119:
120:
121: enum Lisp_Type
122: {
123:
124: Lisp_Int,
125:
126:
127: Lisp_Symbol,
128:
129:
130:
131: Lisp_Misc,
132:
133:
134:
135: Lisp_String,
136:
137:
138:
139:
140:
141: Lisp_Vectorlike,
142:
143:
144: Lisp_Cons,
145:
146: Lisp_Float,
147:
148:
149: Lisp_Type_Limit
150: };
151:
152:
153:
154:
155:
156:
157: enum Lisp_Misc_Type
158: {
159: Lisp_Misc_Free = 0x5eab,
160: Lisp_Misc_Marker,
161: Lisp_Misc_Intfwd,
162: Lisp_Misc_Boolfwd,
163: Lisp_Misc_Objfwd,
164: Lisp_Misc_Buffer_Objfwd,
165: Lisp_Misc_Buffer_Local_Value,
166: Lisp_Misc_Some_Buffer_Local_Value,
167: Lisp_Misc_Overlay,
168: Lisp_Misc_Kboard_Objfwd,
169: Lisp_Misc_Save_Value,
170:
171:
172: Lisp_Misc_Float,
173:
174: Lisp_Misc_Limit
175: };
176:
177: #ifndef GCTYPEBITS
178: #define GCTYPEBITS 3
179: #endif
180:
181:
182: #ifndef VALBITS
183: #define VALBITS (BITS_PER_EMACS_INT - GCTYPEBITS)
184: #endif
185:
186: #ifndef NO_UNION_TYPE
187:
188: #ifndef WORDS_BIG_ENDIAN
189:
190:
191:
192: typedef
193: union Lisp_Object
194: {
195:
196:
197: EMACS_INT i;
198:
199: struct
200: {
201: EMACS_INT val : VALBITS;
202: enum Lisp_Type type : GCTYPEBITS;
203: } s;
204: struct
205: {
206: EMACS_UINT val : VALBITS;
207: enum Lisp_Type type : GCTYPEBITS;
208: } u;
209: }
210: Lisp_Object;
211:
212: #else
213:
214: typedef
215: union Lisp_Object
216: {
217:
218:
219: EMACS_INT i;
220:
221: struct
222: {
223: enum Lisp_Type type : GCTYPEBITS;
224: EMACS_INT val : VALBITS;
225: } s;
226: struct
227: {
228: enum Lisp_Type type : GCTYPEBITS;
229: EMACS_UINT val : VALBITS;
230: } u;
231: }
232: Lisp_Object;
233:
234: #endif
235:
236: #ifdef __GNUC__
237: static __inline__ Lisp_Object
238: LISP_MAKE_RVALUE (Lisp_Object o)
239: {
240: return o;
241: }
242: #else
243:
244:
245:
246:
247: #define LISP_MAKE_RVALUE(o) (o)
248: #endif
249:
250: #endif
251:
252:
253:
254:
255: #ifdef NO_UNION_TYPE
256: typedef EMACS_INT Lisp_Object;
257: #define LISP_MAKE_RVALUE(o) (0+(o))
258: #endif
259:
260:
261:
262:
263:
264:
265: #ifndef ARRAY_MARK_FLAG
266: #define ARRAY_MARK_FLAG ((EMACS_INT) ((EMACS_UINT) 1 << (VALBITS + GCTYPEBITS - 1)))
267: #endif
268:
269:
270:
271: #ifndef PSEUDOVECTOR_FLAG
272: #define PSEUDOVECTOR_FLAG ((ARRAY_MARK_FLAG >> 1) & ~ARRAY_MARK_FLAG)
273: #endif
274:
275:
276:
277:
278: enum pvec_type
279: {
280: PVEC_NORMAL_VECTOR = 0,
281: PVEC_PROCESS = 0x200,
282: PVEC_FRAME = 0x400,
283: PVEC_COMPILED = 0x800,
284: PVEC_WINDOW = 0x1000,
285: PVEC_WINDOW_CONFIGURATION = 0x2000,
286: PVEC_SUBR = 0x4000,
287: PVEC_CHAR_TABLE = 0x8000,
288: PVEC_BOOL_VECTOR = 0x10000,
289: PVEC_BUFFER = 0x20000,
290: PVEC_HASH_TABLE = 0x40000,
291: PVEC_TYPE_MASK = 0x7fe00
292:
293: #if 0
294:
295:
296: PVEC_FLAG = PSEUDOVECTOR_FLAG
297: #endif
298: };
299:
300:
301:
302:
303:
304:
305: #define PSEUDOVECTOR_SIZE_MASK 0x1ff
306:
307:
308:
309: #define BOOL_VECTOR_BITS_PER_CHAR 8
310: ^L
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332: #ifndef NO_DECL_ALIGN
333: # ifndef DECL_ALIGN
334:
335: # if defined (__GNUC__)
336: # define DECL_ALIGN(type, var) \
337: type __attribute__ ((__aligned__ (1 << GCTYPEBITS))) var
338: # endif
339: # endif
340: #endif
341:
342:
343: #if defined GNU_MALLOC || defined DOUG_LEA_MALLOC || defined __GLIBC__ || defined MAC_OSX
344:
345: # if defined DECL_ALIGN
346:
347: # if defined NO_UNION_TYPE
348: # define USE_LSB_TAG
349: # endif
350: # endif
351: #endif
352:
353:
354: #ifndef DECL_ALIGN
355: # ifdef USE_LSB_TAG
356: # error "USE_LSB_TAG used without defining DECL_ALIGN"
357: # endif
358: # define DECL_ALIGN(type, var) type var
359: #endif
360:
361: ^L
362:
363:
364:
365:
366: #ifdef NO_UNION_TYPE
367:
368: #ifdef USE_LSB_TAG
369:
370: #define TYPEMASK ((((EMACS_INT) 1) << GCTYPEBITS) - 1)
371: #define XTYPE(a) ((enum Lisp_Type) (((EMACS_UINT) (a)) & TYPEMASK))
372: #define XINT(a) (((EMACS_INT) (a)) >> GCTYPEBITS)
373: #define XUINT(a) (((EMACS_UINT) (a)) >> GCTYPEBITS)
374: #define XSET(var, type, ptr) \
375: (eassert (XTYPE (ptr) == 0), \
376: (var) = ((EMACS_INT) (type)) | ((EMACS_INT) (ptr)))
377: #define make_number(N) (((EMACS_INT) (N)) << GCTYPEBITS)
378:
379:
380:
381:
382: #define XFASTINT(a) XINT (a)
383: #define XSETFASTINT(a, b) ((a) = make_number (b))
384:
385: #define XPNTR(a) ((EMACS_INT) ((a) & ~TYPEMASK))
386:
387: #else
388:
389: #define VALMASK ((((EMACS_INT) 1) << VALBITS) - 1)
390:
391:
392:
393:
394:
395: #define XTYPE(a) ((enum Lisp_Type) (((EMACS_UINT) (a)) >> VALBITS))
396:
397:
398:
399:
400: #define XFASTINT(a) ((a) + 0)
401: #define XSETFASTINT(a, b) ((a) = (b))
402:
403:
404:
405: #ifndef XINT
406: #define XINT(a) ((((EMACS_INT) (a)) << (BITS_PER_EMACS_INT - VALBITS)) \
407: >> (BITS_PER_EMACS_INT - VALBITS))
408: #endif
409:
410:
411:
412:
413: #ifndef XUINT
414: #define XUINT(a) ((EMACS_UINT) ((a) & VALMASK))
415: #endif
416:
417: #ifndef XSET
418: #define XSET(var, type, ptr) \
419: ((var) = ((EMACS_INT)(type) << VALBITS) + ((EMACS_INT) (ptr) & VALMASK))
420: #endif
421:
422:
423:
424: #define make_number(N) \
425: ((((EMACS_INT) (N)) & VALMASK) | ((EMACS_INT) Lisp_Int) << VALBITS)
426:
427: #endif
428:
429: #define EQ(x, y) ((x) == (y))
430:
431: #else
432:
433: #define XTYPE(a) ((enum Lisp_Type) (a).u.type)
434:
435:
436:
437:
438: #define XFASTINT(a) ((a).i + 0)
439: #define XSETFASTINT(a, b) ((a).i = (b))
440:
441: #ifdef EXPLICIT_SIGN_EXTEND
442:
443: #define XINT(a) (((a).s.val << (BITS_PER_EMACS_INT - VALBITS)) \
444: >> (BITS_PER_EMACS_INT - VALBITS))
445: #else
446: #define XINT(a) ((a).s.val)
447: #endif
448:
449: #define XUINT(a) ((a).u.val)
450:
451: #define XSET(var, vartype, ptr) \
452: (((var).s.val = ((EMACS_INT) (ptr))), ((var).s.type = ((char) (vartype))))
453:
454: #if __GNUC__ >= 2 && defined (__OPTIMIZE__)
455: #define make_number(N) \
456: (__extension__ ({ Lisp_Object _l; _l.s.val = (N); _l.s.type = Lisp_Int; _l; }))
457: #else
458: extern Lisp_Object make_number P_ ((EMACS_INT));
459: #endif
460:
461: #define EQ(x, y) ((x).i == (y).i)
462:
463: #endif
464:
465:
466:
467:
468:
469:
470:
471: #ifndef XGCTYPE
472:
473: #define XGCTYPE(a) XTYPE (a)
474: #endif
475:
476: #ifndef XPNTR
477: #ifdef HAVE_SHM
478:
479: extern size_t pure_size;
480: #define XPNTR(a) \
481: (XUINT (a) | (XUINT (a) > pure_size ? DATA_SEG_BITS : PURE_SEG_BITS))
482: #else
483: #ifdef DATA_SEG_BITS
484:
485:
486:
487:
488:
489: #define XPNTR(a) (XUINT (a) | DATA_SEG_BITS)
490: #else
491:
492:
493:
494:
495: #define XPNTR(a) ((EMACS_INT) XUINT (a))
496: #endif
497: #endif
498: #endif
499:
500:
501:
502:
503: #define MOST_NEGATIVE_FIXNUM - ((EMACS_INT) 1 << (VALBITS - 1))
504: #define MOST_POSITIVE_FIXNUM (((EMACS_INT) 1 << (VALBITS - 1)) - 1)
505:
506:
507: #define INTMASK ((((EMACS_INT) 1) << VALBITS) - 1)
508:
509:
510:
511: #define FIXNUM_OVERFLOW_P(i) \
512: ((EMACS_INT)(i) > MOST_POSITIVE_FIXNUM \
513: || (EMACS_INT) (i) < MOST_NEGATIVE_FIXNUM)
514:
515:
516:
517: #define XCONS(a) (eassert (GC_CONSP(a)),(struct Lisp_Cons *) XPNTR(a))
518: #define XVECTOR(a) (eassert (GC_VECTORLIKEP(a)),(struct Lisp_Vector *) XPNTR(a))
519: #define XSTRING(a) (eassert (GC_STRINGP(a)),(struct Lisp_String *) XPNTR(a))
520: #define XSYMBOL(a) (eassert (GC_SYMBOLP(a)),(struct Lisp_Symbol *) XPNTR(a))
521: #define XFLOAT(a) (eassert (GC_FLOATP(a)),(struct Lisp_Float *) XPNTR(a))
522:
523:
524:
525: #define XMISC(a) ((union Lisp_Misc *) XPNTR(a))
526: #define XMISCTYPE(a) (XMARKER (a)->type)
527: #define XMARKER(a) (&(XMISC(a)->u_marker))
528: #define XINTFWD(a) (&(XMISC(a)->u_intfwd))
529: #define XBOOLFWD(a) (&(XMISC(a)->u_boolfwd))
530: #define XOBJFWD(a) (&(XMISC(a)->u_objfwd))
531: #define XBUFFER_OBJFWD(a) (&(XMISC(a)->u_buffer_objfwd))
532: #define XBUFFER_LOCAL_VALUE(a) (&(XMISC(a)->u_buffer_local_value))
533: #define XOVERLAY(a) (&(XMISC(a)->u_overlay))
534: #define XKBOARD_OBJFWD(a) (&(XMISC(a)->u_kboard_objfwd))
535: #define XSAVE_VALUE(a) (&(XMISC(a)->u_save_value))
536:
537:
538:
539: #define XPROCESS(a) (eassert (GC_PROCESSP(a)),(struct Lisp_Process *) XPNTR(a))
540: #define XWINDOW(a) (eassert (GC_WINDOWP(a)),(struct window *) XPNTR(a))
541: #define XSUBR(a) (eassert (GC_SUBRP(a)),(struct Lisp_Subr *) XPNTR(a))
542: #define XBUFFER(a) (eassert (GC_BUFFERP(a)),(struct buffer *) XPNTR(a))
543: #define XCHAR_TABLE(a) ((struct Lisp_Char_Table *) XPNTR(a))
544: #define XBOOL_VECTOR(a) ((struct Lisp_Bool_Vector *) XPNTR(a))
545:
546:
547:
548: #define XSETINT(a, b) (a) = make_number (b)
549: #define XSETCONS(a, b) XSET (a, Lisp_Cons, b)
550: #define XSETVECTOR(a, b) XSET (a, Lisp_Vectorlike, b)