1 /* SCHEME.H */ 2 3 #ifndef _SCHEME_H 4 #define _SCHEME_H 5 6 #include <stdio.h> 7 8 #define USE_INTERFACE 1 9 10 /* 11 * Default values for #define'd symbols 12 */ 13 #ifndef STANDALONE /* If used as standalone interpreter */ 14 # define STANDALONE 0 15 #endif 16 17 #ifndef _MSC_VER 18 # define USE_STRCASECMP 1 19 # ifndef WIN32 /* needed for Cygwin */ 20 # define USE_STRLWR 1 21 # else 22 # define USE_STRLWR 0 23 # endif 24 # define SCHEME_EXPORT 25 #else 26 # define USE_STRCASECMP 0 27 # define USE_STRLWR 0 28 # ifdef _SCHEME_SOURCE 29 # define SCHEME_EXPORT __declspec(dllexport) 30 # else 31 # define SCHEME_EXPORT __declspec(dllimport) 32 # endif 33 #endif 34 35 #if USE_NO_FEATURES 36 # define USE_MATH 0 37 # define USE_CHAR_CLASSIFIERS 0 38 # define USE_ASCII_NAMES 0 39 # define USE_STRING_PORTS 0 40 # define USE_ERROR_HOOK 0 41 # define USE_TRACING 0 42 # define USE_COLON_HOOK 0 43 # define USE_DL 0 44 # define USE_PLIST 0 45 # define USE_PROTECT 0 46 # define USE_SERIALIZE 0 47 # define USE_REENTER 0 48 #endif 49 50 #if USE_DL 51 # define USE_INTERFACE 1 52 #endif 53 54 #ifndef USE_PROTECT 55 # include "list.h" 56 # define USE_PROTECT 1 57 #endif 58 59 #ifndef USE_REENTER 60 # define USE_REENTER 1 /* works around script->C->script return issues */ 61 #endif 62 63 #ifndef USE_FILE_AND_LINE 64 # define USE_FILE_AND_LINE 1 65 #endif 66 67 #ifndef USE_SERIALIZE 68 # define USE_SERIALIZE 1 69 #endif 70 71 #ifndef USE_MATH /* If math support is needed */ 72 # define USE_MATH 1 73 #endif 74 75 #ifndef USE_CHAR_CLASSIFIERS /* If char classifiers are needed */ 76 # define USE_CHAR_CLASSIFIERS 1 77 #endif 78 79 #ifndef USE_ASCII_NAMES /* If extended escaped characters are needed */ 80 # define USE_ASCII_NAMES 1 81 #endif 82 83 #ifndef USE_STRING_PORTS /* Enable string ports */ 84 # define USE_STRING_PORTS 1 85 #endif 86 87 #ifndef USE_TRACING 88 # define USE_TRACING 0 89 #endif 90 91 #ifndef USE_PLIST 92 # define USE_PLIST 0 93 #endif 94 95 /* To force system errors through user-defined error handling (see *error-hook*) */ 96 #ifndef USE_ERROR_HOOK 97 # define USE_ERROR_HOOK 1 98 #endif 99 100 #ifndef USE_COLON_HOOK /* Enable qualified qualifier */ 101 # define USE_COLON_HOOK 1 102 #endif 103 104 #ifndef USE_STRCASECMP /* stricmp for Unix */ 105 # define USE_STRCASECMP 0 106 #endif 107 108 #ifndef USE_STRLWR 109 # define USE_STRLWR 1 110 #endif 111 112 #ifndef STDIO_ADDS_CR /* Define if DOS/Windows */ 113 # define STDIO_ADDS_CR 0 114 #endif 115 116 #ifndef INLINE 117 # define INLINE 118 #endif 119 120 #ifndef USE_INTERFACE 121 # define USE_INTERFACE 0 122 #endif 123 124 #ifndef USE_CELLDUMP 125 # define USE_CELLDUMP 1 126 #endif 127 128 /* Allow cells to be marked with a flag that will run a custom finalizer on 129 * them. */ 130 #ifndef USE_CUSTOM_FINALIZE 131 # define USE_CUSTOM_FINALIZE 1 132 #endif 133 134 typedef struct scheme scheme; 135 typedef struct cell *pointer; 136 137 typedef void * (*func_alloc)(size_t); 138 typedef void (*func_dealloc)(void *); 139 140 /* num, for generic arithmetic */ 141 typedef struct num { 142 char is_fixnum; 143 union { 144 long ivalue; 145 double rvalue; 146 } value; 147 } num; 148 149 SCHEME_EXPORT scheme *scheme_init_new(); 150 SCHEME_EXPORT scheme *scheme_init_new_custom_alloc(func_alloc malloc, func_dealloc free); 151 SCHEME_EXPORT int scheme_init(scheme *sc); 152 SCHEME_EXPORT int scheme_init_custom_alloc(scheme *sc, func_alloc, func_dealloc); 153 SCHEME_EXPORT void scheme_deinit(scheme *sc); 154 void scheme_set_input_port_file(scheme *sc, FILE *fin); 155 void scheme_set_input_port_string(scheme *sc, char *start, char *past_the_end); 156 SCHEME_EXPORT void scheme_set_output_port_file(scheme *sc, FILE *fin); 157 void scheme_set_output_port_string(scheme *sc, char *start, char *past_the_end); 158 #ifdef USE_FILE_AND_LINE 159 SCHEME_EXPORT void scheme_load_named_file(scheme *sc, FILE *fin, const char *fname); 160 #endif 161 SCHEME_EXPORT void scheme_load_file(scheme *sc, FILE *fin); 162 SCHEME_EXPORT void scheme_load_string(scheme *sc, const char *cmd); 163 void scheme_apply0(scheme *sc, const char *procname); 164 SCHEME_EXPORT pointer scheme_apply1(scheme *sc, const char *procname, pointer); 165 void scheme_set_external_data(scheme *sc, void *p); 166 SCHEME_EXPORT void scheme_define(scheme *sc, pointer env, pointer symbol, pointer value); 167 //SCHEME_EXPORT void scheme_call(scheme *sc, pointer func, pointer env, pointer args); 168 SCHEME_EXPORT pointer scheme_call(scheme *sc, pointer func, pointer args); 169 170 #if USE_SERIALIZE 171 SCHEME_EXPORT void scheme_serialize(scheme *sc, pointer p, struct save *save); 172 #endif 173 174 #if USE_CUSTOM_FINALIZE 175 SCHEME_EXPORT void scheme_set_custom_finalize(scheme *, 176 void (*fx)(scheme *, pointer)); 177 #endif 178 179 typedef pointer (*foreign_func)(scheme *, pointer); 180 181 pointer _cons(scheme *sc, pointer a, pointer b, int immutable); 182 pointer mk_integer(scheme *sc, long num); 183 pointer mk_real(scheme *sc, double num); 184 pointer mk_symbol(scheme *sc, const char *name); 185 pointer gensym(scheme *sc); 186 pointer mk_string(scheme *sc, const char *str); 187 pointer mk_counted_string(scheme *sc, const char *str, int len); 188 pointer mk_character(scheme *sc, int c); 189 pointer mk_foreign_func(scheme *sc, foreign_func f); 190 void putstr(scheme *sc, const char *s); 191 void celldump(scheme *sc, pointer p); 192 193 #if USE_INTERFACE 194 struct scheme_interface { 195 void (*scheme_define)(scheme *sc, pointer env, pointer symbol, pointer value); 196 pointer (*cons)(scheme *sc, pointer a, pointer b); 197 pointer (*immutable_cons)(scheme *sc, pointer a, pointer b); 198 pointer (*mk_integer)(scheme *sc, long num); 199 pointer (*mk_real)(scheme *sc, double num); 200 pointer (*mk_symbol)(scheme *sc, const char *name); 201 pointer (*gensym)(scheme *sc); 202 pointer (*mk_string)(scheme *sc, const char *str); 203 pointer (*mk_counted_string)(scheme *sc, const char *str, int len); 204 pointer (*mk_character)(scheme *sc, int c); 205 pointer (*mk_vector)(scheme *sc, int len); 206 pointer (*mk_foreign_func)(scheme *sc, foreign_func f); 207 pointer (*find_slot_in_env)(scheme *sc, pointer env, pointer sym, int all); 208 void (*putstr)(scheme *sc, const char *s); 209 void (*putcharacter)(scheme *sc, int c); 210 211 int (*is_string)(pointer p); 212 char *(*string_value)(pointer p); 213 int (*is_number)(pointer p); 214 num (*nvalue)(pointer p); 215 long (*ivalue)(pointer p); 216 double (*rvalue)(pointer p); 217 int (*is_integer)(pointer p); 218 int (*is_real)(pointer p); 219 int (*is_character)(pointer p); 220 long (*charvalue)(pointer p); 221 int (*is_vector)(pointer p); 222 long (*vector_length)(pointer vec); 223 void (*fill_vector)(pointer vec, pointer elem); 224 pointer (*vector_elem)(pointer vec, int ielem); 225 pointer (*set_vector_elem)(pointer vec, int ielem, pointer newel); 226 int (*is_port)(pointer p); 227 228 int (*is_pair)(pointer p); 229 pointer (*pair_car)(pointer p); 230 pointer (*pair_cdr)(pointer p); 231 pointer (*set_car)(pointer p, pointer q); 232 pointer (*set_cdr)(pointer p, pointer q); 233 234 int (*is_symbol)(pointer p); 235 char *(*symname)(pointer p); 236 237 int (*is_syntax)(pointer p); 238 int (*is_proc)(pointer p); 239 int (*is_foreign)(pointer p); 240 char *(*syntaxname)(pointer p); 241 int (*is_closure)(pointer p); 242 int (*is_macro)(pointer p); 243 pointer (*closure_code)(pointer p); 244 pointer (*closure_env)(pointer p); 245 246 int (*is_continuation)(pointer p); 247 int (*is_promise)(pointer p); 248 int (*is_environment)(pointer p); 249 int (*is_immutable)(pointer p); 250 void (*setimmutable)(pointer p); 251 void (*load_file)(scheme *sc, FILE *fin); 252 void (*load_string)(scheme *sc, const char *input); 253 254 #if USE_PROTECT 255 pointer (*protect)(scheme *sc, pointer p); 256 pointer (*unprotect)(scheme *sc, pointer p); 257 #endif 258 259 #if USE_CUSTOM_FINALIZE 260 void (*setcustfin)(pointer p); 261 #endif 262 263 foreign_func (*ffvalue)(pointer arg); /* gmcnutt: new addition */ 264 }; 265 #endif 266 267 #endif 268 269