Mercurial > hg > xemacs-beta
view lisp/gtk-marshal.el @ 581:5c09e1d634a3
[xemacs-hg @ 2001-05-26 12:27:47 by ben]
rewrite warning output so that it doesn't happen by default --
you should only get warnings when something is actively wrong,
not just because a feature is not present.
author | ben |
---|---|
date | Sat, 26 May 2001 12:27:47 +0000 |
parents | 0784d089fdc9 |
children | ec73ae6e772b |
line wrap: on
line source
(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"))