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