gerbv  2.10.1-dev~93f1b5
scheme.h
Go to the documentation of this file.
1 /* SCHEME.H */
2 
8 #ifndef _SCHEME_H
9 #define _SCHEME_H
10 
11 #include <stdio.h>
12 
13 #ifdef HAVE_CONFIG_H
14 #include <config.h>
15 #endif
16 
17 /*
18  * Default values for #define'd symbols
19  */
20 #ifndef STANDALONE /* If used as standalone interpreter */
21 #define STANDALONE 1
22 #endif
23 
24 #if !defined(_MSC_VER) && !defined(__MINGW32__)
25 #define USE_STRCASECMP 1
26 #define USE_STRLWR 1
27 #define SCHEME_EXPORT
28 #else
29 #define USE_STRCASECMP 0
30 #define USE_STRLWR 0
31 #if defined(__MINGW32__)
32 #define SCHEME_EXPORT
33 #else
34 #ifdef _SCHEME_SOURCE
35 #define SCHEME_EXPORT __declspec(dllexport)
36 #else
37 #define SCHEME_EXPORT __declspec(dllimport)
38 #endif
39 #endif
40 #endif
41 
42 #if USE_NO_FEATURES
43 #define USE_MATH 0
44 #define USE_CHAR_CLASSIFIERS 0
45 #define USE_ASCII_NAMES 0
46 #define USE_STRING_PORTS 0
47 #define USE_ERROR_HOOK 0
48 #define USE_TRACING 0
49 #define USE_COLON_HOOK 0
50 #define USE_DL 0
51 #define USE_PLIST 0
52 #endif
53 
54 /*
55  * Leave it defined if you want continuations, and also for the Sharp Zaurus.
56  * Undefine it if you only care about faster speed and not strict Scheme compatibility.
57  */
58 #define USE_SCHEME_STACK
59 
60 #if USE_DL
61 #define USE_INTERFACE 1
62 #endif
63 
64 #ifndef USE_MATH /* If math support is needed */
65 #define USE_MATH 1
66 #endif
67 
68 #ifndef USE_CHAR_CLASSIFIERS /* If char classifiers are needed */
69 #define USE_CHAR_CLASSIFIERS 1
70 #endif
71 
72 #ifndef USE_ASCII_NAMES /* If extended escaped characters are needed */
73 #define USE_ASCII_NAMES 1
74 #endif
75 
76 #ifndef USE_STRING_PORTS /* Enable string ports */
77 #define USE_STRING_PORTS 1
78 #endif
79 
80 #ifndef USE_TRACING
81 #define USE_TRACING 1
82 #endif
83 
84 #ifndef USE_PLIST
85 #define USE_PLIST 0
86 #endif
87 
88 /* To force system errors through user-defined error handling (see *error-hook*) */
89 #ifndef USE_ERROR_HOOK
90 #define USE_ERROR_HOOK 1
91 #endif
92 
93 #ifndef USE_COLON_HOOK /* Enable qualified qualifier */
94 #define USE_COLON_HOOK 1
95 #endif
96 
97 #ifndef USE_STRCASECMP /* stricmp for Unix */
98 #define USE_STRCASECMP 0
99 #endif
100 
101 #ifndef USE_STRLWR
102 #define USE_STRLWR 1
103 #endif
104 
105 #ifndef STDIO_ADDS_CR /* Define if DOS/Windows */
106 #define STDIO_ADDS_CR 0
107 #endif
108 
109 #ifndef INLINE
110 #define INLINE
111 #endif
112 
113 #ifndef USE_INTERFACE
114 #define USE_INTERFACE 0
115 #endif
116 
117 typedef struct scheme scheme;
118 typedef struct cell* pointer;
119 
120 typedef void* (*func_alloc)(size_t);
121 typedef void (*func_dealloc)(void*);
122 
123 /* num, for generic arithmetic */
124 typedef struct num {
125  char is_fixnum;
126 
127  union {
128  long ivalue;
129  double rvalue;
130  } value;
131 } num;
132 
133 SCHEME_EXPORT scheme* scheme_init_new();
134 SCHEME_EXPORT scheme* scheme_init_new_custom_alloc(func_alloc malloc, func_dealloc free);
135 SCHEME_EXPORT int scheme_init(scheme* sc);
136 SCHEME_EXPORT int scheme_init_custom_alloc(scheme* sc, func_alloc, func_dealloc);
137 SCHEME_EXPORT void scheme_deinit(scheme* sc);
138 void scheme_set_input_port_file(scheme* sc, FILE* fin);
139 void scheme_set_input_port_string(scheme* sc, char* start, char* past_the_end);
140 SCHEME_EXPORT void scheme_set_output_port_file(scheme* sc, FILE* fin);
141 void scheme_set_output_port_string(scheme* sc, char* start, char* past_the_end);
142 SCHEME_EXPORT void scheme_load_file(scheme* sc, FILE* fin);
143 SCHEME_EXPORT void scheme_load_string(scheme* sc, const char* cmd);
144 void scheme_apply0(scheme* sc, const char* procname);
145 SCHEME_EXPORT pointer scheme_apply1(scheme* sc, const char* procname, pointer);
146 void scheme_set_external_data(scheme* sc, void* p);
147 SCHEME_EXPORT void scheme_define(scheme* sc, pointer env, pointer symbol, pointer value);
148 
149 typedef pointer (*foreign_func)(scheme*, pointer);
150 
151 pointer _cons(scheme* sc, pointer a, pointer b, int immutable);
152 pointer mk_integer(scheme* sc, long num);
153 pointer mk_real(scheme* sc, double num);
154 pointer mk_symbol(scheme* sc, const char* name);
155 pointer gensym(scheme* sc);
156 pointer mk_string(scheme* sc, const char* str);
157 pointer mk_counted_string(scheme* sc, const char* str, int len);
158 pointer mk_character(scheme* sc, int c);
159 pointer mk_foreign_func(scheme* sc, foreign_func f);
160 void putstr(scheme* sc, const char* s);
161 
162 #if USE_INTERFACE
163 struct scheme_interface {
164  void (*scheme_define)(scheme* sc, pointer env, pointer symbol, pointer value);
165  pointer (*cons)(scheme* sc, pointer a, pointer b);
166  pointer (*immutable_cons)(scheme* sc, pointer a, pointer b);
167  pointer (*mk_integer)(scheme* sc, long num);
168  pointer (*mk_real)(scheme* sc, double num);
169  pointer (*mk_symbol)(scheme* sc, const char* name);
170  pointer (*gensym)(scheme* sc);
171  pointer (*mk_string)(scheme* sc, const char* str);
172  pointer (*mk_counted_string)(scheme* sc, const char* str, int len);
173  pointer (*mk_character)(scheme* sc, int c);
174  pointer (*mk_vector)(scheme* sc, int len);
175  pointer (*mk_foreign_func)(scheme* sc, foreign_func f);
176  void (*putstr)(scheme* sc, const char* s);
177  void (*putcharacter)(scheme* sc, int c);
178 
179  int (*is_string)(pointer p);
180  char* (*string_value)(pointer p);
181  int (*is_number)(pointer p);
182  num (*nvalue)(pointer p);
183  long (*ivalue)(pointer p);
184  double (*rvalue)(pointer p);
185  int (*is_integer)(pointer p);
186  int (*is_real)(pointer p);
187  int (*is_character)(pointer p);
188  long (*charvalue)(pointer p);
189  int (*is_vector)(pointer p);
190  long (*vector_length)(pointer vec);
191  void (*fill_vector)(pointer vec, pointer elem);
192  pointer (*vector_elem)(pointer vec, int ielem);
193  pointer (*set_vector_elem)(pointer vec, int ielem, pointer newel);
194  int (*is_port)(pointer p);
195 
196  int (*is_pair)(pointer p);
197  pointer (*pair_car)(pointer p);
198  pointer (*pair_cdr)(pointer p);
199  pointer (*set_car)(pointer p, pointer q);
200  pointer (*set_cdr)(pointer p, pointer q);
201 
202  int (*is_symbol)(pointer p);
203  char* (*symname)(pointer p);
204 
205  int (*is_syntax)(pointer p);
206  int (*is_proc)(pointer p);
207  int (*is_foreign)(pointer p);
208  char* (*syntaxname)(pointer p);
209  int (*is_closure)(pointer p);
210  int (*is_macro)(pointer p);
211  pointer (*closure_code)(pointer p);
212  pointer (*closure_env)(pointer p);
213 
214  int (*is_continuation)(pointer p);
215  int (*is_promise)(pointer p);
216  int (*is_environment)(pointer p);
217  int (*is_immutable)(pointer p);
218  void (*setimmutable)(pointer p);
219  void (*load_file)(scheme* sc, FILE* fin);
220  void (*load_string)(scheme* sc, const char* input);
221 };
222 #endif
223 
224 #endif