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