tests/gpgscm: Expose function to open streams as Scheme ports.
[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_DL 0
44 # define USE_PLIST 0
45 #endif
46
47 /*
48  * Leave it defined if you want continuations, and also for the Sharp Zaurus.
49  * Undefine it if you only care about faster speed and not strict Scheme compatibility.
50  */
51 #define USE_SCHEME_STACK
52
53 #if USE_DL
54 # define USE_INTERFACE 1
55 #endif
56
57
58 #ifndef USE_MATH         /* If math support is needed */
59 # define USE_MATH 1
60 #endif
61
62 #ifndef USE_CHAR_CLASSIFIERS  /* If char classifiers are needed */
63 # define USE_CHAR_CLASSIFIERS 1
64 #endif
65
66 #ifndef USE_ASCII_NAMES  /* If extended escaped characters are needed */
67 # define USE_ASCII_NAMES 1
68 #endif
69
70 #ifndef USE_STRING_PORTS      /* Enable string ports */
71 # define USE_STRING_PORTS 1
72 #endif
73
74 #ifndef USE_TRACING
75 # define USE_TRACING 1
76 #endif
77
78 #ifndef USE_PLIST
79 # define USE_PLIST 0
80 #endif
81
82 /* To force system errors through user-defined error handling (see *error-hook*) */
83 #ifndef USE_ERROR_HOOK
84 # define USE_ERROR_HOOK 1
85 #endif
86
87 #ifndef USE_COLON_HOOK   /* Enable qualified qualifier */
88 # define USE_COLON_HOOK 1
89 #endif
90
91 #ifndef USE_STRCASECMP   /* stricmp for Unix */
92 # define USE_STRCASECMP 0
93 #endif
94
95 #ifndef USE_STRLWR
96 # define USE_STRLWR 1
97 #endif
98
99 #ifndef STDIO_ADDS_CR    /* Define if DOS/Windows */
100 # define STDIO_ADDS_CR 0
101 #endif
102
103 #ifndef INLINE
104 # define INLINE
105 #endif
106
107 #ifndef USE_INTERFACE
108 # define USE_INTERFACE 0
109 #endif
110
111 #ifndef SHOW_ERROR_LINE   /* Show error line in file */
112 # define SHOW_ERROR_LINE 1
113 #endif
114
115 typedef struct scheme scheme;
116 typedef struct cell *pointer;
117
118 typedef void * (*func_alloc)(size_t);
119 typedef void (*func_dealloc)(void *);
120
121 /* num, for generic arithmetic */
122 typedef struct num {
123      char is_fixnum;
124      union {
125           long ivalue;
126           double rvalue;
127      } value;
128 } num;
129
130 SCHEME_EXPORT scheme *scheme_init_new(void);
131 SCHEME_EXPORT scheme *scheme_init_new_custom_alloc(func_alloc malloc, func_dealloc free);
132 SCHEME_EXPORT int scheme_init(scheme *sc);
133 SCHEME_EXPORT int scheme_init_custom_alloc(scheme *sc, func_alloc, func_dealloc);
134 SCHEME_EXPORT void scheme_deinit(scheme *sc);
135 void scheme_set_input_port_file(scheme *sc, FILE *fin);
136 void scheme_set_input_port_string(scheme *sc, char *start, char *past_the_end);
137 SCHEME_EXPORT void scheme_set_output_port_file(scheme *sc, FILE *fin);
138 void scheme_set_output_port_string(scheme *sc, char *start, char *past_the_end);
139 SCHEME_EXPORT void scheme_load_file(scheme *sc, FILE *fin);
140 SCHEME_EXPORT void scheme_load_named_file(scheme *sc, FILE *fin, const char *filename);
141 SCHEME_EXPORT void scheme_load_string(scheme *sc, const char *cmd);
142 SCHEME_EXPORT pointer scheme_apply0(scheme *sc, const char *procname);
143 SCHEME_EXPORT pointer scheme_call(scheme *sc, pointer func, pointer args);
144 SCHEME_EXPORT pointer scheme_eval(scheme *sc, pointer obj);
145 void scheme_set_external_data(scheme *sc, void *p);
146 SCHEME_EXPORT void scheme_define(scheme *sc, pointer env, pointer symbol, pointer value);
147
148 typedef pointer (*foreign_func)(scheme *, pointer);
149
150 pointer _cons(scheme *sc, pointer a, pointer b, int immutable);
151 pointer mk_integer(scheme *sc, long num);
152 pointer mk_real(scheme *sc, double num);
153 pointer mk_symbol(scheme *sc, const char *name);
154 pointer gensym(scheme *sc);
155 pointer mk_string(scheme *sc, const char *str);
156 pointer mk_counted_string(scheme *sc, const char *str, int len);
157 pointer mk_empty_string(scheme *sc, int len, char fill);
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 int list_length(scheme *sc, pointer a);
162 int eqv(pointer a, pointer b);
163
164
165 #if USE_INTERFACE
166 struct scheme_interface {
167   void (*scheme_define)(scheme *sc, pointer env, pointer symbol, pointer value);
168   pointer (*cons)(scheme *sc, pointer a, pointer b);
169   pointer (*immutable_cons)(scheme *sc, pointer a, pointer b);
170   pointer (*reserve_cells)(scheme *sc, int n);
171   pointer (*mk_integer)(scheme *sc, long num);
172   pointer (*mk_real)(scheme *sc, double num);
173   pointer (*mk_symbol)(scheme *sc, const char *name);
174   pointer (*gensym)(scheme *sc);
175   pointer (*mk_string)(scheme *sc, const char *str);
176   pointer (*mk_counted_string)(scheme *sc, const char *str, int len);
177   pointer (*mk_character)(scheme *sc, int c);
178   pointer (*mk_vector)(scheme *sc, int len);
179   pointer (*mk_foreign_func)(scheme *sc, foreign_func f);
180   void (*putstr)(scheme *sc, const char *s);
181   void (*putcharacter)(scheme *sc, int c);
182
183   int (*is_string)(pointer p);
184   char *(*string_value)(pointer p);
185   int (*is_number)(pointer p);
186   num (*nvalue)(pointer p);
187   long (*ivalue)(pointer p);
188   double (*rvalue)(pointer p);
189   int (*is_integer)(pointer p);
190   int (*is_real)(pointer p);
191   int (*is_character)(pointer p);
192   long (*charvalue)(pointer p);
193   int (*is_list)(scheme *sc, pointer p);
194   int (*is_vector)(pointer p);
195   int (*list_length)(scheme *sc, pointer vec);
196   long (*vector_length)(pointer vec);
197   void (*fill_vector)(pointer vec, pointer elem);
198   pointer (*vector_elem)(pointer vec, int ielem);
199   pointer (*set_vector_elem)(pointer vec, int ielem, pointer newel);
200   int (*is_port)(pointer p);
201
202   int (*is_pair)(pointer p);
203   pointer (*pair_car)(pointer p);
204   pointer (*pair_cdr)(pointer p);
205   pointer (*set_car)(pointer p, pointer q);
206   pointer (*set_cdr)(pointer p, pointer q);
207
208   int (*is_symbol)(pointer p);
209   char *(*symname)(pointer p);
210
211   int (*is_syntax)(pointer p);
212   int (*is_proc)(pointer p);
213   int (*is_foreign)(pointer p);
214   char *(*syntaxname)(pointer p);
215   int (*is_closure)(pointer p);
216   int (*is_macro)(pointer p);
217   pointer (*closure_code)(pointer p);
218   pointer (*closure_env)(pointer p);
219
220   int (*is_continuation)(pointer p);
221   int (*is_promise)(pointer p);
222   int (*is_environment)(pointer p);
223   int (*is_immutable)(pointer p);
224   void (*setimmutable)(pointer p);
225   void (*load_file)(scheme *sc, FILE *fin);
226   void (*load_string)(scheme *sc, const char *input);
227   pointer (*mk_port_from_file)(scheme *sc, FILE *f, int kind);
228 };
229 #endif
230
231 #if !STANDALONE
232 typedef struct scheme_registerable
233 {
234   foreign_func  f;
235   const char *  name;
236 }
237 scheme_registerable;
238
239 void scheme_register_foreign_func_list(scheme * sc,
240                                        scheme_registerable * list,
241                                        int n);
242
243 #endif /* !STANDALONE */
244
245 #ifdef __cplusplus
246 }
247 #endif
248
249 #endif
250
251
252 /*
253 Local variables:
254 c-file-style: "k&r"
255 End:
256 */