diff options
author | Daniel Llorens <lloda@sarc.name> | 2021-11-11 15:47:42 +0100 |
---|---|---|
committer | Daniel Llorens <lloda@sarc.name> | 2021-11-15 11:34:09 +0100 |
commit | 496f69dba2fdf1720b40349932fcdecd444107c3 (patch) | |
tree | dc850c5afca668788a24350c0464f1eb817ea353 /module/system | |
parent | 24116be822c96741eacd667e4e3507300c596cba (diff) | |
download | guile-496f69dba2fdf1720b40349932fcdecd444107c3.tar.gz |
Support C99 complex types in (system foreign)
* libguile/foreign.h (SCM_FOREIGN_TYPE_COMPLEX_FLOAT,
SCM_FOREIGN_TYPE_COMPLEX_DOUBLE): New enums.
* module/system/foreign.scm (complex-float, complex-double): Export new types.
(make-c-struct, parse-c-struct): Support the new types.
* libguile/foreign.c (complex-float, complex-double): Define new types.
(alignof, sizeof, pack, unpack): Support the new types.
* test-suite/tests/foreign.test: Test.
Diffstat (limited to 'module/system')
-rw-r--r-- | module/system/foreign.scm | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/module/system/foreign.scm b/module/system/foreign.scm index d1c2ceb96..4458dc783 100644 --- a/module/system/foreign.scm +++ b/module/system/foreign.scm @@ -23,6 +23,7 @@ #:use-module (srfi srfi-9 gnu) #:export (void float double + complex-float complex-double short unsigned-short int unsigned-int long unsigned-long size_t ssize_t ptrdiff_t @@ -93,9 +94,22 @@ (bytevector-u32-native-set! bv offset (pointer-address ptr)))) (else (error "what machine is this?")))) +(define (writer-complex set size) + (lambda (bv i val) + (set bv i (real-part val)) + (set bv (+ i size) (imag-part val)))) + +(define (reader-complex ref size) + (lambda (bv i) + (make-rectangular + (ref bv i) + (ref bv (+ i size))))) + (define *writers* `((,float . ,bytevector-ieee-single-native-set!) (,double . ,bytevector-ieee-double-native-set!) + (,complex-float . ,(writer-complex bytevector-ieee-single-native-set! (sizeof float))) + (,complex-double . ,(writer-complex bytevector-ieee-double-native-set! (sizeof double))) (,int8 . ,bytevector-s8-set!) (,uint8 . ,bytevector-u8-set!) (,int16 . ,bytevector-s16-native-set!) @@ -109,6 +123,8 @@ (define *readers* `((,float . ,bytevector-ieee-single-native-ref) (,double . ,bytevector-ieee-double-native-ref) + (,complex-float . ,(reader-complex bytevector-ieee-single-native-ref (sizeof float))) + (,complex-double . ,(reader-complex bytevector-ieee-double-native-ref (sizeof double))) (,int8 . ,bytevector-s8-ref) (,uint8 . ,bytevector-u8-ref) (,int16 . ,bytevector-s16-native-ref) |