
The overall syntax is:

     (type-of-thing-being-defined  name-used-to-refer-to-this-thing
       (attribute-name  attribute-value-depending-on-the-attribute)
       (attribute-name  attribute-value-depending-on-the-attribute)
       (attribute-name  attribute-value-depending-on-the-attribute))

Some definitions can have a c-declaration field that gives the C code
we parsed to arrive at the definition. The c-declaration is a quoted
string because it can contain parentheses and such.

Defined types and their attributes:

===
(module module-name
  (submodule-of module-name)) ;; submodule is optional

Ex: (module Gtk)
Ex: (module Rgb
      (submodule-of Gdk))

modules are later referred to with a list of module names, like 
(Gdk Rgb) or (Gtk)

Object and boxed type definitions automatically create a submodule.
For example, GtkCList creates the module (module CList (submodule-of
(Gtk))) which is referred to as module (Gtk CList).

===

(type
 (alias some-unique-identifier)
 (in-module module-name)   ;; optional, gchar* is not in a module
 (gtk-type-id gtk-type-system-id) ;; optional, absent if this is not
                                  ;; in the type system
 (is-parametric boolean)          ;; optional default to #f
 (in-c-name name-of-symbol-in-C)
 (out-c-name name-of-symbol-in-C)
 (inout-c-name name-of-symbol-in-C))

Ex: (type
     (alias string)
     (gtk-type-id GTK_TYPE_STRING)
     (in-c-name "const gchar*")
     (out-c-name "gchar**")      ;; actually I'm not sure how strings work out/inout
     (inout-c-name "gchar*"))

 (type
     (alias list)
     (gtk-type-id GTK_TYPE_POINTER)
     (is-parametric #t)
     (in-c-name "GList*")
     (out-c-name "GList**")
     (inout-c-name "GList**"))


 ;; This one would be implied by the (object) def for GtkWidget I
 ;; think - (type) is only required for types that are not implied
 ;; by other definitions, such as int/boolean/etc.
 
    (type
     (alias GtkWidget)
     (in-module (Gtk))
     (gtk-type-id GTK_TYPE_WIDGET)
     (in-c-name "GtkWidget*")
     (inout-c-name "GtkWidget*")
     (out-c-name "GtkWidget**"))

"Type" bindings are automatically assumed for objects, boxed types,
etc. as defined below.

The alias field is used to refer to the type later on.

Whenever a type alias can be used, it is also possible to use the
keyword "native", which implies that the type in question is too
C-specific to represent. Then a c-declaration will typically be
available for use.

C types containing [] or () are function pointers or arrays. For
arrays that don't specify a size, we just treat them as pointers. For
function pointers, we need special (type) syntax/attributes of some
kind, but since there basically aren't any of these right now in the
libs we care about we can just ignore them. For arrays that specify a
size ditto, you would handle them by adding an (array-size) attribute
or something or using the "native" keyword and skipping the (type)
stuff.

===
(object object-name
   (in-module module-name-list)
   (parent object-name optional-module-name-if-different)
   (abstract boolean-is-abstract-class) ;; omit for default of #f
   (c-name name-of-the-object-in-C)
   (field (type-and-name type-alias-of-struct-field name-of-struct-field)
          (access read-or-write-or-readwrite)))
   

Ex: (object Widget
      (in-module (Gtk))
      (parent Object)      ;; could say (parent Object (Gtk))
      (abstract #t)
      (c-name GtkWidget)
      (field (type-and-name GdkWindow* window) (access read)))

An "object" declaration automatically implies the type definition:

(type
  (alias concat-module-elements-and-object-name)
  (in-c-name pointer-to-c-name)
  (out-c-name pointer-to-pointer-to-c-name)
  (inout-c-name pointer-to-c-name))

Ex: 
 (type (alias GtkWidget) 
       (in-c-name GtkWidget*) 
       (out-c-name GtkWidget**) 
       (inout-c-name GtkWidget*))

It also implies a module that is the name broken into parts:
 (module CTree
   (submodule-of Gtk))

===

(function function-name
  (in-module module-name-list) ;; "static methods" go in their
                               ;;  object's module
  (is-constructor-of object-type-alias) ;; optional, marks a constructor
  (c-name function-name)
  (return-type return-value-type) ;; defaults to void
  (caller-owns-return boolean-value) ;; defaults to #f
  (can-return-null boolean-value) ;; defaults to #t
  (parameter in-or-out-or-inout 
      (type-and-name parameter-type-alias parameter-name)
      (type-parameter name-of-contained-type) ;; optional, requires parametric type
      (c-declaration "c-type-and-name")) ;; c-declaration only required
                                         ;; if the type alias is "native"
  (varargs #t) ;; has varargs at the end
)

Ex:
  (function init
    (in-module (Gdk Rgb)
    (c-name gdk_rgb_init)))

Ex: 
  (function new
    (in-module (Gdk Rgb Cmap))
    (is-constructor-of GdkRgbCmap)
    (c-name gdk_rgb_cmap_new)
    (return-type GdkRgbCmap)
    (caller-owns-return #t)   ;; perhaps this could be implied by is-constructor-of
    (parameter in (type-and-name array-of-guint32 colors))
    (parameter in (type-and-name gint n_colors)))

Ex:
  (function config_set_set_handler
   (in-module (Gnome))
   (c-name gnome_config_set_set_handler)
   (parameter in (type-and-name native func)
                 (c-declaration "void (*func)(void*)"))
   (parameter in (type-and-name gpointer data)))  

===
(method method-name
  (of-object object-name module-name)
  ;; retval/arg attributes as for (function), but with first parameter
  ;; omitted for non-constructors
   )
 
Ex:
  (method set_text
     (of-object Label (Gtk))
     (parameter (type-and-name const-gchar* str)))

===
(object-argument arg-name
   (of-object object-we-are-an-argument-of optional-objects-module)
   (type-id argument-type)       ;; GTK_TYPE_OBJECT etc.
   ;; flags all default to #f
   (readable bool-value)
   (writeable bool-value)
   (construct-only bool-value))

Ex:
  (object-argument label
     (of-object Label (Gtk))
     (type GTK_TYPE_STRING)
     (readable #t)
     (writeable #t))

=== 
(signal signal-name
  (run-action bool-value)
  (run-first bool-value)
  (run-last bool-value)
  (of-object object-we-are-a-signal-of optional-objects-module)
  ;; return value and parameters as for a function, omitting the object
  ;; and user data parameters

  ;; what other properties matter for a signal?
)

Ex:
  (signal select_row
     (of-object CList (Gtk))
     (run-first #t)
     ;; return type defaults to void
     (parameter in (type-and-name gint row))
     (parameter in (type-and-name gint column))
     (parameter in (type-and-name GdkEvent* event)))

=== 
(enum enum-name
  (in-module modname)
  (c-name name-in-c)
  (value (nick value-name-noprefixes-hyphen-lowercase) (c-name value-c-name)))

Ex:

  (enum DirectionType
    (in-module Gtk)
    (c-name GtkDirectionType)
    (value (nick tab-forward) (c-name GTK_DIR_TAB_FORWARD))
    (value (nick tab-backward) (c-name GTK_DIR_TAB_BACKWARD))
    (value (nick up) (c-name GTK_DIR_UP))
    (value (nick down) (c-name GTK_DIR_DOWN))
    (value (nick left) (c-name GTK_DIR_LEFT))
    (value (nick right) (c-name GTK_DIR_RIGHT)))

  (enum Pos
    (in-module (Gtk CTree))
    (c-name GtkCTreePos)
    (value (nick before) (c-name GTK_CTREE_POS_BEFORE))
    (value (nick as-child) (c-name GTK_CTREE_POS_AS_CHILD))
    (value (nick after) (c-name GTK_CTREE_POS_AFTER)))

===
(flags) is just like enum, but some bindings may wrap enums and flags differently.
    
===

(boxed boxed-name
  (in-module modname)
  (c-name c-name)
  (ref-func func-to-increase-refcount)
  (copy-func func-to-copy)
  (release-func func-to-destroy-or-decrement-refcount)
  (field (type-and-name type-alias-of-struct-field name-of-struct-field) (access access-rule)))

It is never OK to use memcpy() to copy a boxed type, or use
malloc()/free() to alloc/free one.

Ex:

 (boxed Pixmap
   (in-module (Gdk))
   (c-name GdkPixmap)
   (ref-func pixmap_ref)
   (release-func pixmap_unref))

An "object" declaration automatically implies the type definition:

(type
  (alias concat-module-elements-and-boxed-name)
  (in-c-name pointer-to-c-name)
  (out-c-name pointer-to-pointer-to-c-name)
  (inout-c-name pointer-to-c-name))

Ex: 
 (type (alias GdkPixmap) 
       (in-c-name GdkPixmap*) 
       (out-c-name GdkPixmap**) 
       (inout-c-name GdkPixmap*))


===

(struct struct-name
  (in-module modname)
  (c-name c-name)
  (field (type-and-name type-alias-of-struct-field name-of-struct-field) (access access-rule)))

Unlike a boxed type, a struct type can be copied with memcpy() and
allocated on the stack or with g_malloc().

Ex:
 (struct Rectangle
   (in-module (Gdk))
   (c-name GdkRectangle)
   (field (type-and-name gint16 x) (access readwrite))
   (field (type-and-name gint16 y) (access readwrite))
   (field (type-and-name guint16 width) (access readwrite))
   (field (type-and-name guint16 height) (access readwrite)))

Implies GdkRectangle type alias:

 (type (alias GdkRectangle) 
       (in-c-name GdkRectangle*) 
       (out-c-name GdkRectangle*)    ;; note - not the same as boxed types 
       (inout-c-name GdkRectangle*))

===

(user-function name
  (in-module module)
  (c-name c-typedef-name)
  ;; return-type and parameters as for (function)
)

Ex:

 (user-function PrintFunc
    (in-module (Gtk))
    (parameter in (type-and-name gpointer func_data))
    (parameter in (type-and-name gchar* str)))

===

(typedef new-name
  (in-module module)
  (c-name c-full-name)
  (orig-type alias-of-orig-type))

Ex:

 (typedef Type
   (in-module (Gtk))
   (c-name GtkType)
   (orig-type guint))




  
   

