* slib.scm (library-vicinity, home-vicinity,
[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. */
0f2d19dd
JB
45\f
46
b4309c3c 47#include "libguile/__scm.h"
0f2d19dd
JB
48\f
49
50extern int scm_symhash_dim;
51
8ce94504
JB
52/* SCM_LENGTH(SYM) is the length of SYM's name in characters, and
53 SCM_CHARS(SYM) is the address of the first character of SYM's name.
54
55 Beyond that, there are two kinds of symbols: ssymbols and msymbols,
56 distinguished by the 'S' bit in the type.
57
58 Ssymbols are just uniquified strings. They have a length, chars,
59 and that's it. They use the scm_tc7_ssymbol tag (S bit clear).
60
61 Msymbols are symbols with extra slots. These slots hold a property
b7f3516f
TT
62 list and a function value (for Emacs Lisp compatibility), and a hash
63 code. They use the scm_tc7_msymbol tag.
8ce94504
JB
64
65 We'd like SCM_CHARS to work on msymbols just as it does on
66 ssymbols, so we'll have it point to the symbol's name as usual, and
67 store a pointer to the slots just before the name in memory. Thus,
68 you have to do some casting and pointer arithmetic to find the
69 slots; see the SCM_SLOTS macro.
70
71 In practice, the slots always live just before the pointer to them.
72 So why not ditch the pointer, and use negative indices to refer to
73 the slots? That's a good question; ask the author. I think it was
74 the cognac. */
75
0f2d19dd
JB
76#define SCM_SYMBOLP(x) (SCM_TYP7S(x)==scm_tc7_ssymbol)
77#define SCM_LENGTH(x) (((unsigned long)SCM_CAR(x))>>8)
78#define SCM_LENGTH_MAX (0xffffffL)
836669b8 79#define SCM_SETLENGTH(x, v, t) SCM_SETCAR((x), ((v)<<8)+(t))
0f2d19dd
JB
80#define SCM_SETCHARS SCM_SETCDR
81#define SCM_CHARS(x) ((char *)(SCM_CDR(x)))
82#define SCM_UCHARS(x) ((unsigned char *)(SCM_CDR(x)))
83#define SCM_SLOTS(x) ((SCM *) (* ((SCM *)SCM_CHARS(x) - 1)))
b7f3516f 84#define SCM_SYMBOL_SLOTS 4
0f2d19dd
JB
85#define SCM_SYMBOL_FUNC(X) (SCM_SLOTS(X)[0])
86#define SCM_SYMBOL_PROPS(X) (SCM_SLOTS(X)[1])
87#define SCM_SYMBOL_HASH(X) (*(unsigned long*)(&SCM_SLOTS(X)[2]))
0f2d19dd 88
c2cb2500
JB
89#define SCM_ROSTRINGP(x) ((SCM_TYP7S(x)==scm_tc7_string) \
90 || (SCM_TYP7S(x) == scm_tc7_ssymbol))
0f2d19dd
JB
91#define SCM_ROCHARS(x) ((SCM_TYP7(x) == scm_tc7_substring) \
92 ? SCM_INUM (SCM_CADR (x)) + SCM_CHARS (SCM_CDDR (x)) \
93 : SCM_CHARS (x))
94#define SCM_ROUCHARS(x) ((SCM_TYP7(x) == scm_tc7_substring) \
c2cb2500 95 ? SCM_INUM (SCM_CADR (x)) + SCM_UCHARS (SCM_CDDR (x))\
0f2d19dd
JB
96 : SCM_UCHARS (x))
97#define SCM_ROLENGTH(x) SCM_LENGTH (x)
c2cb2500 98#define SCM_SUBSTRP(x) ((SCM_TYP7(x) == scm_tc7_substring))
0f2d19dd
JB
99#define SCM_SUBSTR_STR(x) (SCM_CDDR (x))
100#define SCM_SUBSTR_OFFSET(x) (SCM_CADR (x))
101
89958ad0
JB
102#define SCM_COERCE_SUBSTR(x) { if (SCM_SUBSTRP (x)) \
103 x = scm_makfromstr (SCM_ROCHARS (x), \
104 SCM_ROLENGTH (x), 0); }
0f2d19dd
JB
105
106\f
0f2d19dd 107
1cc91f1b
JB
108extern unsigned long scm_strhash SCM_P ((unsigned char *str, scm_sizet len, unsigned long n));
109extern SCM scm_sym2vcell SCM_P ((SCM sym, SCM thunk, SCM definep));
110extern SCM scm_sym2ovcell_soft SCM_P ((SCM sym, SCM obarray));
111extern SCM scm_sym2ovcell SCM_P ((SCM sym, SCM obarray));
3eeba8d4
JB
112extern SCM scm_intern_obarray_soft SCM_P ((const char *name, scm_sizet len, SCM obarray, int softness));
113extern SCM scm_intern_obarray SCM_P ((const char *name, scm_sizet len, SCM obarray));
114extern SCM scm_intern SCM_P ((const char *name, scm_sizet len));
115extern SCM scm_intern0 SCM_P ((const char * name));
116extern SCM scm_sysintern SCM_P ((const char *name, SCM val));
117extern SCM scm_sysintern0 SCM_P ((const char *name));
118extern SCM scm_sysintern0_no_module_lookup SCM_P ((const char *name));
119extern SCM scm_symbol_value0 SCM_P ((const char *name));
1cc91f1b
JB
120extern SCM scm_symbol_p SCM_P ((SCM x));
121extern SCM scm_symbol_to_string SCM_P ((SCM s));
122extern SCM scm_string_to_symbol SCM_P ((SCM s));
123extern SCM scm_string_to_obarray_symbol SCM_P ((SCM o, SCM s, SCM softp));
124extern SCM scm_intern_symbol SCM_P ((SCM o, SCM s));
125extern SCM scm_unintern_symbol SCM_P ((SCM o, SCM s));
126extern SCM scm_symbol_binding SCM_P ((SCM o, SCM s));
127extern SCM scm_symbol_interned_p SCM_P ((SCM o, SCM s));
128extern SCM scm_symbol_bound_p SCM_P ((SCM o, SCM s));
129extern SCM scm_symbol_set_x SCM_P ((SCM o, SCM s, SCM v));
130extern SCM scm_symbol_fref SCM_P ((SCM s));
131extern SCM scm_symbol_pref SCM_P ((SCM s));
132extern SCM scm_symbol_fset_x SCM_P ((SCM s, SCM val));
133extern SCM scm_symbol_pset_x SCM_P ((SCM s, SCM val));
134extern SCM scm_symbol_hash SCM_P ((SCM s));
1ff4df7a
MD
135extern SCM scm_builtin_bindings SCM_P ((void));
136extern SCM scm_builtin_weak_bindings SCM_P ((void));
137extern SCM scm_gensym SCM_P ((SCM name, SCM obarray));
1cc91f1b 138extern void scm_init_symbols SCM_P ((void));
0f2d19dd 139
9b8d3288
MV
140extern int scm_can_use_top_level_lookup_closure_var;
141
0f2d19dd 142#endif /* SYMBOLSH */