diff options
Diffstat (limited to 'cmamut.lisp')
| -rw-r--r-- | cmamut.lisp | 39 | 
1 files changed, 19 insertions, 20 deletions
| diff --git a/cmamut.lisp b/cmamut.lisp index 97db0f5..d572342 100644 --- a/cmamut.lisp +++ b/cmamut.lisp @@ -8,7 +8,7 @@  ; Only define functions from the target library, but get all other definitions.  ; TODO: Get constants from macro file generated by c2ffi -M -; TODO: Generate enum definitions +; TODO: Use c2ffi to extract the spec.json using the header file as parameter  (defvar reference-table (make-hash-table :test #'equal :size 256)) @@ -61,7 +61,7 @@          (cooked-params (queue:new)))      (dotimes (j (length raw-params))        (queue:add cooked-params -                 (list (intern (gethash "name" (aref raw-params j))) +                 (list (intern (string-upcase (gethash "name" (aref raw-params j))))                         (cook-type (gethash "type" (aref raw-params j))))))      `(sb-alien:define-alien-routine         ,(let ((function-name (gethash "name" raw-function))) @@ -81,7 +81,7 @@      `(sb-alien:define-alien-type         ,new-name         ,(if enum? -          `(enum ,new-name) +          `(sb-alien:enum ,new-name)            (cook-type base-type)))))  (defun cook-struct (raw-struct) @@ -89,7 +89,7 @@          (cooked-fields (queue:new)))      (dotimes (j (length raw-fields))        (queue:add cooked-fields -                 (list (intern (gethash "name" (aref raw-fields j))) +                 (list (intern (string-upcase (gethash "name" (aref raw-fields j))))                         (cook-type (gethash "type" (aref raw-fields j))))))      `(sb-alien:struct         ,(gethash "name" raw-struct) @@ -100,16 +100,25 @@          (cooked-fields (queue:new)))      (dotimes (j (length raw-fields))        (queue:add cooked-fields -                 (list (intern (gethash "name" (aref raw-fields j))) +                 (list (intern (string-upcase (gethash "name" (aref raw-fields j))))                         (cook-type (gethash "type" (aref raw-fields j))))))      `(sb-alien:union         ,(gethash "name" raw-union)         ,@(queue:to-list cooked-fields)))) -;(defun cook-enum (raw-enum) -;  (let ((name (gethash (gethash "id" raw-enum) reference-table)) -;        (raw-fields (gethash "fields" raw-enum)) -;        (cooked-fields (queue:new))) +(defun cook-enum (raw-enum) +  (let ((name (gethash (gethash "id" raw-enum) reference-table)) +        (raw-fields (gethash "fields" raw-enum)) +        (cooked-fields (queue:new))) +    (dotimes (j (length raw-fields)) +      (queue:add cooked-fields +                 (list (intern (string-upcase (gethash "name" (aref raw-fields j)))) +                       (gethash "value" (aref raw-fields j))))) +    `(sb-alien:define-alien-type +       nil +       (sb-alien:enum +         ,name +         ,@(queue:to-list cooked-fields)))))  (defstruct spec    functions @@ -136,7 +145,7 @@  ; typedefs must be generated first to build the reference table      (setf (spec-typedefs s) (mapcar #'cook-typedef (spec-typedefs s)))      (setf (spec-functions s) (mapcar #'cook-function (spec-functions s))) -    ;(setf (spec-enums s) (mapcar #'cook-enum (spec-enums s))) +    (setf (spec-enums s) (mapcar #'cook-enum (spec-enums s)))      (setf (spec-structs s)            (mapcar (lambda (x)                      `(sb-alien:define-alien-type nil ,(cook-struct x))) @@ -155,18 +164,8 @@  ; definitions must be written in the following order to avoid "unknown type" errors      (princ ";;; GENERATED BY CMAMUT" f)      (terpri f) -    (princ ";typedefs" f) -    (terpri f)      (format f "~{~s~&~}" (spec-typedefs spec)) -    (princ ";enums" f) -    (terpri f)      (format f "~{~s~&~}" (spec-enums spec)) -    (princ ";structs" f) -    (terpri f)      (format f "~{~s~&~}" (spec-structs spec)) -    (princ ";unions" f) -    (terpri f)      (format f "~{~s~&~}" (spec-unions spec)) -    (princ ";functions" f) -    (terpri f)      (format f "~{~s~&~}" (spec-functions spec)))) | 
