Added the dispatch layer headers. In order to get this to compile, I had to add stubs...
[rodin/chimara.git] / libchimara / gi_dispa.h
diff --git a/libchimara/gi_dispa.h b/libchimara/gi_dispa.h
new file mode 100644 (file)
index 0000000..e4ac428
--- /dev/null
@@ -0,0 +1,91 @@
+#ifndef _GI_DISPA_H
+#define _GI_DISPA_H
+
+/* gi_dispa.h: Header file for dispatch layer of Glk API, version 0.7.0.
+    Designed by Andrew Plotkin <erkyrath@eblong.com>
+    http://www.eblong.com/zarf/glk/index.html
+
+    This file is copyright 1998-2004 by Andrew Plotkin. You may copy,
+    distribute, and incorporate it into your own programs, by any means
+    and under any conditions, as long as you do not modify it. You may
+    also modify this file, incorporate it into your own programs,
+    and distribute the modified version, as long as you retain a notice
+    in your program or documentation which mentions my name and the URL
+    shown above.
+*/
+
+/* These constants define the classes of opaque objects. It's a bit ugly
+    to put them in this header file, since more classes may be added in
+    the future. But if you find yourself stuck with an obsolete version
+    of this file, adding new class definitions will be easy enough -- 
+    they will be numbered sequentially, and the numeric constants can be 
+    found in the Glk specification. */
+#define gidisp_Class_Window (0)
+#define gidisp_Class_Stream (1)
+#define gidisp_Class_Fileref (2)
+#define gidisp_Class_Schannel (3)
+
+typedef union gluniversal_union {
+    glui32 uint; /* Iu */
+    glsi32 sint; /* Is */
+    void *opaqueref; /* Qa, Qb, Qc... */
+    unsigned char uch; /* Cu */
+    signed char sch; /* Cs */
+    char ch; /* Cn */
+    char *charstr; /* S */
+    glui32 *unicharstr; /* U */
+    void *array; /* all # arguments */
+    glui32 ptrflag; /* [ ... ] or *? */
+} gluniversal_t;
+
+/* Some well-known structures:
+    event_t : [4IuQaIuIu]
+    stream_result_t : [2IuIu] 
+*/
+
+typedef struct gidispatch_function_struct {
+    glui32 id;
+    void *fnptr;
+    char *name;
+} gidispatch_function_t;
+
+typedef struct gidispatch_intconst_struct {
+    char *name;
+    glui32 val;
+} gidispatch_intconst_t;
+
+typedef union glk_objrock_union {
+    glui32 num;
+    void *ptr;
+} gidispatch_rock_t;
+
+/* The following functions are part of the Glk library itself, not the dispatch
+    layer (whose code is in gi_dispa.c). These functions are necessarily
+    implemented in platform-dependent code. 
+*/
+extern void gidispatch_set_object_registry(
+    gidispatch_rock_t (*regi)(void *obj, glui32 objclass), 
+    void (*unregi)(void *obj, glui32 objclass, gidispatch_rock_t objrock));
+extern gidispatch_rock_t gidispatch_get_objrock(void *obj, glui32 objclass);
+extern void gidispatch_set_retained_registry(
+    gidispatch_rock_t (*regi)(void *array, glui32 len, char *typecode), 
+    void (*unregi)(void *array, glui32 len, char *typecode, 
+        gidispatch_rock_t objrock));
+
+/* The following functions make up the Glk dispatch layer. Although they are
+    distributed as part of each Glk library (linked into the library file),
+    their code is in gi_dispa.c, which is platform-independent and identical
+    in every Glk library. 
+*/
+extern void gidispatch_call(glui32 funcnum, glui32 numargs, 
+    gluniversal_t *arglist);
+extern char *gidispatch_prototype(glui32 funcnum);
+extern glui32 gidispatch_count_classes(void);
+extern gidispatch_intconst_t *gidispatch_get_class(glui32 index);
+extern glui32 gidispatch_count_intconst(void);
+extern gidispatch_intconst_t *gidispatch_get_intconst(glui32 index);
+extern glui32 gidispatch_count_functions(void);
+extern gidispatch_function_t *gidispatch_get_function(glui32 index);
+extern gidispatch_function_t *gidispatch_get_function_by_id(glui32 id);
+
+#endif /* _GI_DISPA_H */