* stime.c (scm_mktime): #ifndef HAVE_TM_ZONE, Use lt.tm_zone, not
[bpt/guile.git] / libguile / symbols.h
CommitLineData
0f2d19dd
JB
1/* classes: h_files */
2
3#ifndef SYMBOLSH
4#define SYMBOLSH
9b8d3288 5/* Copyright (C) 1995,1996,1997 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
19 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
20 *
21 * As a special exception, the Free Software Foundation gives permission
22 * for additional uses of the text contained in its release of GUILE.
23 *
24 * The exception is that, if you link the GUILE library with other files
25 * to produce an executable, this does not by itself cause the
26 * resulting executable to be covered by the GNU General Public License.
27 * Your use of that executable is in no way restricted on account of
28 * linking the GUILE library code into it.
29 *
30 * This exception does not however invalidate any other reasons why
31 * the executable file might be covered by the GNU General Public License.
32 *
33 * This exception applies only to the code released by the
34 * Free Software Foundation under the name GUILE. If you copy
35 * code from other Free Software Foundation releases into a copy of
36 * GUILE, as the General Public License permits, the exception does
37 * not apply to the code that you add in this way. To avoid misleading
38 * anyone as to the status of such modified files, you must delete
39 * this exception notice from them.
40 *
41 * If you write modifications of your own for GUILE, it is your choice
42 * whether to permit this exception to apply to your modifications.
43 * If you do not wish that, delete this exception notice.
44 */
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
62 list and a function value (for Emacs Lisp compatibility), a hash
63 code, and a flag to indicate whether their name contains multibyte
64 characters. They use the scm_tc7_msymbol tag.
65
66 We'd like SCM_CHARS to work on msymbols just as it does on
67 ssymbols, so we'll have it point to the symbol's name as usual, and
68 store a pointer to the slots just before the name in memory. Thus,
69 you have to do some casting and pointer arithmetic to find the
70 slots; see the SCM_SLOTS macro.
71
72 In practice, the slots always live just before the pointer to them.
73 So why not ditch the pointer, and use negative indices to refer to
74 the slots? That's a good question; ask the author. I think it was
75 the cognac. */
76
0f2d19dd
JB
77#define SCM_SYMBOLP(x) (SCM_TYP7S(x)==scm_tc7_ssymbol)
78#define SCM_LENGTH(x) (((unsigned long)SCM_CAR(x))>>8)
79#define SCM_LENGTH_MAX (0xffffffL)
836669b8 80#define SCM_SETLENGTH(x, v, t) SCM_SETCAR((x), ((v)<<8)+(t))
0f2d19dd
JB
81#define SCM_SETCHARS SCM_SETCDR
82#define SCM_CHARS(x) ((char *)(SCM_CDR(x)))
83#define SCM_UCHARS(x) ((unsigned char *)(SCM_CDR(x)))
84#define SCM_SLOTS(x) ((SCM *) (* ((SCM *)SCM_CHARS(x) - 1)))
85#define SCM_SYMBOL_SLOTS 5
86#define SCM_SYMBOL_FUNC(X) (SCM_SLOTS(X)[0])
87#define SCM_SYMBOL_PROPS(X) (SCM_SLOTS(X)[1])
88#define SCM_SYMBOL_HASH(X) (*(unsigned long*)(&SCM_SLOTS(X)[2]))
08b5b88c 89#define SCM_SYMBOL_MULTI_BYTE_STRINGP(X) (*(unsigned long*)(&SCM_SLOTS(X)[3]))
0f2d19dd
JB
90
91#define SCM_ROSTRINGP(x) ((SCM_TYP7SD(x)==scm_tc7_string) || (SCM_TYP7S(x) == scm_tc7_ssymbol))
92#define SCM_ROCHARS(x) ((SCM_TYP7(x) == scm_tc7_substring) \
93 ? SCM_INUM (SCM_CADR (x)) + SCM_CHARS (SCM_CDDR (x)) \
94 : SCM_CHARS (x))
95#define SCM_ROUCHARS(x) ((SCM_TYP7(x) == scm_tc7_substring) \
96 ? SCM_INUM (SCM_CADR (x)) + SCM_UCHARS (SCM_CDDR (x)) \
97 : SCM_UCHARS (x))
98#define SCM_ROLENGTH(x) SCM_LENGTH (x)
99#define SCM_SUBSTRP(x) ((SCM_TYP7S(x) == scm_tc7_substring))
100#define SCM_SUBSTR_STR(x) (SCM_CDDR (x))
101#define SCM_SUBSTR_OFFSET(x) (SCM_CADR (x))
102
103
104\f
0f2d19dd 105
1cc91f1b
JB
106extern unsigned long scm_strhash SCM_P ((unsigned char *str, scm_sizet len, unsigned long n));
107extern SCM scm_sym2vcell SCM_P ((SCM sym, SCM thunk, SCM definep));
108extern SCM scm_sym2ovcell_soft SCM_P ((SCM sym, SCM obarray));
109extern SCM scm_sym2ovcell SCM_P ((SCM sym, SCM obarray));
110extern SCM scm_intern_obarray_soft SCM_P ((char *name, scm_sizet len, SCM obarray, int softness));
111extern SCM scm_intern_obarray SCM_P ((char *name, scm_sizet len, SCM obarray));
112extern SCM scm_intern SCM_P ((char *name, scm_sizet len));
113extern SCM scm_intern0 SCM_P ((char * name));
114extern SCM scm_sysintern SCM_P ((char *name, SCM val));
5aab5d96 115extern SCM scm_sysintern0 SCM_P ((char *name));
1dd28b3d 116extern SCM scm_symbol_value0 SCM_P ((char *name));
1cc91f1b
JB
117extern SCM scm_symbol_p SCM_P ((SCM x));
118extern SCM scm_symbol_to_string SCM_P ((SCM s));
119extern SCM scm_string_to_symbol SCM_P ((SCM s));
120extern SCM scm_string_to_obarray_symbol SCM_P ((SCM o, SCM s, SCM softp));
121extern SCM scm_intern_symbol SCM_P ((SCM o, SCM s));
122extern SCM scm_unintern_symbol SCM_P ((SCM o, SCM s));
123extern SCM scm_symbol_binding SCM_P ((SCM o, SCM s));
124extern SCM scm_symbol_interned_p SCM_P ((SCM o, SCM s));
125extern SCM scm_symbol_bound_p SCM_P ((SCM o, SCM s));
126extern SCM scm_symbol_set_x SCM_P ((SCM o, SCM s, SCM v));
127extern SCM scm_symbol_fref SCM_P ((SCM s));
128extern SCM scm_symbol_pref SCM_P ((SCM s));
129extern SCM scm_symbol_fset_x SCM_P ((SCM s, SCM val));
130extern SCM scm_symbol_pset_x SCM_P ((SCM s, SCM val));
131extern SCM scm_symbol_hash SCM_P ((SCM s));
132extern void scm_init_symbols SCM_P ((void));
0f2d19dd 133
9b8d3288
MV
134extern int scm_can_use_top_level_lookup_closure_var;
135
0f2d19dd 136#endif /* SYMBOLSH */