aboutsummaryrefslogtreecommitdiffstats
path: root/tests/gpgscm/scheme.h
diff options
context:
space:
mode:
authorJustus Winter <[email protected]>2016-03-31 11:49:56 +0000
committerJustus Winter <[email protected]>2016-06-17 09:38:00 +0000
commit56c36f2932fe2baf8e46efdea4315cf33f3c0338 (patch)
tree4d7bbf6ad0c7660c836b94aded9cc1af7e366a69 /tests/gpgscm/scheme.h
parenttests/gpgscm: Dynamically allocate string buffer. (diff)
downloadgnupg-56c36f2932fe2baf8e46efdea4315cf33f3c0338.tar.gz
gnupg-56c36f2932fe2baf8e46efdea4315cf33f3c0338.zip
tests/gpgscm: Foreign objects support for TinySCHEME.
* tests/gpgscm/scheme-private.h (struct cell): Add 'foreign_object'. (is_foreign_object): New prototype. (get_foreign_object_{vtable,data}): Likewise. * tests/gpgscm/scheme.c (enum scheme_types): New type. (is_foreign_object): New function. (get_foreign_object_{vtable,data}): Likewise. (mk_foreign_object): Likewise. (finalize_cell): Free foreign objects. (atom2str): Pretty-print foreign objects. (vtbl): Add new functions. * tests/gpgscm/scheme.h (struct foreign_object_vtable): New type. (mk_foreign_object): New prototype. (struct scheme_interface): Add new functions. Patch from Thomas Munro, https://sourceforge.net/p/tinyscheme/patches/13/ Signed-off-by: Justus Winter <[email protected]>
Diffstat (limited to 'tests/gpgscm/scheme.h')
-rw-r--r--tests/gpgscm/scheme.h10
1 files changed, 10 insertions, 0 deletions
diff --git a/tests/gpgscm/scheme.h b/tests/gpgscm/scheme.h
index 4ba2daa76..f4231c474 100644
--- a/tests/gpgscm/scheme.h
+++ b/tests/gpgscm/scheme.h
@@ -118,6 +118,12 @@ typedef struct cell *pointer;
typedef void * (*func_alloc)(size_t);
typedef void (*func_dealloc)(void *);
+/* table of functions required for foreign objects */
+typedef struct foreign_object_vtable {
+ void (*finalize)(scheme *sc, void *data);
+ void (*to_string)(scheme *sc, char *out, size_t size, void *data);
+} foreign_object_vtable;
+
/* num, for generic arithmetic */
typedef struct num {
char is_fixnum;
@@ -157,6 +163,7 @@ pointer mk_counted_string(scheme *sc, const char *str, int len);
pointer mk_empty_string(scheme *sc, int len, char fill);
pointer mk_character(scheme *sc, int c);
pointer mk_foreign_func(scheme *sc, foreign_func f);
+pointer mk_foreign_object(scheme *sc, const foreign_object_vtable *vtable, void *data);
void putstr(scheme *sc, const char *s);
int list_length(scheme *sc, pointer a);
int eqv(pointer a, pointer b);
@@ -177,6 +184,9 @@ struct scheme_interface {
pointer (*mk_character)(scheme *sc, int c);
pointer (*mk_vector)(scheme *sc, int len);
pointer (*mk_foreign_func)(scheme *sc, foreign_func f);
+ pointer (*mk_foreign_object)(scheme *sc, const foreign_object_vtable *vtable, void *data);
+ const foreign_object_vtable *(*get_foreign_object_vtable)(pointer p);
+ void *(*get_foreign_object_data)(pointer p);
void (*putstr)(scheme *sc, const char *s);
void (*putcharacter)(scheme *sc, int c);