#!/usr/bin/perl -w

# Create threads safe wrappers around X11 calls.
#
# Copyright 1998 Kristian Nielsen.
#

# FIXME: This does not do full C prototype parsing, but relies on
# knowledge on how the X11 include files are formatted. It will
# probably need to be modified for new include files. It also fails
# for certain prototypes (notably those with function pointer
# arguments or results), so these must be added manually. And it
# relies on a fixed location of X11 includes (/usr/X11R6/include/).
#
# This program expects to be run from Wine's main directory.

$X11_include_dir = "/usr/X11/include";
$outdir = "tsx11";
$wantfile = "$outdir/X11_calls";
@dolist = ("Xlib", "Xresource", "Xutil", "xpm", "XShm", "xf86dga", "xf86dga2", "xf86vmode");

# First read list of wanted function names.

open(WANT, $wantfile) || die "open";
while(<WANT>) {
    next if /^\s*\#/;		# Skip comment lines.
    next if /^\s*$/;		# Skip empty lines.
    if(/^\s*([a-zA-Z0-9_]+)\s*$/) {
	$want{$1} = 1;
    } else {
	die "syntax error in file '$wantfile', in line '$_'";
    }
}
close(WANT);

foreach $name (@dolist) {

    $ucname = uc $name;
    $lcname = lc $name;

    $outfile = "/ts_$lcname";
    open(OUTC, ">$outdir/$outfile.c") || die "open";
    open(OUTH, ">include/$outfile.h") || die "open";

    $x11_incl = "";
    $extensions_dir = "";
    $pre_file = "";
    $post_file = "";
    $inc_name = $name;
    if($name eq "Xutil" || $name eq "Xresource" || $name eq "XShm") {
	$x11_incl = "#include <X11/Xlib.h>\n";
	# For Xutil, we need X11/Xresource.h for XUniqueContext().
	$x11_incl .= "#include <X11/Xresource.h>\n" if $name eq "Xutil";
    }
    if($name eq "xf86dga")  {
    	$x11_incl = "#include <X11/Xlib.h>\n";
	$extensions_dir = "extensions/";
	$pre_file = "#ifdef HAVE_LIBXXF86DGA\n";
	$post_file = "#endif /* defined(HAVE_LIBXXF86DGA) */\n";
    }
    if($name eq "xf86dga2")  {
    	$x11_incl = "#include <X11/Xlib.h>\n";
	$extensions_dir = "extensions/";
	$pre_file = "#ifdef HAVE_LIBXXF86DGA2\n";
	$post_file = "#endif /* defined(HAVE_LIBXXF86DGA2) */\n";
	$inc_name = "xf86dga";
    }
    if($name eq "XShm") {
	$extensions_dir = "extensions/";
	$pre_file = "#ifdef HAVE_LIBXXSHM\n";
	$post_file = "#endif /* defined(HAVE_LIBXXSHM) */\n";
    }
    if($name eq "xpm") {
	$pre_file = "#ifdef HAVE_LIBXXPM\n";
	$post_file = "#endif /* defined(HAVE_LIBXXPM) */\n";
    }
    if($name eq "xf86vmode") {
     	$x11_incl = "#include <X11/Xlib.h>\n";
	$extensions_dir = "extensions/";
	$pre_file = "#include \"windef.h\"\n#ifdef HAVE_LIBXXF86VM\n#define XMD_H\n#include \"basetsd.h\"\n";
	$post_file = "#endif /* defined(HAVE_LIBXXF86VM) */\n";
    }

    print OUTH <<END;
/*
 * Thread safe wrappers around $name calls.
 * Always include this file instead of <X11/$name.h>.
 * This file was generated automatically by tools/make_X11wrappers
 *
 * Copyright 1998 Kristian Nielsen
 */

#ifndef __WINE_TS_$ucname\_H
#define __WINE_TS_$ucname\_H

#include "config.h"

#ifndef X_DISPLAY_MISSING

$pre_file
$x11_incl#include <X11/$extensions_dir$inc_name.h>

END

    print OUTC <<END;
/*
 * Thread safe wrappers around $name calls.
 * This file was generated automatically by tools/make_X11wrappers
 * DO NOT EDIT!
 */

#include "config.h"

#ifndef X_DISPLAY_MISSING

$pre_file
$x11_incl#include <X11/$extensions_dir$inc_name.h>

#include "debugtools.h"
#include "ts_$lcname.h"
#include "x11drv.h"

DEFAULT_DEBUG_CHANNEL(x11)
END

    if($name eq "xpm") {	# Handle as special case.
	output_fn("XpmCreatePixmapFromData", "int",
		  "Display *, Drawable, char **, Pixmap *, Pixmap *, XpmAttributes *",
		  "Display *a0, Drawable a1, char **a2, Pixmap *a3, Pixmap *a4, XpmAttributes *a5",
		  "a0, a1, a2, a3, a4, a5");
	output_fn("XpmAttributesSize", "int", "void", "void", "");
    } elsif($name eq "XShm") {
	output_fn("XShmQueryExtension", "Bool",
		  "Display *", "Display *a0", "a0");
	output_fn("XShmQueryVersion", "Bool",
		  "Display *, int *, int *, Bool *", 
		  "Display *a0, int *a1, int *a2, Bool *a3", "a0, a1, a2, a3");
	output_fn("XShmPixmapFormat", "int",
		  "Display *", "Display *a0", "a0");
	output_fn("XShmAttach", Status,
		  "Display *, XShmSegmentInfo *",
		  "Display *a0, XShmSegmentInfo *a1", "a0, a1");
	output_fn("XShmDetach", Status,
		  "Display *, XShmSegmentInfo *",
		  "Display *a0, XShmSegmentInfo *a1", "a0, a1");
	output_fn("XShmPutImage", Status,
		  "Display *, Drawable, GC, XImage *, int, int, int, int, unsigned int, unsigned int, Bool",
		  "Display *a0, Drawable a1, GC a2, XImage *a3, int a4, int a5, int a6, int a7, unsigned int a8, unsigned int a9, Bool a10", "a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10");
	output_fn("XShmGetImage", Status,
		  "Display *, Drawable, XImage *, int, int, unsigned long",
		  "Display *a0, Drawable a1, XImage *a2, int a3, int a4, unsigned long a5", 
		  "a0, a1, a2, a3, a4, a5");
	output_fn("XShmCreateImage", "XImage *",
		  "Display *, Visual *, unsigned int, int, char *, XShmSegmentInfo *, unsigned int, unsigned int",
		  "Display *a0, Visual *a1, unsigned int a2, int a3, char *a4, XShmSegmentInfo *a5, unsigned int a6, unsigned int a7",
		  "a0, a1, a2, a3, a4, a5, a6, a7");
	output_fn("XShmCreatePixmap", "Pixmap",
		  "Display *, Drawable, char *, XShmSegmentInfo *, unsigned int, unsigned int, unsigned int",
		  "Display *a0, Drawable a1, char *a2, XShmSegmentInfo *a3, unsigned int a4, unsigned int a5, unsigned int a6",
		  "a0, a1, a2, a3, a4, a5, a6");
    } elsif($name eq "xf86dga") {
    	output_fn("XF86DGAQueryVersion",Bool,
		"Display*,int*,int*",
		"Display*a0,int*a1,int*a2",
		"a0,a1,a2"
	);
    	output_fn("XF86DGAQueryExtension",Bool,
		"Display*,int*,int*",
		"Display*a0,int*a1,int*a2",
		"a0,a1,a2"
	);
	output_fn("XF86DGAGetVideo",Status,
		"Display*,int,char**,int*,int*,int*",
		"Display*a0,int a1,char**a2,int*a3,int*a4,int*a5",
		"a0,a1,a2,a3,a4,a5"
	);
	output_fn("XF86DGADirectVideo",Status,
		"Display*,int,int",
		"Display*a0,int a1,int a2",
		"a0,a1,a2"
	);
	output_fn("XF86DGAGetViewPortSize",Status,
		"Display*,int,int*,int*",
		"Display*a0,int a1,int *a2,int *a3",
		"a0,a1,a2,a3"
	);
	output_fn("XF86DGASetViewPort",Status,
		"Display*,int,int,int",
		"Display*a0,int a1,int a2,int a3",
		"a0,a1,a2,a3"
	);
	output_fn("XF86DGAInstallColormap",Status,
		"Display*,int,Colormap",
		"Display*a0,int a1,Colormap a2",
		"a0,a1,a2"
	);
	output_fn("XF86DGAQueryDirectVideo",Status,
		"Display*,int,int*",
		"Display*a0,int a1,int *a2",
		"a0,a1,a2"
	);
	output_fn("XF86DGAViewPortChanged",Status,
		"Display*,int,int",
		"Display*a0,int a1,int a2",
		"a0,a1,a2"
	);
    } elsif($name eq "xf86dga2") {
    	output_fn_short("Bool", "XDGAQueryVersion", "Display*" ,"int*","int*");
    	output_fn_short("Bool", "XDGAQueryExtension", "Display*" ,"int*","int*");
    	output_fn_short("XDGAMode*", "XDGAQueryModes", "Display*" ,"int", "int*");
    	output_fn_short("XDGADevice*", "XDGASetMode", "Display*" ,"int","int");
    	output_fn_short("Bool", "XDGAOpenFramebuffer", "Display*" ,"int");
    	output_fn_short("void", "XDGACloseFramebuffer", "Display*" ,"int");
    	output_fn_short("void", "XDGASetViewport", "Display*" ,"int", "int", "int", "int");
    	output_fn_short("void", "XDGAInstallColormap", "Display*" , "int", "Colormap");
	output_fn_short("Colormap", "XDGACreateColormap", "Display*" ,"int", "XDGADevice*", "int");
    	output_fn_short("void", "XDGASelectInput", "Display*" ,"int", "long");
    	output_fn_short("void", "XDGAFillRectangle", "Display*" ,"int", "int", "int", "unsigned int", "unsigned int", "unsigned long");
   	output_fn_short("void", "XDGACopyArea", "Display*" ,"int", "int", "int", "unsigned int", "unsigned int", "int", "int");
   	output_fn_short("void", "XDGACopyTransparentArea", "Display*" ,"int", "int", "int", "unsigned int", "unsigned int", "int", "int", "unsigned long");
    	output_fn_short("int", "XDGAGetViewportStatus", "Display*" ,"int");
    	output_fn_short("void", "XDGASync", "Display*" ,"int");
    	output_fn_short("Bool", "XDGASetClientVersion", "Display*");
    	output_fn_short("void", "XDGAChangePixmapMode", "Display*" ,"int", "int*", "int*", "int");
	output_fn_short("void", "XDGAKeyEventToXKeyEvent", "XDGAKeyEvent*" ,"XKeyEvent*");
    } elsif($name eq "xf86vmode") {
    	output_fn("XF86VidModeQueryVersion",Bool,
		"Display*,int*,int*",
		"Display*a0,int*a1,int*a2",
		"a0,a1,a2"
	);
	output_fn("XF86VidModeQueryExtension",Bool,
		"Display*,int*,int*",
		"Display*a0,int*a1,int*a2",
		"a0,a2,a2"
	);
	output_fn("XF86VidModeGetModeLine",Bool,
		"Display*,int,int*,XF86VidModeModeLine*",
		"Display*a0,int a1,int*a2,XF86VidModeModeLine*a3",
		"a0,a1,a2,a3"
	);
	output_fn("XF86VidModeGetAllModeLines",Bool,
		"Display*,int,int*,XF86VidModeModeInfo***",
		"Display*a0,int a1,int*a2,XF86VidModeModeInfo***a3",
		"a0,a1,a2,a3"
	);
	output_fn("XF86VidModeAddModeLine",Bool,
		"Display*,int,XF86VidModeModeInfo*,XF86VidModeModeInfo*",
		"Display*a0,int a1,XF86VidModeModeInfo*a2,XF86VidModeModeInfo*a3",
		"a0,a1,a2,a3"
	);
	output_fn("XF86VidModeDeleteModeLine",Bool,
		"Display*,int,XF86VidModeModeInfo*",
		"Display*a0,int a1,XF86VidModeModeInfo*a2",
		"a0,a1,a2"
	);
	output_fn("XF86VidModeModModeLine",Bool,
		"Display*,int,XF86VidModeModeLine*",
		"Display*a0,int a1,XF86VidModeModeLine*a2",
		"a0,a1,a2"
	);
	output_fn("XF86VidModeValidateModeLine",Status,
		"Display*,int,XF86VidModeModeInfo*",
		"Display*a0,int a1,XF86VidModeModeInfo*a2",
		"a0,a1,a2"
	);
	output_fn("XF86VidModeSwitchMode",Bool,
		"Display*,int,int",
		"Display*a0,int a1,int a2",
		"a0,a1,a2"
	);
	output_fn("XF86VidModeSwitchToMode",Bool,
		"Display*,int,XF86VidModeModeInfo*",
		"Display*a0,int a1,XF86VidModeModeInfo*a2",
		"a0,a1,a2"
	);
	output_fn("XF86VidModeLockModeSwitch",Bool,
		"Display*,int,int",
		"Display*a0,int a1,int a2",
		"a0,a1,a2"
	);
	output_fn("XF86VidModeGetMonitor",Bool,
		"Display*,int,XF86VidModeMonitor*",
		"Display*a0,int a1,XF86VidModeMonitor*a2",
		"a0,a1,a2"
	);
	output_fn("XF86VidModeGetViewPort",Bool,
		"Display*,int,int*,int*",
		"Display*a0,int a1,int*a2,int*a3",
		"a0,a1,a2,a3"
	);
	output_fn("XF86VidModeSetViewPort",Bool,
		"Display*,int,int,int",
		"Display*a0,int a1,int a2,int a3",
		"a0,a1,a2,a3"
	);	
    } else {
	open(IN, 
	     "echo \"$x11_incl#include <X11/$extensions_dir$name.h>\" | " . 
	     "gcc -L$X11_include_dir -DNeedFunctionPrototypes -E - | " .
	     "grep -v '^[ \t]*\$)' |"
	     ) || die "open";

      PROTO: while(<IN>) {
	  if(m'extern\s+([^()]*)\b([a-zA-Z0-9_]+)\s*\(') {
	      $result_type = $1;
	      $fn_name = $2;
	      $result_type = "int" if $result_type =~ /^\s*$/;
	      @args = ();
	      while(<IN>) {
		  last if m'\)\s*;';
		  # Give up on vararg functions and function pointer args.
		  if(m'\.\.\.|\(\*\)') {
		      undef $fn_name;
		      last;
		  }
		  if(m'\s*([^,]*[^, \t])\s*(,?\n)') {
		      $args[$#args+1] = $1;
		      if ($1 =~ /char\s*\[/) { # small hack for XQueryKeymap
		      	$args[$#args] = "char*";
		      }
		  }
	      }
	      # Skip if vararg, function pointer arg, or not needed.
	      next unless $fn_name;
	      next unless $want{$fn_name} && $want{$fn_name} == 1;

	      # Special case for no arguments (which is specified as "void").
	      if($#args == 0 && $args[0] eq "void") {
		  @args = ();
	      }
	      $proto = "";
	      $formals = "";
	      $actuals = "";
	      for($i = 0; $i <= $#args; $i++) {
		  $comma = $i < $#args ? ", " : "";
		  $proto .= "$args[$i]$comma";
		  $formals .= "$args[$i] a$i$comma";
		  $actuals .= "a$i$comma";
	      }
	      $proto = $formals = "void" if $#args == -1;
	      output_fn($fn_name, $result_type, $proto, $formals, $actuals);
	  }
      }
    }

    if($name eq "Xlib") {
	raw_output_fn("XSynchronize", "int (*r)(Display *)",
		  "int (*TSXSynchronize(Display *, Bool))(Display *)",
		  "int (*TSXSynchronize(Display *a0, Bool a1))(Display *)",
		  "a0, a1");
	print OUTC "\nextern void _XInitImageFuncPtrs(XImage *);\n";
	output_fn("_XInitImageFuncPtrs", "void", "XImage *", "XImage *a0", "a0");
    } elsif($name eq "Xutil") {
	output_fn("XDestroyImage", "int",
		  "struct _XImage *", "struct _XImage *a0", "a0");
	output_fn("XGetPixel", "unsigned long",
		  "struct _XImage *, int, int",
		  "struct _XImage *a0, int a1, int a2",
		  "a0, a1, a2");
	output_fn("XPutPixel", "int",
		  "struct _XImage *, int, int, unsigned long",
		  "struct _XImage *a0, int a1, int a2, unsigned long a3",
		  "a0, a1, a2, a3");
	output_fn("XSubImage", "struct _XImage *",
		  "struct _XImage *, int, int, unsigned int, unsigned int",
		  "struct _XImage *a0, int a1, int a2, unsigned int a3, unsigned int a4",
		  "a0, a1, a2, a3, a4");
	output_fn("XAddPixel", "int",
		  "struct _XImage *, long",
		  "struct _XImage *a0, long a1", "a0, a1");
	output_fn("XUniqueContext", "XContext", "void", "void", "");
    }

    print OUTH <<END;

$post_file
#endif /* !defined(X_DISPLAY_MISSING) */

#endif /* __WINE_TS_$ucname\_H */
END
    print OUTC <<END;

$post_file
#endif /* !defined(X_DISPLAY_MISSING) */
END



}

foreach $i (keys %want) {
    if($want{$i} == 1) {
	print "Unresolved: $i\n";
    }
}


sub output_fn {
    # Example call:
    # output_fn("main", "int", "int, char **", "int a0, char **a1", "a0, a1")
    #

    my ($fn_name, $result_type, $protos, $formals, $actuals) = @_;

    return raw_output_fn($fn_name,
			 $result_type =~ /^\s*void\s*$/ ? "" : "$result_type r",
			 "$result_type TS$fn_name($protos)",
			 "$result_type TS$fn_name($formals)",
			 $actuals);
}

sub output_fn_short {
    # Example call:
    # output_fn_sort("Bool", "XDGAQueryExtension", "Display *", "int *", "int *");
    #
    my ($result_type, $fn_name, @args) = @_;
    
    my ($i, $proto, $formals, $actuals) = (0, 
					   "$result_type TS$fn_name(",
					   "$result_type TS$fn_name(",
					   "");
    while ($val = shift @args) {
	$proto = $proto . $val;
	$formals = $formals . $val . " a$i";
	$actuals = $actuals . " a$i";
	$i++;
	if (@args) {
	    $proto = $proto . ", ";
	    $formals = $formals . ", ";
	    $actuals = $actuals . ", ";
	}
    }
    $proto = $proto . ")";
    $formals = $formals . ")";


    raw_output_fn($fn_name,
		  $result_type =~ /^\s*void\s*$/ ? "" : "$result_type r",
		  $proto,
		  $formals,
		  $actuals);
}

sub raw_output_fn {
    # Example call:
    # output_fn("main", "int r", "int main(int, char **)", "int main(int a0, char **a1)", "a0, a1")
    #

    my ($fn_name, $resultdecl, $protodecl, $defdecl, $actuals) = @_;

    return undef unless $want{$fn_name} && $want{$fn_name} == 1;

    print OUTC "\n$defdecl\n";
    print OUTH "extern $protodecl;\n";
#    print OUTH "#define $fn_name TS$fn_name\n";
    print OUTC "{\n";
    print OUTC "  $resultdecl;\n" if $resultdecl;
    print OUTC "  TRACE(\"Call $fn_name\\n\");\n";
    print OUTC "  EnterCriticalSection( &X11DRV_CritSection );\n";
    print OUTC "  ";
    print OUTC "r = " if $resultdecl;
    print OUTC "$fn_name($actuals);\n";
    print OUTC "  LeaveCriticalSection( &X11DRV_CritSection );\n";
    print OUTC "  TRACE(\"Ret $fn_name\\n\");\n";
    print OUTC "  return r;\n" if $resultdecl;
    print OUTC "}\n";
    $want{$fn_name} = 2;
    return 1;
}
