#!/usr/bin/env python
# -*- Mode: Python; py-indent-offset: 4 -*-

# This script creates the files "gtkextramodule_defs.h" and
# "gtkextramodule_impl.h".  Both files are required by the bindings
# for PyGTK 0.6.x.

import sys, os, string, re
sys.path.insert(0, os.path.join(os.pardir, 'codegen'))
import defsparser, generate

overrides = [
    "gtk_color_combo_new_with_values",
    "gtk_plot3d_new_with_size",
    "gtk_plot_csurface_new_function",
    "gtk_plot_data_new_function",
    "gtk_plot_new_with_size",
    "gtk_plot_polar_new_with_size",
    "gtk_plot_surface_new_function",
    "gtk_sheet_new_browser",
    "gtk_sheet_new_with_custom_entry",
    "gtk_plot_set_pc",
    "gtk_plot_canvas_set_pc",
    "gtk_plot_data_new_iterator",
    ]

types = {
    "GtkJustification": "int",
    "GtkOrientation": "int",
    "GtkPlotAxisPos": "int",
    "GtkPlotBorderStyle": "int",
    "GtkPlotCanvasArrow": "int",
    "GtkPlotCanvasSelection": "int",
    "GtkPlotCanvasSelectionMode": "int",
    "GtkPlotConnector": "int",
    "GtkPlotLineStyle": "int",
    "GtkPlotOrientation": "int",
    "GtkPlotPlane": "int",
    "GtkPlotScale": "int",
    "GtkPlotSide": "int",
    "GtkPlotSymbolStyle": "int",
    "GtkPlotSymbolType": "int",
    "GtkStateType": "int",
    "GtkType": "uint",
    "const-GdkColor*": "GdkColor",
    "const-gchar*": "string",
    "gboolean": "bool",
    "gchar*": "string",
    "gdouble": "double",
    "gfloat": "float",
    "gint": "int",
    "guint": "uint",
    "guint16": "uint",
    }

def maptype(type):
    if types.has_key(type):
        type = types[type]
    else:
        type = string.replace(type, "*", "")
    return type

def mapret(type):
    type = maptype(type)
    if type == "string":
        type = "static_string"
    return type
    
def write_defs(parser, overrides, fp=sys.stdout):
    fp.write("; -*- scheme -*-\n\n")
    for o in parser.objects:
        fp.write("(define-object Gtk" + o.name + " (" + o.parent + ")")
        if o.fields:
            fp.write("\n  (fields")
            for (type, name) in o.fields:
                fp.write("\n   (" + maptype(type) + " " + name + ")")
            fp.write(")")
        fp.write(")\n\n")
    for f in parser.functions:
        if f.c_name in overrides:
            fp.write(";(define-func " + f.c_name + ")\n\n")
        else:
            fp.write("(define-func " + f.c_name + "\n  " + mapret(f.ret)
                     + "\n  (")
            n = 0
            if isinstance(f, defsparser.MethodDef):
                fp.write("(" + f.of_object + " obj)")
                n = n + 1
            for (type, name, default, nullok) in f.params:
                if n:
                    fp.write("\n   ")
                fp.write("(" + maptype(type) + " " + name)
                if nullok:
                    fp.write(" (null-ok)")
                if default:
                    fp.write(" (= \"" + default + "\")")
                fp.write(")")
                n = n + 1
            fp.write ("))\n\n")

def read_overrides(filename):
    rexp = re.compile('_wrap_([a-zA-Z0-9_]*),')
    input = open(filename)
    while 1:
        line = input.readline()
        if not line:
            break
        match = rexp.search(line)
        if match:
            overrides.append(match.group(1))
    input.close()
    return overrides

if __name__ == '__main__':
    import tempfile
    # Convert the new defs into old defs.
    overrides = read_overrides('gtkextramodule.c')
    parser = defsparser.DefsParser('gtkextra.defs')
    parser.startParsing()
    defsname = tempfile.mktemp()
    defs = open(defsname, "w")
    write_defs(parser, overrides, defs)
    defs.close()
    # Create gtkextramodule_defs.h and gtkextramodule_impl.h.
    p = generate.FilteringParser(input=defsname,
                                 prefix='gtkextramodule')
    generate.TypesParser.define_object(p, "GtkWidget")
    generate.TypesParser.define_object(p, "GtkAdjustment")
    p.startParsing()
    os.unlink(defsname)
