summaryrefslogtreecommitdiff
path: root/cmamut.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'cmamut.lisp')
-rw-r--r--cmamut.lisp39
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))))