gpgscm: Use a static pool of cells for small integers.
[gnupg.git] / tests / gpgscm / scheme.h
1 /* SCHEME.H */
2
3 #ifndef _SCHEME_H
4 #define _SCHEME_H
5
6 #include <stdio.h>
7
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11
12 /*
13  * Default values for #define'd symbols
14  */
15 #ifndef STANDALONE       /* If used as standalone interpreter */
16 # define STANDALONE 1
17 #endif
18
19 #ifndef _MSC_VER
20 # define USE_STRCASECMP 1
21 # ifndef USE_STRLWR
22 #   define USE_STRLWR 1
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_COMPILE_HOOK 0
44 # define USE_DL 0
45 # define USE_PLIST 0
46 # define USE_SMALL_INTEGERS 0
47 #endif
48
49
50 #if USE_DL
51 # define USE_INTERFACE 1
52 #endif
53
54
55 #ifndef USE_MATH         /* If math support is needed */
56 # define USE_MATH 1
57 #endif
58
59 #ifndef USE_CHAR_CLASSIFIERS  /* If char classifiers are needed */
60 # define USE_CHAR_CLASSIFIERS 1
61 #endif
62
63 #ifndef USE_ASCII_NAMES  /* If extended escaped characters are needed */
64 # define USE_ASCII_NAMES 1
65 #endif
66
67 #ifndef USE_STRING_PORTS      /* Enable string ports */
68 # define USE_STRING_PORTS 1
69 #endif
70
71 #ifndef USE_TRACING
72 # define USE_TRACING 1
73 #endif
74
75 #ifndef USE_PLIST
76 # define USE_PLIST 0
77 #endif
78
79 /* To force system errors through user-defined error handling (see *error-hook*) */
80 #ifndef USE_ERROR_HOOK
81 # define USE_ERROR_HOOK 1
82 #endif
83
84 #ifndef USE_COLON_HOOK   /* Enable qualified qualifier */
85 # define USE_COLON_HOOK 1
86 #endif
87
88 /* Compile functions using *compile-hook*.  The default hook expands
89  * macros.  */
90 #ifndef USE_COMPILE_HOOK
91 # define USE_COMPILE_HOOK 1
92 #endif
93
94 /* Enable faster opcode dispatch.  */
95 #ifndef USE_THREADED_CODE
96 # define USE_THREADED_CODE 1
97 #endif
98
99 /* Use a static set of cells to represent small numbers.  This set
100  * notably includes all opcodes, and hence saves a cell reservation
101  * during 's_save'.  */
102 #ifndef USE_SMALL_INTEGERS
103 # define USE_SMALL_INTEGERS 1
104 #endif
105
106 #ifndef USE_STRCASECMP   /* stricmp for Unix */
107 # define USE_STRCASECMP 0
108 #endif
109
110 #ifndef USE_STRLWR
111 # define USE_STRLWR 1
112 #endif
113
114 #ifndef STDIO_ADDS_CR    /* Define if DOS/Windows */
115 # define STDIO_ADDS_CR 0
116 #endif
117
118 #ifndef INLINE
119 # define INLINE
120 #endif
121
122 #ifndef USE_INTERFACE
123 # define USE_INTERFACE 0
124 #endif
125
126 #ifndef SHOW_ERROR_LINE   /* Show error line in file */
127 # define SHOW_ERROR_LINE 1
128 #endif
129
130 typedef struct scheme scheme;
131 typedef struct cell *pointer;
132
133 typedef void * (*func_alloc)(size_t);
134 typedef void (*func_dealloc)(void *);
135
136 /* table of functions required for foreign objects */
137 typedef struct foreign_object_vtable {
138      void (*finalize)(scheme *sc, void *data);
139      void (*to_string)(scheme *sc, char *out, size_t size, void *data);
140 } foreign_object_vtable;
141
142 /* num, for generic arithmetic */
143 typedef struct num {
144      char is_fixnum;
145      union {
146           long ivalue;
147           double rvalue;
148      } value;
149 } num;
150
151 SCHEME_EXPORT scheme *scheme_init_new(void);
152 SCHEME_EXPORT scheme *scheme_init_new_custom_alloc(func_alloc malloc, func_dealloc free);
153 SCHEME_EXPORT int scheme_init(scheme *sc);
154 SCHEME_EXPORT int scheme_init_custom_alloc(scheme *sc, func_alloc, func_dealloc);
155 SCHEME_EXPORT void scheme_deinit(scheme *sc);
156 void scheme_set_input_port_file(scheme *sc, FILE *fin);
157 void scheme_set_input_port_string(scheme *sc, char *start, char *past_the_end);
158 SCHEME_EXPORT void scheme_set_output_port_file(scheme *sc, FILE *fin);
159 void scheme_set_output_port_string(scheme *sc, char *start, char *past_the_end);
160 SCHEME_EXPORT void scheme_load_file(scheme *sc, FILE *fin);
161 SCHEME_EXPORT void scheme_load_named_file(scheme *sc, FILE *fin, const char *filename);
162 SCHEME_EXPORT void scheme_load_string(scheme *sc, const char *cmd);
163 SCHEME_EXPORT pointer scheme_apply0(scheme *sc, const char *procname);
164 SCHEME_EXPORT pointer scheme_call(scheme *sc, pointer func, pointer args);
165 SCHEME_EXPORT pointer scheme_eval(scheme *sc, pointer obj);
166 void scheme_set_external_data(scheme *sc, void *p);
167 SCHEME_EXPORT void scheme_define(scheme *sc, pointer env, pointer symbol, pointer value);
168
169 typedef pointer (*foreign_func)(scheme *, pointer);
170
171 pointer _cons(scheme *sc, pointer a, pointer b, int immutable);
172 pointer mk_integer(scheme *sc, long num);
173 pointer mk_real(scheme *sc, double num);
174 pointer mk_symbol(scheme *sc, const char *name);
175 pointer gensym(scheme *sc);
176 pointer mk_string(scheme *sc, const char *str);
177 pointer mk_counted_string(scheme *sc, const char *str, int len);
178 pointer mk_empty_string(scheme *sc, int len, char fill);
179 pointer mk_character(scheme *sc, int c);
180 pointer mk_foreign_func(scheme *sc, foreign_func f);
181 pointer mk_foreign_object(scheme *sc, const foreign_object_vtable *vtable, void *data);
182 void putstr(scheme *sc, const char *s);
183 int list_length(scheme *sc, pointer a);
184 int eqv(pointer a, pointer b);
185
186
187 #if USE_INTERFACE
188 struct scheme_interface {
189   void (*scheme_define)(scheme *sc, pointer env, pointer symbol, pointer value);
190   pointer (*cons)(scheme *sc, pointer a, pointer b);
191   pointer (*immutable_cons)(scheme *sc, pointer a, pointer b);
192   pointer (*reserve_cells)(scheme *sc, int n);
193   pointer (*mk_integer)(scheme *sc, long num);
194   pointer (*mk_real)(scheme *sc, double num);
195   pointer (*mk_symbol)(scheme *sc, const char *name);
196   pointer (*gensym)(scheme *sc);
197   pointer (*mk_string)(scheme *sc, const char *str);
198   pointer (*mk_counted_string)(scheme *sc, const char *str, int len);
199   pointer (*mk_character)(scheme *sc, int c);
200   pointer (*mk_vector)(scheme *sc, int len);
201   pointer (*mk_foreign_func)(scheme *sc, foreign_func f);
202   pointer (*mk_foreign_object)(scheme *sc, const foreign_object_vtable *vtable, void *data);
203   const foreign_object_vtable *(*get_foreign_object_vtable)(pointer p);
204   void *(*get_foreign_object_data)(pointer p);
205   void (*putstr)(scheme *sc, const char *s);
206   void (*putcharacter)(scheme *sc, int c);
207
208   int (*is_string)(pointer p);
209   char *(*string_value)(pointer p);
210   int (*is_number)(pointer p);
211   num (*nvalue)(pointer p);
212   long (*ivalue)(pointer p);
213   double (*rvalue)(pointer p);
214   int (*is_integer)(pointer p);
215   int (*is_real)(pointer p);
216   int (*is_character)(pointer p);
217   long (*charvalue)(pointer p);
218   int (*is_list)(scheme *sc, pointer p);
219   int (*is_vector)(pointer p);
220   int (*list_length)(scheme *sc, pointer vec);
221   long (*vector_length)(pointer vec);
222   void (*fill_vector)(pointer vec, pointer elem);
223   pointer (*vector_elem)(pointer vec, int ielem);
224   pointer (*set_vector_elem)(pointer vec, int ielem, pointer newel);
225   int (*is_port)(pointer p);
226
227   int (*is_pair)(pointer p);
228   pointer (*pair_car)(pointer p);
229   pointer (*pair_cdr)(pointer p);
230   pointer (*set_car)(pointer p, pointer q);
231   pointer (*set_cdr)(pointer p, pointer q);
232
233   int (*is_symbol)(pointer p);
234   char *(*symname)(pointer p);
235
236   int (*is_syntax)(pointer p);
237   int (*is_proc)(pointer p);
238   int (*is_foreign)(pointer p);
239   char *(*syntaxname)(pointer p);
240   int (*is_closure)(pointer p);
241   int (*is_macro)(pointer p);
242   pointer (*closure_code)(pointer p);
243   pointer (*closure_env)(pointer p);
244
245   int (*is_continuation)(pointer p);
246   int (*is_promise)(pointer p);
247   int (*is_environment)(pointer p);
248   int (*is_immutable)(pointer p);
249   void (*setimmutable)(pointer p);
250   void (*load_file)(scheme *sc, FILE *fin);
251   void (*load_string)(scheme *sc, const char *input);
252   pointer (*mk_port_from_file)(scheme *sc, FILE *f, int kind);
253 };
254 #endif
255
256 #if !STANDALONE
257 typedef struct scheme_registerable
258 {
259   foreign_func  f;
260   const char *  name;
261 }
262 scheme_registerable;
263
264 void scheme_register_foreign_func_list(scheme * sc,
265                                        scheme_registerable * list,
266                                        int n);
267
268 #endif /* !STANDALONE */
269
270 #ifdef __cplusplus
271 }
272 #endif
273
274 #endif
275
276
277 /*
278 Local variables:
279 c-file-style: "k&r"
280 End:
281 */