]> git.jsancho.org Git - guile-assimp.git/blobdiff - src/low-level.scm
New struct types ai-matrix3x3 and ai-matrix4x4
[guile-assimp.git] / src / low-level.scm
index 53bb39eb4d83906996191061a09dc729fc9f573d..fd7af9ddea932881e7decdd718c69107d0bde48a 100644 (file)
   #:use-module (system foreign))
 
 
+(define (mk-string . args)
+  (string-concatenate
+   (map (lambda (a)
+         (if (string? a)
+             a
+             (symbol->string (syntax->datum a))))
+       args)))
+
+(define (lambda-mk-symbol x)
+  (lambda args
+    (datum->syntax x
+      (string->symbol
+       (apply mk-string args)))))
+
+
 ;;; Parsers Definition
 
 (define-syntax define-struct-parser
       ((_ name (field type) ...)
        (with-syntax (((field-name ...) (map car #'((field type) ...)))
                     ((field-type ...) (map cadr #'((field type) ...))))
-         #'(define (name pointer)
-            (map cons
-                 '(field-name ...)
-                 (parse-c-struct pointer (list field-type ...)))))))))
+         #'(define* (name pointer-or-data #:key (reverse #f))
+            (cond (reverse
+                   (make-c-struct
+                    (list field-type ...)
+                    pointer-or-data))
+                  (else
+                   (map cons
+                        '(field-name ...)
+                        (parse-c-struct pointer-or-data (list field-type ...)))))))))))
 
 (export-syntax define-struct-parser)
 
 
 (define-syntax define-conversion-type
   (lambda (x)
-    (define (mk-string . args)
-      (string-concatenate
-       (map (lambda (a)
-             (if (string? a)
-                 a
-                 (symbol->string (syntax->datum a))))
-           args)))
-    (define (mk-symbol . args)
-      (datum->syntax x
-        (string->symbol
-        (apply mk-string args))))
+    (define mk-symbol (lambda-mk-symbol x))
     (syntax-case x (->)
       ((_ parser -> name (field-name field-proc) ...)
        (with-syntax ((type? (mk-symbol #'name "?"))
   (cond ((= (pointer-address root) 0)
         '())
        (else
-        (let loop ((i 0))
-          (cond ((= i size)
-                 '())
-                (else
-                 (cons (element-proc root (* element-size i))
-                       (loop (+ i 1)))))))))
+        (reverse
+         (let loop ((i 0) (res '()))
+           (cond ((= i size)
+                  res)
+                 (else
+                  (loop (+ i 1) (cons (element-proc root (* element-size i)) res)))))))))
 
 (define (get-element-address root-pointer offset)
   (make-pointer (+ (pointer-address root-pointer) offset)))
        get-element-address
        sized-string
        wrap)
+
+
+;;; Function Mappers
+
+(define-syntax define-foreign-function
+  (lambda (x)
+    (syntax-case x (->)
+      ((_ ((foreign-lib name) arg-type ...) -> return-type)
+       (with-syntax ((name-string (datum->syntax x (symbol->string (syntax->datum #'name)))))
+         #'(define name
+            (pointer->procedure return-type
+                                (dynamic-func name-string foreign-lib)
+                                (list arg-type ...))))))))
+
+(export-syntax define-foreign-function)