Use SCM_{SET_}?CELL_TYPE when accessing the type entry of a cell.
[bpt/guile.git] / libguile / symbols.h
CommitLineData
0f2d19dd
JB
1/* classes: h_files */
2
3#ifndef SYMBOLSH
4#define SYMBOLSH
7dc6e754 5/* Copyright (C) 1995,1996,1997,1998 Free Software Foundation, Inc.
0f2d19dd
JB
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2, or (at your option)
10 * any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this software; see the file COPYING. If not, write to
82892bed
JB
19 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20 * Boston, MA 02111-1307 USA
0f2d19dd
JB
21 *
22 * As a special exception, the Free Software Foundation gives permission
23 * for additional uses of the text contained in its release of GUILE.
24 *
25 * The exception is that, if you link the GUILE library with other files
26 * to produce an executable, this does not by itself cause the
27 * resulting executable to be covered by the GNU General Public License.
28 * Your use of that executable is in no way restricted on account of
29 * linking the GUILE library code into it.
30 *
31 * This exception does not however invalidate any other reasons why
32 * the executable file might be covered by the GNU General Public License.
33 *
34 * This exception applies only to the code released by the
35 * Free Software Foundation under the name GUILE. If you copy
36 * code from other Free Software Foundation releases into a copy of
37 * GUILE, as the General Public License permits, the exception does
38 * not apply to the code that you add in this way. To avoid misleading
39 * anyone as to the status of such modified files, you must delete
40 * this exception notice from them.
41 *
42 * If you write modifications of your own for GUILE, it is your choice
43 * whether to permit this exception to apply to your modifications.
82892bed 44 * If you do not wish that, delete this exception notice. */
d3a6bc94
GB
45
46/* Software engineering face-lift by Greg J. Badros, 11-Dec-1999,
47 gjb@cs.washington.edu, http://www.cs.washington.edu/homes/gjb */
0f2d19dd
JB
48\f
49
b4309c3c 50#include "libguile/__scm.h"
0f2d19dd
JB
51\f
52
53extern int scm_symhash_dim;
54
8ce94504
JB
55/* SCM_LENGTH(SYM) is the length of SYM's name in characters, and
56 SCM_CHARS(SYM) is the address of the first character of SYM's name.
57
58 Beyond that, there are two kinds of symbols: ssymbols and msymbols,
59 distinguished by the 'S' bit in the type.
60
61 Ssymbols are just uniquified strings. They have a length, chars,
62 and that's it. They use the scm_tc7_ssymbol tag (S bit clear).
63
64 Msymbols are symbols with extra slots. These slots hold a property
b7f3516f
TT
65 list and a function value (for Emacs Lisp compatibility), and a hash
66 code. They use the scm_tc7_msymbol tag.
8ce94504
JB
67
68 We'd like SCM_CHARS to work on msymbols just as it does on
69 ssymbols, so we'll have it point to the symbol's name as usual, and
70 store a pointer to the slots just before the name in memory. Thus,
71 you have to do some casting and pointer arithmetic to find the
72 slots; see the SCM_SLOTS macro.
73
74 In practice, the slots always live just before the pointer to them.
75 So why not ditch the pointer, and use negative indices to refer to
76 the slots? That's a good question; ask the author. I think it was
77 the cognac. */
78
d3a6bc94 79#define SCM_SYMBOLP(x) (SCM_NIMP(x) && (SCM_TYP7S(x)==scm_tc7_ssymbol))
0f2d19dd
JB
80#define SCM_LENGTH(x) (((unsigned long)SCM_CAR(x))>>8)
81#define SCM_LENGTH_MAX (0xffffffL)
836669b8 82#define SCM_SETLENGTH(x, v, t) SCM_SETCAR((x), ((v)<<8)+(t))
61abe7cf 83#define SCM_SETCHARS(x, v) SCM_SETCDR (x, (SCM) v)
0f2d19dd
JB
84#define SCM_CHARS(x) ((char *)(SCM_CDR(x)))
85#define SCM_UCHARS(x) ((unsigned char *)(SCM_CDR(x)))
86#define SCM_SLOTS(x) ((SCM *) (* ((SCM *)SCM_CHARS(x) - 1)))
b7f3516f 87#define SCM_SYMBOL_SLOTS 4
0f2d19dd
JB
88#define SCM_SYMBOL_FUNC(X) (SCM_SLOTS(X)[0])
89#define SCM_SYMBOL_PROPS(X) (SCM_SLOTS(X)[1])
90#define SCM_SYMBOL_HASH(X) (*(unsigned long*)(&SCM_SLOTS(X)[2]))
0f2d19dd 91
d3a6bc94
GB
92#define SCM_ROSTRINGP(x) (SCM_NIMP(x) && ((SCM_TYP7S(x)==scm_tc7_string) \
93 || (SCM_TYP7S(x) == scm_tc7_ssymbol)))
94#define SCM_ROCHARS(x) ((char *)((SCM_TYP7(x) == scm_tc7_substring) \
0f2d19dd 95 ? SCM_INUM (SCM_CADR (x)) + SCM_CHARS (SCM_CDDR (x)) \
d3a6bc94 96 : SCM_CHARS (x)))
cfaba30e 97#define SCM_ROUCHARS(x) ((unsigned char *) ((SCM_TYP7(x) == scm_tc7_substring) \
c2cb2500 98 ? SCM_INUM (SCM_CADR (x)) + SCM_UCHARS (SCM_CDDR (x))\
d3a6bc94 99 : SCM_UCHARS (x)))
0f2d19dd 100#define SCM_ROLENGTH(x) SCM_LENGTH (x)
30939477
GB
101#define SCM_SLOPPY_SUBSTRP(x) (SCM_TYP7(x) == scm_tc7_substring)
102#define SCM_SUBSTRP(x) (SCM_NIMP(x) && SCM_SLOPPY_SUBSTRP(x))
0f2d19dd
JB
103#define SCM_SUBSTR_STR(x) (SCM_CDDR (x))
104#define SCM_SUBSTR_OFFSET(x) (SCM_CADR (x))
105
89958ad0
JB
106#define SCM_COERCE_SUBSTR(x) { if (SCM_SUBSTRP (x)) \
107 x = scm_makfromstr (SCM_ROCHARS (x), \
108 SCM_ROLENGTH (x), 0); }
0f2d19dd
JB
109
110\f
0f2d19dd 111
95c9e176 112extern unsigned long scm_strhash (const unsigned char *str, scm_sizet len, unsigned long n);
7866a09b
GB
113extern SCM scm_sym2vcell (SCM sym, SCM thunk, SCM definep);
114extern SCM scm_sym2ovcell_soft (SCM sym, SCM obarray);
115extern SCM scm_sym2ovcell (SCM sym, SCM obarray);
116extern SCM scm_intern_obarray_soft (const char *name, scm_sizet len, SCM obarray, int softness);
117extern SCM scm_intern_obarray (const char *name, scm_sizet len, SCM obarray);
118extern SCM scm_intern (const char *name, scm_sizet len);
119extern SCM scm_intern0 (const char * name);
120extern SCM scm_sysintern (const char *name, SCM val);
121extern SCM scm_sysintern0 (const char *name);
122extern SCM scm_sysintern0_no_module_lookup (const char *name);
123extern SCM scm_symbol_value0 (const char *name);
124extern SCM scm_symbol_p (SCM x);
125extern SCM scm_symbol_to_string (SCM s);
126extern SCM scm_string_to_symbol (SCM s);
127extern SCM scm_string_to_obarray_symbol (SCM o, SCM s, SCM softp);
128extern SCM scm_intern_symbol (SCM o, SCM s);
129extern SCM scm_unintern_symbol (SCM o, SCM s);
130extern SCM scm_symbol_binding (SCM o, SCM s);
131extern SCM scm_symbol_interned_p (SCM o, SCM s);
132extern SCM scm_symbol_bound_p (SCM o, SCM s);
133extern SCM scm_symbol_set_x (SCM o, SCM s, SCM v);
134extern SCM scm_symbol_fref (SCM s);
135extern SCM scm_symbol_pref (SCM s);
136extern SCM scm_symbol_fset_x (SCM s, SCM val);
137extern SCM scm_symbol_pset_x (SCM s, SCM val);
138extern SCM scm_symbol_hash (SCM s);
139extern SCM scm_builtin_bindings (void);
140extern SCM scm_builtin_weak_bindings (void);
141extern SCM scm_gensym (SCM name, SCM obarray);
142extern void scm_init_symbols (void);
0f2d19dd 143
9b8d3288
MV
144extern int scm_can_use_top_level_lookup_closure_var;
145
0f2d19dd 146#endif /* SYMBOLSH */
89e00824
ML
147
148/*
149 Local Variables:
150 c-file-style: "gnu"
151 End:
152*/