1 /* scheme.h for Chez Scheme Version 9.5.4 (ta6le) */ 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 "ta6le" 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 long int iptr; 51 typedef unsigned long 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)&0x7)==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))))&0x7)==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)/8) 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)+15))) 101 #define Sflonum_value(x) (*((double *)((uptr)(x)+6))) 102 #define Svector_length(x) ((iptr)((uptr)(*((iptr *)((uptr)(x)+1)))>>4)) 103 #define Svector_ref(x,i) (((ptr *)((uptr)(x)+9))[i]) 104 #define Sfxvector_length(x) ((iptr)((uptr)(*((iptr *)((uptr)(x)+1)))>>4)) 105 #define Sfxvector_ref(x,i) (((ptr *)((uptr)(x)+9))[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)+9))[i]) 112 #define Sunbox(x) (*((ptr *)((uptr)(x)+9))) 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 Sinteger64_value PROTO((ptr)); 118 #define Sunsigned64_value(x) (unsigned 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)+9))[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)*8)) 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)); 157 EXPORT ptr Sunsigned64 PROTO((unsigned 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)+65)) 178 #define Sforeign_callable_code_object(x) ((ptr)((uptr)(x)-65)) 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__ ("movq $0, (%0)"\ 210 : \ 211 : "r" (addr) \ 212 : "memory") 213 214 #define SPINLOCK(addr) \ 215 __asm__ __volatile__ ("0:\n\t"\ 216 "movq $1, %%rax\n\t"\ 217 "xchgq (%0), %%rax\n\t"\ 218 "cmpq $0, %%rax\n\t"\ 219 "je 2f\n\t"\ 220 "1:\n\t"\ 221 "pause\n\t"\ 222 "cmpq $0, (%0)\n\t"\ 223 "je 0b\n\t"\ 224 "jmp 1b\n\t"\ 225 "2:"\ 226 : \ 227 : "r" (addr) \ 228 : "rax", "flags", "memory") 229 230 #define UNLOCK(addr) \ 231 __asm__ __volatile__ ("movq $0, (%0)"\ 232 : \ 233 : "r" (addr) \ 234 :"memory") 235 236 #define LOCKED_INCR(addr, ret) \ 237 __asm__ __volatile__ ("lock; incq (%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; decq (%1)\n\t"\ 246 "sete %b0\n\t"\ 247 "movzx %b0, %0\n\t"\ 248 : "=q" (ret) \ 249 : "r" (addr) \ 250 : "flags", "memory") 251