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