diff lisp/gtk-marshal.el @ 462:0784d089fdc9 r21-2-46

Import from CVS: tag r21-2-46
author cvs
date Mon, 13 Aug 2007 11:44:37 +0200
parents
children ec73ae6e772b
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/gtk-marshal.el	Mon Aug 13 11:44:37 2007 +0200
@@ -0,0 +1,289 @@
+(defconst name-to-return-type
+  '(("INT" . "guint")
+    ("CALLBACK" . "GtkCallback")
+    ("OBJECT" . "GtkObject *")
+    ("POINTER" . "void *")
+    ("STRING" . "gchar *")
+    ("BOOL" . "gboolean")
+    ("DOUBLE" . "gdouble")
+    ("FLOAT" . "gfloat")
+    ("LIST"  . "void *")
+    ("NONE" . nil)))
+
+(defvar defined-marshallers nil)
+
+(defun get-marshaller-name (rval args)
+  (concat "emacs_gtk_marshal_" rval "__"
+	  (mapconcat 'identity (or args '("NONE")) "_")))
+
+(defun define-marshaller (rval &rest args)
+  (let ((name nil)
+	(internal-rval (assoc rval  name-to-return-type))
+	(ctr 0)
+	(func-proto (format "__%s_fn" rval)))
+    (if (not internal-rval)
+	(error "Do not know return type of `%s'" rval))
+    (setq name (get-marshaller-name rval args))
+
+    (if (member name defined-marshallers)
+	(error "Attempe to define the same marshaller more than once! %s" name))
+
+    (set-buffer (get-buffer-create "emacs-marshals.c"))
+    (goto-char (point-max))
+
+    (if (or (member "FLOAT" args) (member "DOUBLE" args))
+	;; We need to special case anything with FLOAT in the argument
+	;; list or the parameters get screwed up royally.
+	(progn
+	  (setq func-proto (concat (format "__%s__" rval)
+				   (mapconcat 'identity args "_")
+				   "_fn"))
+	  (insert "typedef "
+		  (or (cdr internal-rval) "void")
+		  " (*"
+		  func-proto ")("
+		  (mapconcat (lambda (x)
+			       (cdr (assoc x name-to-return-type))) args ", ")
+		  ");\n")))
+
+    (insert "\n"
+	    "static void\n"
+	    name " (ffi_actual_function func, GtkArg *args)\n"
+	    "{\n"
+	    (format "  %s rfunc = (%s) func;\n" func-proto func-proto))
+
+    (if (string= "LIST" rval) (setq rval "POINTER"))
+
+    (if (cdr internal-rval)
+	;; It has a return type to worry about
+	(insert "  " (cdr internal-rval) " *return_val;\n\n"
+		(format "  return_val = GTK_RETLOC_%s (args[%d]);\n" rval (length args))
+		"  *return_val = ")
+      (insert "  "))
+    (insert "(*rfunc) (")
+    (while args
+      (if (/= ctr 0)
+	  (insert ", "))
+      (insert (format "GTK_VALUE_%s (args[%d])" (car args) ctr))
+      (setq args (cdr args)
+	    ctr (1+ ctr)))
+    (insert ");\n")
+    (insert "}\n")))
+
+(save-excursion
+  (find-file "../../src/emacs-marshals.c")
+  (erase-buffer)
+  (setq defined-marshallers nil)
+
+  (insert "#define GTK_VALUE_ARRAY(x) GTK_VALUE_POINTER(x)\n\n")
+  (insert "#define GTK_VALUE_LIST(x) GTK_VALUE_POINTER(x)\n\n")
+
+  (let ((todo '(
+		("BOOL" "OBJECT" "INT")
+		("BOOL" "OBJECT" "OBJECT" "OBJECT")
+		("BOOL" "OBJECT" "OBJECT")
+		("BOOL" "OBJECT" "POINTER")
+		("BOOL" "OBJECT" "STRING")
+		("BOOL" "OBJECT")
+		("BOOL" "POINTER" "BOOL")
+		("BOOL" "POINTER")
+		("BOOL")
+		("FLOAT" "OBJECT" "FLOAT")
+		("FLOAT" "OBJECT")
+		("INT" "BOOL")
+		("INT" "OBJECT" "ARRAY")
+		("INT" "OBJECT" "INT" "ARRAY")
+		("INT" "OBJECT" "INT" "INT")
+		("INT" "OBJECT" "INT" "STRING")
+		("INT" "OBJECT" "INT")
+		("INT" "OBJECT" "OBJECT")
+		("INT" "OBJECT" "POINTER" "INT" "INT")
+		("INT" "OBJECT" "POINTER" "INT")
+		("INT" "OBJECT" "POINTER")
+		("INT" "OBJECT" "STRING")
+		("INT" "OBJECT")
+		("INT" "POINTER" "INT")
+		("INT" "POINTER" "STRING" "INT")
+		("INT" "POINTER" "STRING" "STRING")
+		("INT" "POINTER" "STRING")
+		("INT" "POINTER")
+		("INT" "STRING" "STRING" "INT" "ARRAY")
+		("INT" "STRING")
+		("INT")
+		("LIST" "OBJECT")
+		("LIST")
+		("NONE" "BOOL")
+		("NONE" "INT" "INT" "INT" "INT")
+		("NONE" "INT" "INT")
+		("NONE" "INT")
+		("NONE" "OBJECT" "BOOL" "INT")
+		("NONE" "OBJECT" "BOOL")
+		("NONE" "OBJECT" "FLOAT" "FLOAT" "FLOAT" "BOOL")
+		("NONE" "OBJECT" "FLOAT" "FLOAT" "FLOAT" "FLOAT")
+		("NONE" "OBJECT" "FLOAT" "FLOAT" "FLOAT")
+		("NONE" "OBJECT" "FLOAT" "FLOAT")
+		("NONE" "OBJECT" "FLOAT")
+		("NONE" "OBJECT" "INT" "BOOL")
+		("NONE" "OBJECT" "INT" "FLOAT" "BOOL")
+		("NONE" "OBJECT" "INT" "FLOAT")
+		("NONE" "OBJECT" "INT" "INT" "ARRAY" "ARRAY" "ARRAY" "ARRAY" "ARRAY" "ARRAY")
+		("NONE" "OBJECT" "INT" "INT" "ARRAY")
+		("NONE" "OBJECT" "INT" "INT" "FLOAT" "FLOAT")
+		("NONE" "OBJECT" "INT" "INT" "INT" "INT")
+		("NONE" "OBJECT" "INT" "INT" "INT")
+		("NONE" "OBJECT" "INT" "INT" "POINTER" "POINTER")
+		("NONE" "OBJECT" "INT" "INT" "POINTER")
+		("NONE" "OBJECT" "INT" "INT" "STRING" "INT" "POINTER" "POINTER")
+		("NONE" "OBJECT" "INT" "INT" "STRING")
+		("NONE" "OBJECT" "INT" "INT")
+		("NONE" "OBJECT" "INT" "OBJECT")
+		("NONE" "OBJECT" "INT" "POINTER")
+		("NONE" "OBJECT" "INT" "STRING")
+		("NONE" "OBJECT" "INT")
+		("NONE" "OBJECT" "LIST" "INT")
+		("NONE" "OBJECT" "LIST")
+		("NONE" "OBJECT" "OBJECT" "BOOL" "BOOL" "INT" "INT")
+		("NONE" "OBJECT" "OBJECT" "BOOL" "BOOL" "INT")
+		("NONE" "OBJECT" "OBJECT" "BOOL" "BOOL")
+		("NONE" "OBJECT" "OBJECT" "FLOAT" "INT")
+		("NONE" "OBJECT" "OBJECT" "INT" "INT" "INT" "INT" "INT" "INT" "INT" "INT")
+		("NONE" "OBJECT" "OBJECT" "INT" "INT" "INT" "INT")
+		("NONE" "OBJECT" "OBJECT" "INT" "INT" "INT")
+		("NONE" "OBJECT" "OBJECT" "INT" "INT")
+		("NONE" "OBJECT" "OBJECT" "INT")
+		("NONE" "OBJECT" "OBJECT" "OBJECT" "INT")
+		("NONE" "OBJECT" "OBJECT" "OBJECT" "OBJECT" "INT")
+		("NONE" "OBJECT" "OBJECT" "OBJECT" "OBJECT")
+		("NONE" "OBJECT" "OBJECT" "OBJECT" "POINTER" "POINTER" "INT" "INT")
+		("NONE" "OBJECT" "OBJECT" "OBJECT")
+		("NONE" "OBJECT" "OBJECT" "POINTER")
+		("NONE" "OBJECT" "OBJECT" "STRING" "INT" "INT" "INT" "INT" "INT")
+		("NONE" "OBJECT" "OBJECT" "STRING" "STRING" "INT")
+		("NONE" "OBJECT" "OBJECT" "STRING" "STRING")
+		("NONE" "OBJECT" "OBJECT" "STRING")
+		("NONE" "OBJECT" "OBJECT")
+		("NONE" "OBJECT" "POINTER" "BOOL")
+		("NONE" "OBJECT" "POINTER" "INT" "FLOAT" "FLOAT")
+		("NONE" "OBJECT" "POINTER" "INT" "INT" "INT")
+		("NONE" "OBJECT" "POINTER" "INT" "INT")
+		("NONE" "OBJECT" "POINTER" "INT" "POINTER" "POINTER")
+		("NONE" "OBJECT" "POINTER" "INT" "POINTER")
+		("NONE" "OBJECT" "POINTER" "INT" "STRING" "INT" "POINTER" "POINTER")
+		("NONE" "OBJECT" "POINTER" "INT" "STRING")
+		("NONE" "OBJECT" "POINTER" "INT")
+		("NONE" "OBJECT" "POINTER" "POINTER" "INT" "INT" "INT" "INT" "INT" "INT")
+		("NONE" "OBJECT" "POINTER" "POINTER" "POINTER" "STRING" "INT")
+		("NONE" "OBJECT" "POINTER" "POINTER" "POINTER")
+		("NONE" "OBJECT" "POINTER" "POINTER")
+		("NONE" "OBJECT" "POINTER" "STRING" "INT" "POINTER" "POINTER" "POINTER" "POINTER" "BOOL" "BOOL")
+		("NONE" "OBJECT" "POINTER")
+		("NONE" "OBJECT" "STRING" "BOOL")
+		("NONE" "OBJECT" "STRING" "INT" "INT" "INT")
+		("NONE" "OBJECT" "STRING" "POINTER" "INT" "INT" "INT")
+		("NONE" "OBJECT" "STRING" "POINTER" "INT" "INT")
+		("NONE" "OBJECT" "STRING" "STRING")
+		("NONE" "OBJECT" "STRING")
+		("NONE" "OBJECT")
+		("NONE" "POINTER" "INT")
+		("NONE" "POINTER" "INT" "INT")
+		("NONE" "POINTER" "POINTER" "BOOL" "INT" "INT" "INT" "INT" "INT" "INT")
+		("NONE" "POINTER" "POINTER" "BOOL" "INT" "INT" "INT" "INT")
+		("NONE" "POINTER" "POINTER" "INT" "INT" "INT" "INT")
+		("NONE" "POINTER" "POINTER" "INT" "INT")
+		("NONE" "POINTER" "POINTER" "POINTER" "INT" "INT" "STRING" "INT")
+		("NONE" "POINTER" "POINTER" "POINTER" "INT" "INT" "STRING")
+		("NONE" "POINTER" "POINTER" "POINTER" "POINTER")
+		("NONE" "POINTER" "POINTER")
+		("NONE" "POINTER" "STRING" "STRING")
+		("NONE" "POINTER" "STRING")
+		("NONE" "POINTER")
+		("NONE")
+		("OBJECT" "BOOL" "BOOL" "INT")
+		("OBJECT" "BOOL" "INT")
+		("OBJECT" "FLOAT" "FLOAT" "FLOAT" "FLOAT" "FLOAT" "FLOAT")
+		("OBJECT" "FLOAT" "FLOAT" "FLOAT" "FLOAT" "FLOAT")
+		("OBJECT" "FLOAT" "FLOAT" "FLOAT" "FLOAT")
+		("OBJECT" "INT" "ARRAY")
+		("OBJECT" "INT" "BOOL" "BOOL")
+		("OBJECT" "INT" "INT" "ARRAY")
+		("OBJECT" "INT" "INT" "BOOL")
+		("OBJECT" "INT" "INT" "STRING")
+		("OBJECT" "INT" "INT")
+		("OBJECT" "INT")
+		("OBJECT" "OBJECT" "FLOAT" "INT")
+		("OBJECT" "OBJECT" "INT")
+		("OBJECT" "OBJECT" "OBJECT")
+		("OBJECT" "OBJECT" "STRING" "INT" "INT" "INT" "INT" "INT")
+		("OBJECT" "OBJECT" "STRING" "INT" "INT" "INT" "INT")
+		("OBJECT" "OBJECT" "STRING" "INT" "INT")
+		("OBJECT" "OBJECT" "STRING")
+		("OBJECT" "OBJECT")
+		("OBJECT" "POINTER" "POINTER")
+		("OBJECT" "POINTER" "STRING")
+		("OBJECT" "POINTER")
+		("OBJECT" "STRING" "FLOAT" "FLOAT" "FLOAT" "BOOL")
+		("OBJECT" "STRING" "INT" "STRING" "STRING")
+		("OBJECT" "STRING" "OBJECT")
+		("OBJECT" "STRING" "STRING" "STRING" "ARRAY" "STRING" "STRING")
+		("OBJECT" "STRING" "STRING")
+		("OBJECT" "STRING")
+		("OBJECT")
+		("POINTER" "INT" "INT")
+		("POINTER" "INT")
+		("POINTER" "OBJECT" "INT" "INT")
+		("POINTER" "OBJECT" "INT")
+		("POINTER" "OBJECT" "POINTER" "INT")
+		("POINTER" "OBJECT" "POINTER" "POINTER" "ARRAY" "INT" "POINTER" "POINTER" "POINTER" "POINTER" "BOOL" "BOOL")
+		("POINTER" "OBJECT" "POINTER")
+		("POINTER" "OBJECT")
+		("POINTER" "POINTER")
+		("POINTER")
+		("STRING" "INT" "INT" "INT")
+		("STRING" "INT")
+		("STRING" "OBJECT" "BOOL")
+		("STRING" "OBJECT" "FLOAT")
+		("STRING" "OBJECT" "INT" "INT")
+		("STRING" "OBJECT" "INT")
+		("STRING" "OBJECT")
+		("STRING" "POINTER" "STRING")
+		("STRING" "POINTER")
+		("STRING")
+		)
+	      )
+	)
+    (mapc (lambda (x) (apply 'define-marshaller x)) todo)
+
+    (insert "\n
+#include \"hash.h\"
+static c_hashtable marshaller_hashtable;
+
+static void initialize_marshaller_storage (void)
+{
+	if (!marshaller_hashtable)
+	{
+		marshaller_hashtable = make_strings_hashtable (100);
+")
+    
+    (mapc (lambda (x)
+	    (let ((name (get-marshaller-name (car x) (cdr x))))
+	      (insert (format "\t\tputhash (\"%s\", (void *) %s, marshaller_hashtable);\n" name name))))
+	  todo)
+    (insert "\t};\n"
+	    "}\n"
+	    "
+static void *find_marshaller (const char *func_name)
+{
+	void *fn = NULL;
+	initialize_marshaller_storage ();
+
+	if (gethash (func_name, marshaller_hashtable, (CONST void **)&fn))
+	{
+		return (fn);
+	}
+
+	return (NULL);
+}
+"))
+
+  (save-buffer)
+  (kill-buffer "emacs-marshals.c"))