* Eliminate use of low-level symbol property function.
[bpt/guile.git] / libguile / symbols.h
CommitLineData
0f2d19dd
JB
1/* classes: h_files */
2
3#ifndef SYMBOLSH
4#define SYMBOLSH
f2c9fcb0 5/* Copyright (C) 1995,1996,1997,1998, 2000 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
3210f49a
DH
79#define SCM_SYMBOLP(x) (SCM_NIMP (x) \
80 && (SCM_TYP7S (x) == scm_tc7_ssymbol))
81
82#define SCM_LENGTH_MAX (0xffffffL)
83#define SCM_LENGTH(x) (((unsigned long) SCM_CELL_WORD_0 (x)) >> 8)
84#define SCM_SETLENGTH(x, v, t) (SCM_SET_CELL_WORD_0 ((x), ((v) << 8) + (t)))
85
86#define SCM_CHARS(x) ((char *) (SCM_CELL_WORD_1 (x)))
87#define SCM_UCHARS(x) ((unsigned char *) (SCM_CELL_WORD_1 (x)))
88#define SCM_SETCHARS(x, v) (SCM_SET_CELL_WORD_1 ((x), (scm_bits_t) (v)))
89
cf551a2b
DH
90#define SCM_SYMBOL_SLOTS 4
91#define SCM_SLOTS(x) ((scm_bits_t *) (* ((scm_bits_t *) SCM_CHARS (x) - 1)))
92#define SCM_SYMBOL_FUNC(X) (SCM_PACK (SCM_SLOTS (X) [0]))
93#define SCM_SET_SYMBOL_FUNC(X, v) (SCM_SLOTS (X) [0] = SCM_UNPACK (v))
94#define SCM_SYMBOL_PROPS(X) (SCM_PACK (SCM_SLOTS (X) [1]))
95#define SCM_SET_SYMBOL_PROPS(X, v) (SCM_SLOTS (X) [1] = SCM_UNPACK (v))
96#define SCM_SYMBOL_HASH(X) (SCM_SLOTS (X) [2])
0f2d19dd 97
d3a6bc94
GB
98#define SCM_ROSTRINGP(x) (SCM_NIMP(x) && ((SCM_TYP7S(x)==scm_tc7_string) \
99 || (SCM_TYP7S(x) == scm_tc7_ssymbol)))
100#define SCM_ROCHARS(x) ((char *)((SCM_TYP7(x) == scm_tc7_substring) \
0f2d19dd 101 ? SCM_INUM (SCM_CADR (x)) + SCM_CHARS (SCM_CDDR (x)) \
d3a6bc94 102 : SCM_CHARS (x)))
cfaba30e 103#define SCM_ROUCHARS(x) ((unsigned char *) ((SCM_TYP7(x) == scm_tc7_substring) \
c2cb2500 104 ? SCM_INUM (SCM_CADR (x)) + SCM_UCHARS (SCM_CDDR (x))\
d3a6bc94 105 : SCM_UCHARS (x)))
0f2d19dd 106#define SCM_ROLENGTH(x) SCM_LENGTH (x)
30939477
GB
107#define SCM_SLOPPY_SUBSTRP(x) (SCM_TYP7(x) == scm_tc7_substring)
108#define SCM_SUBSTRP(x) (SCM_NIMP(x) && SCM_SLOPPY_SUBSTRP(x))
0f2d19dd
JB
109#define SCM_SUBSTR_STR(x) (SCM_CDDR (x))
110#define SCM_SUBSTR_OFFSET(x) (SCM_CADR (x))
111
89958ad0
JB
112#define SCM_COERCE_SUBSTR(x) { if (SCM_SUBSTRP (x)) \
113 x = scm_makfromstr (SCM_ROCHARS (x), \
114 SCM_ROLENGTH (x), 0); }
0f2d19dd
JB
115
116\f
0f2d19dd 117
95c9e176 118extern unsigned long scm_strhash (const unsigned char *str, scm_sizet len, unsigned long n);
7866a09b
GB
119extern SCM scm_sym2vcell (SCM sym, SCM thunk, SCM definep);
120extern SCM scm_sym2ovcell_soft (SCM sym, SCM obarray);
121extern SCM scm_sym2ovcell (SCM sym, SCM obarray);
122extern SCM scm_intern_obarray_soft (const char *name, scm_sizet len, SCM obarray, int softness);
123extern SCM scm_intern_obarray (const char *name, scm_sizet len, SCM obarray);
124extern SCM scm_intern (const char *name, scm_sizet len);
5b99c4a9 125extern SCM scm_intern0 (const char *name);
7866a09b
GB
126extern SCM scm_sysintern (const char *name, SCM val);
127extern SCM scm_sysintern0 (const char *name);
128extern SCM scm_sysintern0_no_module_lookup (const char *name);
129extern SCM scm_symbol_value0 (const char *name);
130extern SCM scm_symbol_p (SCM x);
131extern SCM scm_symbol_to_string (SCM s);
132extern SCM scm_string_to_symbol (SCM s);
133extern SCM scm_string_to_obarray_symbol (SCM o, SCM s, SCM softp);
134extern SCM scm_intern_symbol (SCM o, SCM s);
135extern SCM scm_unintern_symbol (SCM o, SCM s);
136extern SCM scm_symbol_binding (SCM o, SCM s);
137extern SCM scm_symbol_interned_p (SCM o, SCM s);
138extern SCM scm_symbol_bound_p (SCM o, SCM s);
139extern SCM scm_symbol_set_x (SCM o, SCM s, SCM v);
140extern SCM scm_symbol_fref (SCM s);
141extern SCM scm_symbol_pref (SCM s);
142extern SCM scm_symbol_fset_x (SCM s, SCM val);
143extern SCM scm_symbol_pset_x (SCM s, SCM val);
144extern SCM scm_symbol_hash (SCM s);
145extern SCM scm_builtin_bindings (void);
146extern SCM scm_builtin_weak_bindings (void);
5382d876
MD
147extern SCM scm_gensym (SCM prefix);
148extern SCM scm_gentemp (SCM prefix, SCM obarray);
7866a09b 149extern void scm_init_symbols (void);
0f2d19dd
JB
150
151#endif /* SYMBOLSH */
89e00824
ML
152
153/*
154 Local Variables:
155 c-file-style: "gnu"
156 End:
157*/