summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmamut.lisp28
1 files changed, 15 insertions, 13 deletions
diff --git a/cmamut.lisp b/cmamut.lisp
index 4bd4cad..c8d213f 100644
--- a/cmamut.lisp
+++ b/cmamut.lisp
@@ -1,11 +1,9 @@
(in-package #:cmamut)
-; Ideas:
-; Generate code that creates a package and puts all definitions there.
-; To avoid collisions the created package shouldn't import any symbols.
-
; TODO: Use c2ffi to extract the spec.json using the header file as parameter
+(defvar *target-package* *package*)
+
(defun get-raw-spec (filename)
(json:from-file filename))
@@ -51,9 +49,9 @@
(cook-type (gethash "type" raw-type) type-associations)
(gethash "size" raw-type)))
((string= tag ":struct")
- (list 'sb-alien:struct (intern (gethash "name" raw-type))))
+ (list 'sb-alien:struct (intern (gethash "name" raw-type) *target-package*)))
((string= tag ":union")
- (list 'sb-alien:union (intern (gethash "name" raw-type))))
+ (list 'sb-alien:union (intern (gethash "name" raw-type) *target-package*)))
((string= tag ":enum")
(list 'sb-alien:enum (gethash "name" raw-type)))
((or (string= tag "struct") (string= tag "union"))
@@ -72,11 +70,11 @@
(queue:add cooked-params
(list (if (string= (gethash "name" (aref raw-params j)) "")
(gensym)
- (intern (gethash "name" (aref raw-params j))))
+ (intern (gethash "name" (aref raw-params j)) *target-package*))
(cook-type (gethash "type" (aref raw-params j)) type-associations))))
`(sb-alien:define-alien-routine
,(let ((function-name (gethash "name" raw-function)))
- (list function-name (intern function-name)))
+ (list function-name (intern function-name *target-package*)))
,(cook-type (gethash "return-type" raw-function) type-associations)
,@(queue:to-list cooked-params))))
@@ -85,16 +83,16 @@
(cooked-fields (queue:new)))
(dotimes (j (length raw-fields))
(queue:add cooked-fields
- (list (intern (gethash "name" (aref raw-fields j)))
+ (list (intern (gethash "name" (aref raw-fields j)) *target-package*)
(cook-type (gethash "type" (aref raw-fields j)) type-associations))))
`(,(intern (string-upcase (gethash "tag" raw-composite)) 'sb-alien)
,(when (> (length (gethash "name" raw-composite)) 0)
- (intern (gethash "name" raw-composite)))
+ (intern (gethash "name" raw-composite) *target-package*))
,@(queue:to-list cooked-fields))))
(defun cook-const (raw-const)
`(defparameter
- ,(intern (gethash "name" raw-const))
+ ,(intern (gethash "name" raw-const) *target-package*)
,(gethash "value" raw-const)))
(defun cook-enum (raw-enum enum-references)
@@ -103,7 +101,7 @@
(cooked-fields (queue:new)))
(dotimes (j (length raw-fields))
(queue:add cooked-fields
- (list (intern (gethash "name" (aref raw-fields j)))
+ (list (intern (gethash "name" (aref raw-fields j)) *target-package*)
(gethash "value" (aref raw-fields j)))))
`(sb-alien:define-alien-type
nil
@@ -247,9 +245,13 @@
:if-does-not-exist :create)
(let ((*print-length* nil)
(*print-level* nil))
+ (format f "(cl:defpackage ~s)~&" *target-package*)
(format f "~{~s~&~}" code))))
-(defun run (input output &optional function-filter)
+(defun run (pkg input output &optional function-filter)
+ (setf *target-package* pkg)
+ (when (not (find-package *target-package*))
+ (make-package *target-package*))
(let* ((raw-spec (get-raw-spec input))
(spec (classify-definitions raw-spec))
(code (codegen spec function-filter)))