1 /*===========================================================================
2  *  Filename : storage-common.h
3  *  About    : Common part of the fatty and compact storage implementations
4  *
5  *  Copyright (C) 2005      Kazuki Ohta <mover AT hct.zaq.ne.jp>
6  *  Copyright (C) 2005-2006 YAMAMOTO Kengo <yamaken AT bp.iij4u.or.jp>
7  *  Copyright (c) 2007-2008 SigScheme Project <uim-en AT googlegroups.com>
8  *
9  *  All rights reserved.
10  *
11  *  Redistribution and use in source and binary forms, with or without
12  *  modification, are permitted provided that the following conditions
13  *  are met:
14  *
15  *  1. Redistributions of source code must retain the above copyright
16  *     notice, this list of conditions and the following disclaimer.
17  *  2. Redistributions in binary form must reproduce the above copyright
18  *     notice, this list of conditions and the following disclaimer in the
19  *     documentation and/or other materials provided with the distribution.
20  *  3. Neither the name of authors nor the names of its contributors
21  *     may be used to endorse or promote products derived from this software
22  *     without specific prior written permission.
23  *
24  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
25  *  IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
26  *  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
27  *  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
28  *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
29  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
30  *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
31  *  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
32  *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
33  *  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
34  *  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 ===========================================================================*/
36 #ifndef __STORAGE_COMMON_H
37 #define __STORAGE_COMMON_H
38 
39 /*
40  * Internal representation defined in this file MUST NOT directly touched by
41  * libsscm users. Use abstract public APIs defined in sigscheme.h.
42  */
43 
44 #include <stddef.h>
45 
46 #ifdef __cplusplus
47 /* extern "C" { */
48 #endif
49 
50 /*=======================================
51   Internal SAL
52 =======================================*/
53 /* for mark phase */
54 #define SCM_MARKEDP(o)                                                  \
55     SCM_TYPESAFE_MACRO(SCM_ISAL_MARKEDP,                                \
56                        int,                                             \
57                        (ScmObj),                                        \
58                        (o))
59 #define SCM_MARK(o)                                                     \
60     SCM_TYPESAFE_MACRO_VOID(SCM_ISAL_MARK,                              \
61                             (ScmObj),                                   \
62                             (o))
63 
64 /* for sweep phase */
65 #define SCM_CELL_MARKEDP(c)                                             \
66     SCM_TYPESAFE_MACRO(SCM_ISAL_CELL_MARKEDP,                           \
67                        int,                                             \
68                        (ScmCell *),                                     \
69                        (c))
70 #define SCM_CELL_UNMARK(c)                                              \
71     SCM_TYPESAFE_MACRO_VOID(SCM_ISAL_CELL_UNMARK,                       \
72                             (ScmCell *),                                \
73                             (c))
74 #define SCM_CELL_FREECELLP(c)                                           \
75     SCM_TYPESAFE_MACRO(SCM_ISAL_CELL_FREECELLP,                         \
76                        int,                                             \
77                        (ScmCell *),                                     \
78                        (c))
79 
80 /* For optimized operation: Cleanup a destructed ScmCell *c to a freecell,
81  * chain it into freelist and returns ScmObj for c. */
82 #define SCM_CELL_RECLAIM_CELL(c, next)                                  \
83     SCM_TYPESAFE_MACRO(SCM_ISAL_CELL_RECLAIM_CELL,                      \
84                        ScmObj,                                          \
85                        (ScmCell *, ScmObj),                             \
86                        ((c), (next)))
87 
88 
89 /*=======================================
90   Object Creators
91 =======================================*/
92 #if !SCM_SAL_HAS_IMMEDIATE_INT_ONLY
93 #define SCM_SAL_MAKE_INT                      scm_make_int
94 #endif
95 
96 #define SCM_SAL_MAKE_CONS                     scm_make_cons
97 
98 #if SCM_SAL_HAS_IMMUTABLE_CONS
99 #define SCM_SAL_MAKE_IMMUTABLE_CONS           scm_make_immutable_cons
100 #else
101 #define SCM_SAL_MAKE_IMMUTABLE_CONS           scm_make_cons
102 #endif
103 
104 #define SCM_SAL_MAKE_SYMBOL                   scm_make_symbol
105 
106 #if !SCM_SAL_HAS_IMMEDIATE_CHAR_ONLY
107 #define SCM_SAL_MAKE_CHAR                     scm_make_char
108 #endif
109 
110 #define SCM_SAL_MAKE_STRING                   scm_make_string
111 #define SCM_SAL_MAKE_STRING_COPYING           scm_make_string_copying
112 
113 #if SCM_SAL_HAS_IMMUTABLE_STRING
114 #define SCM_SAL_MAKE_IMMUTABLE_STRING         scm_make_immutable_string
115 #define SCM_SAL_MAKE_IMMUTABLE_STRING_COPYING scm_make_immutable_string_copying
116 #else
117 #define SCM_SAL_MAKE_IMMUTABLE_STRING         scm_make_string
118 #define SCM_SAL_MAKE_IMMUTABLE_STRING_COPYING scm_make_string_copying
119 #endif
120 
121 #define SCM_SAL_MAKE_FUNC                     scm_make_func
122 #define SCM_SAL_MAKE_CLOSURE                  scm_make_closure
123 #define SCM_SAL_MAKE_VECTOR                   scm_make_vector
124 
125 #if SCM_SAL_HAS_IMMUTABLE_VECTOR
126 #define SCM_SAL_MAKE_IMMUTABLE_VECTOR         scm_make_immutable_vector
127 #else
128 #define SCM_SAL_MAKE_IMMUTABLE_VECTOR         scm_make_vector
129 #endif
130 
131 #define SCM_SAL_MAKE_PORT                     scm_make_port
132 #define SCM_SAL_MAKE_CONTINUATION             scm_make_continuation
133 
134 #if SCM_USE_SSCM_EXTENSIONS
135 #define SCM_SAL_MAKE_C_POINTER                scm_make_cpointer
136 #define SCM_SAL_MAKE_C_FUNCPOINTER            scm_make_cfunc_pointer
137 #endif
138 
139 #ifndef SCM_SAL_MAKE_VALUEPACKET
140 #define SCM_SAL_MAKE_VALUEPACKET              scm_make_value_packet
141 #endif
142 
143 #if SCM_USE_HYGIENIC_MACRO
144 #define SCM_SAL_MAKE_HMACRO                   scm_make_hmacro
145 #define SCM_SAL_MAKE_FARSYMBOL                scm_make_farsymbol
146 #define SCM_SAL_MAKE_SUBPAT                   scm_make_subpat
147 #endif
148 
149 /* Don't use these functions directly. Use SCM_MAKE_*() or MAKE_*() instead to
150  * allow flexible object allocation. */
151 SCM_EXPORT ScmObj scm_make_cons(ScmObj kar, ScmObj kdr);
152 #if SCM_SAL_HAS_IMMUTABLE_CONS
153 SCM_EXPORT ScmObj scm_make_immutable_cons(ScmObj kar, ScmObj kdr);
154 #endif
155 #if (SCM_USE_NUMBER && !SCM_SAL_HAS_IMMEDIATE_INT_ONLY)
156 SCM_EXPORT ScmObj scm_make_int(scm_int_t val);
157 #endif
158 SCM_EXPORT ScmObj scm_make_symbol(char *name, ScmObj val);
159 #if (SCM_USE_CHAR && !SCM_SAL_HAS_IMMEDIATE_CHAR_ONLY)
160 SCM_EXPORT ScmObj scm_make_char(scm_ichar_t val);
161 #endif
162 #if SCM_USE_STRING
163 #if SCM_SAL_HAS_IMMUTABLE_STRING
164 SCM_EXPORT ScmObj scm_make_immutable_string(char *str, scm_int_t len);
165 SCM_EXPORT ScmObj scm_make_immutable_string_copying(const char *str,
166                                                     scm_int_t len);
167 #endif
168 SCM_EXPORT ScmObj scm_make_string(char *str, scm_int_t len);
169 SCM_EXPORT ScmObj scm_make_string_copying(const char *str, scm_int_t len);
170 #endif /* SCM_USE_STRING */
171 SCM_EXPORT ScmObj scm_make_func(enum ScmFuncTypeCode type, ScmFuncType func);
172 SCM_EXPORT ScmObj scm_make_closure(ScmObj exp, ScmObj env);
173 #if SCM_USE_VECTOR
174 SCM_EXPORT ScmObj scm_make_vector(ScmObj *vec, scm_int_t len);
175 #if SCM_SAL_HAS_IMMUTABLE_VECTOR
176 SCM_EXPORT ScmObj scm_make_immutable_vector(ScmObj *vec, scm_int_t len);
177 #endif
178 #endif /* SCM_USE_VECTOR */
179 #if SCM_USE_PORT
180 SCM_EXPORT ScmObj scm_make_port(struct ScmCharPort_ *cport,
181                                 enum ScmPortFlag flag);
182 #endif /* SCM_USE_PORT */
183 #if (SCM_USE_CONTINUATION || SCM_USE_VALUES_APPLIER)
184 SCM_EXPORT ScmObj scm_make_continuation(void);
185 #endif /* (SCM_USE_CONTINUATION || SCM_USE_VALUES_APPLIER) */
186 #if !SCM_USE_VALUECONS
187 SCM_EXPORT ScmObj scm_make_value_packet(ScmObj values);
188 #endif
189 #if SCM_USE_SSCM_EXTENSIONS
190 SCM_EXPORT ScmObj scm_make_cpointer(void *ptr);
191 SCM_EXPORT ScmObj scm_make_cfunc_pointer(ScmCFunc ptr);
192 #endif
193 #if SCM_USE_HYGIENIC_MACRO
194 SCM_EXPORT ScmObj scm_make_hmacro(ScmObj rules, ScmObj defenv);
195 SCM_EXPORT ScmObj scm_make_farsymbol(ScmObj sym, ScmPackedEnv env);
196 SCM_EXPORT ScmObj scm_make_subpat(ScmObj x, scm_int_t meta);
197 #endif
198 
199 /*===========================================================================
200   Environment Specifiers
201 ===========================================================================*/
202 #define SCM_SAL_INTERACTION_ENV SCM_NULL
203 /*
204  * Current implementation cannot handle scheme-report-environment and
205  * null-environment properly. Be careful to use these environemnts.
206  */
207 #define SCM_SAL_R5RS_ENV        SCM_INTERACTION_ENV
208 #define SCM_SAL_NULL_ENV        SCM_INTERACTION_ENV
209 
210 /* test NULLP() first for average performance */
211 #define SCM_SAL_ENVP(env) (NULLP(env) || CONSP(env))
212 
213 
214 /*=======================================
215   Internal Functions
216 =======================================*/
217 /* alloc.c */
218 SCM_EXPORT char *scm_align_str(char *str);
219 
220 
221 #ifdef __cplusplus
222 /* } */
223 #endif
224 
225 #endif /* __STORAGE_COMMON_H */
226