1 /* scheme.h for Chez Scheme Version 9.5.4 (ti3le) */
2 
3 /* Do not edit this file.  It is automatically generated and */
4 /* specifically tailored to the version of Chez Scheme named */
5 /* above.  Always be certain that you have the correct scheme.h */
6 /* for the version of Chez Scheme you are using. */
7 
8 /* Warning: Some macros may evaluate arguments more than once. */
9 
10 /* Enable function prototypes by default. */
11 #ifndef PROTO
12 #define PROTO(x) x
13 #endif
14 
15 /* Specify declaration of exports. */
16 #ifdef _WIN32
17 #  if __cplusplus
18 #    ifdef SCHEME_IMPORT
19 #      define EXPORT extern "C" __declspec (dllimport)
20 #    elif SCHEME_STATIC
21 #      define EXPORT extern "C"
22 #    else
23 #      define EXPORT extern "C" __declspec (dllexport)
24 #    endif
25 #  else
26 #    ifdef SCHEME_IMPORT
27 #      define EXPORT extern __declspec (dllimport)
28 #    elif SCHEME_STATIC
29 #      define EXPORT extern
30 #    else
31 #      define EXPORT extern __declspec (dllexport)
32 #    endif
33 #  endif
34 #else
35 #  if __cplusplus
36 #    define EXPORT extern "C"
37 #  else
38 #    define EXPORT extern
39 #  endif
40 #endif
41 
42 /* Chez Scheme Version and machine type */
43 #define VERSION "9.5.4"
44 #define MACHINE_TYPE "ti3le"
45 
46 /* All Scheme objects are of type ptr.  Type iptr and */
47 /* uptr are signed and unsigned ints of the same size */
48 /* as a ptr */
49 typedef void * ptr;
50 typedef int iptr;
51 typedef unsigned int uptr;
52 
53 /* String elements are 32-bit tagged char objects */
54 typedef unsigned int string_char;
55 
56 /* Bytevector elements are 8-bit unsigned "octets" */
57 typedef unsigned char octet;
58 
59 /* Type predicates */
60 #define Sfixnump(x) (((uptr)(x)&0x3)==0x0)
61 #define Scharp(x) (((uptr)(x)&0xFF)==0x16)
62 #define Snullp(x) ((uptr)(x)==0x26)
63 #define Seof_objectp(x) ((uptr)(x)==0x36)
64 #define Sbwp_objectp(x) ((uptr)(x)==0x4E)
65 #define Sbooleanp(x) (((uptr)(x)&0xF7)==0x6)
66 #define Spairp(x) (((uptr)(x)&0x7)==0x1)
67 #define Ssymbolp(x) (((uptr)(x)&0x7)==0x3)
68 #define Sprocedurep(x) (((uptr)(x)&0x7)==0x5)
69 #define Sflonump(x) (((uptr)(x)&0x7)==0x2)
70 #define Svectorp(x) ((((uptr)(x)&0x7)==0x7) &&\
71     (((uptr)((*((ptr *)((uptr)(x)+1))))&0x3)==0x0))
72 #define Sfxvectorp(x) ((((uptr)(x)&0x7)==0x7) &&\
73     (((uptr)((*((ptr *)((uptr)(x)+1))))&0x7)==0x3))
74 #define Sbytevectorp(x) ((((uptr)(x)&0x7)==0x7) &&\
75     (((uptr)((*((ptr *)((uptr)(x)+1))))&0x3)==0x1))
76 #define Sstringp(x) ((((uptr)(x)&0x7)==0x7) &&\
77     (((uptr)((*((ptr *)((uptr)(x)+1))))&0x7)==0x2))
78 #define Sbignump(x) ((((uptr)(x)&0x7)==0x7) &&\
79     (((uptr)((*((ptr *)((uptr)(x)+1))))&0x1F)==0x6))
80 #define Sboxp(x) ((((uptr)(x)&0x7)==0x7) &&\
81     (((uptr)((*((ptr *)((uptr)(x)+1))))&0x7F)==0xE))
82 #define Sinexactnump(x) ((((uptr)(x)&0x7)==0x7) &&\
83     ((uptr)((*((ptr *)((uptr)(x)+1))))==0x36))
84 #define Sexactnump(x) ((((uptr)(x)&0x7)==0x7) &&\
85     ((uptr)((*((ptr *)((uptr)(x)+1))))==0x56))
86 #define Sratnump(x) ((((uptr)(x)&0x7)==0x7) &&\
87     ((uptr)((*((ptr *)((uptr)(x)+1))))==0x16))
88 #define Sinputportp(x) ((((uptr)(x)&0x7)==0x7) &&\
89     (((uptr)((*((ptr *)((uptr)(x)+1))))&0x1FF)==0x11E))
90 #define Soutputportp(x) ((((uptr)(x)&0x7)==0x7) &&\
91     (((uptr)((*((ptr *)((uptr)(x)+1))))&0x2FF)==0x21E))
92 #define Srecordp(x) ((((uptr)(x)&0x7)==0x7) &&\
93     (((uptr)((*((ptr *)((uptr)(x)+1))))&0x7)==0x7))
94 
95 /* Accessors */
96 #define Sfixnum_value(x) ((iptr)(x)/4)
97 #define Schar_value(x) ((string_char)((uptr)(x)>>8))
98 #define Sboolean_value(x) ((x) != Sfalse)
99 #define Scar(x) (*((ptr *)((uptr)(x)+7)))
100 #define Scdr(x) (*((ptr *)((uptr)(x)+11)))
101 #define Sflonum_value(x) (*((double *)((uptr)(x)+6)))
102 #define Svector_length(x) ((iptr)((uptr)(*((iptr *)((uptr)(x)+1)))>>3))
103 #define Svector_ref(x,i) (((ptr *)((uptr)(x)+5))[i])
104 #define Sfxvector_length(x) ((iptr)((uptr)(*((iptr *)((uptr)(x)+1)))>>4))
105 #define Sfxvector_ref(x,i) (((ptr *)((uptr)(x)+5))[i])
106 #define Sbytevector_length(x) ((iptr)((uptr)(*((iptr *)((uptr)(x)+1)))>>3))
107 #define Sbytevector_u8_ref(x,i) (((octet *)((uptr)(x)+9))[i])
108 /* Warning: Sbytevector_data(x) returns a pointer into x. */
109 #define Sbytevector_data(x) &Sbytevector_u8_ref(x,0)
110 #define Sstring_length(x) ((iptr)((uptr)(*((iptr *)((uptr)(x)+1)))>>4))
111 #define Sstring_ref(x,i) Schar_value(((string_char *)((uptr)(x)+5))[i])
112 #define Sunbox(x) (*((ptr *)((uptr)(x)+5)))
113 EXPORT iptr Sinteger_value PROTO((ptr));
114 #define Sunsigned_value(x) (uptr)Sinteger_value(x)
115 EXPORT int Sinteger32_value PROTO((ptr));
116 #define Sunsigned32_value(x) (unsigned int)Sinteger32_value(x)
117 EXPORT long long Sinteger64_value PROTO((ptr));
118 #define Sunsigned64_value(x) (unsigned long long)Sinteger64_value(x)
119 
120 /* Mutators */
121 EXPORT void Sset_box PROTO((ptr, ptr));
122 EXPORT void Sset_car PROTO((ptr, ptr));
123 EXPORT void Sset_cdr PROTO((ptr, ptr));
124 #define Sstring_set(x,i,c) ((void)((((string_char *)((uptr)(x)+5))[i]) = (string_char)(uptr)Schar(c)))
125 #define Sfxvector_set(x,i,n) ((void)(Sfxvector_ref(x,i) = (n)))
126 #define Sbytevector_u8_set(x,i,n) ((void)(Sbytevector_u8_ref(x,i) = (n)))
127 EXPORT void Svector_set PROTO((ptr, iptr, ptr));
128 
129 /* Constructors */
130 #define Sfixnum(x) ((ptr)(uptr)((x)*4))
131 #define Schar(x) ((ptr)(uptr)((x)<<8|0x16))
132 #define Snil ((ptr)0x26)
133 #define Strue ((ptr)0xE)
134 #define Sfalse ((ptr)0x6)
135 #define Sboolean(x) ((x)?Strue:Sfalse)
136 #define Sbwp_object ((ptr)0x4E)
137 #define Seof_object ((ptr)0x36)
138 #define Svoid ((ptr)0x3E)
139 EXPORT ptr Scons PROTO((ptr, ptr));
140 EXPORT ptr Sstring_to_symbol PROTO((const char *));
141 EXPORT ptr Ssymbol_to_string PROTO((ptr));
142 EXPORT ptr Sflonum PROTO((double));
143 EXPORT ptr Smake_vector PROTO((iptr, ptr));
144 EXPORT ptr Smake_fxvector PROTO((iptr, ptr));
145 EXPORT ptr Smake_bytevector PROTO((iptr, int));
146 EXPORT ptr Smake_string PROTO((iptr, int));
147 EXPORT ptr Smake_uninitialized_string PROTO((iptr));
148 EXPORT ptr Sstring PROTO((const char *));
149 EXPORT ptr Sstring_of_length PROTO((const char *, iptr));
150 EXPORT ptr Sstring_utf8 PROTO((const char*, iptr));
151 EXPORT ptr Sbox PROTO((ptr));
152 EXPORT ptr Sinteger PROTO((iptr));
153 EXPORT ptr Sunsigned PROTO((uptr));
154 EXPORT ptr Sinteger32 PROTO((int));
155 EXPORT ptr Sunsigned32 PROTO((unsigned int));
156 EXPORT ptr Sinteger64 PROTO((long long));
157 EXPORT ptr Sunsigned64 PROTO((unsigned long long));
158 
159 /* Miscellaneous */
160 EXPORT ptr Stop_level_value PROTO((ptr));
161 EXPORT void Sset_top_level_value PROTO((ptr, ptr));
162 EXPORT void Slock_object PROTO((ptr));
163 EXPORT void Sunlock_object PROTO((ptr));
164 EXPORT int Slocked_objectp PROTO((ptr));
165 EXPORT void Sforeign_symbol PROTO((const char *, void *));
166 EXPORT void Sregister_symbol PROTO((const char *, void *));
167 
168 /* Support for calls into Scheme */
169 EXPORT ptr Scall0 PROTO((ptr));
170 EXPORT ptr Scall1 PROTO((ptr, ptr));
171 EXPORT ptr Scall2 PROTO((ptr, ptr, ptr));
172 EXPORT ptr Scall3 PROTO((ptr, ptr, ptr, ptr));
173 EXPORT void Sinitframe PROTO((iptr));
174 EXPORT void Sput_arg PROTO((iptr, ptr));
175 EXPORT ptr Scall PROTO((ptr, iptr));
176 /* Warning: Sforeign_callable_entry_point(x) returns a pointer into x. */
177 #define Sforeign_callable_entry_point(x) ((void (*) PROTO((void)))((uptr)(x)+33))
178 #define Sforeign_callable_code_object(x) ((ptr)((uptr)(x)-33))
179 
180 /* Customization support. */
181 EXPORT const char * Skernel_version PROTO((void));
182 EXPORT void Sretain_static_relocation PROTO((void));
183 EXPORT void Sset_verbose PROTO((int));
184 EXPORT void Sscheme_init PROTO((void (*)(void)));
185 EXPORT void Sregister_boot_file PROTO((const char *));
186 EXPORT void Sregister_boot_file_fd PROTO((const char *, int fd));
187 EXPORT void Sregister_heap_file PROTO((const char *));
188 EXPORT void Scompact_heap PROTO((void));
189 EXPORT void Ssave_heap PROTO((const char *, int));
190 EXPORT void Sbuild_heap PROTO((const char *, void (*)(void)));
191 EXPORT void Senable_expeditor PROTO((const char *));
192 EXPORT int Sscheme_start PROTO((int, const char *[]));
193 EXPORT int Sscheme_script PROTO((const char *, int, const char *[]));
194 EXPORT int Sscheme_program PROTO((const char *, int, const char *[]));
195 EXPORT void Sscheme_deinit PROTO((void));
196 
197 /* Thread support. */
198 EXPORT int Sactivate_thread PROTO((void));
199 EXPORT void Sdeactivate_thread PROTO((void));
200 EXPORT int Sdestroy_thread PROTO((void));
201 
202 /* Features. */
203 #define FEATURE_ICONV
204 #define FEATURE_EXPEDITOR
205 #define FEATURE_PTHREADS
206 
207 /* Locking macros. */
208 #define INITLOCK(addr)     \
209   __asm__ __volatile__ ("movl $0, (%0)"\
210                         :             \
211                         : "r" (addr)  \
212                         : "memory")
213 
214 #define SPINLOCK(addr)      \
215   __asm__ __volatile__ ("0:\n\t"\
216                         "movl $1, %%eax\n\t"\
217                         "xchgl (%0), %%eax\n\t"\
218                         "cmpl $0, %%eax\n\t"\
219                         "je 2f\n\t"\
220                         "1:\n\t"\
221                         "pause\n\t"\
222                         "cmpl $0, (%0)\n\t"\
223                         "je 0b\n\t"\
224                         "jmp 1b\n\t"\
225                         "2:"\
226                         :                \
227                         : "r" (addr)     \
228                         : "eax", "flags", "memory")
229 
230 #define UNLOCK(addr)     \
231   __asm__ __volatile__ ("movl $0, (%0)"\
232                         :             \
233                         : "r" (addr)  \
234                         : "memory")
235 
236 #define LOCKED_INCR(addr, ret) \
237   __asm__ __volatile__ ("lock; incl (%1)\n\t"\
238                         "sete %b0\n\t"\
239                         "movzx %b0, %0\n\t"\
240                         : "=q" (ret)   \
241                         : "r" (addr)   \
242                         : "flags", "memory")
243 
244 #define LOCKED_DECR(addr, ret) \
245   __asm__ __volatile__ ("lock; decl (%1)\n\t"\
246                         "sete %b0\n\t"\
247                         "movzx %b0, %0\n\t"\
248                         : "=q" (ret)   \
249                         : "r" (addr)   \
250                         : "flags", "memory")
251