Added bytevector library

This commit is contained in:
2025-04-25 21:06:08 +03:00
parent 439c097ab0
commit 66ded0d1ee
17 changed files with 1298 additions and 227 deletions
+24 -152
View File
@@ -446,20 +446,20 @@
(define-c-procedure c-puts libc-stdlib 'puts 'int '(pointer))
(debug c-puts)
(define chars-written (c-puts (string->c-bytevector "puts: Hello from testing, I am C function puts")))
(define chars-written (c-puts (string->c-utf8 "puts: Hello from testing, I am C function puts")))
(debug chars-written)
(assert = chars-written 47)
(define-c-procedure c-atoi libc-stdlib 'atoi 'int '(pointer))
(assert = (c-atoi (string->c-bytevector "100")) 100)
(assert = (c-atoi (string->c-utf8 "100")) 100)
(define-c-procedure c-fopen libc-stdio 'fopen 'pointer '(pointer pointer))
(define output-file (c-fopen (string->c-bytevector "testfile.test")
(string->c-bytevector "w")))
(define output-file (c-fopen (string->c-utf8 "testfile.test")
(string->c-utf8 "w")))
(debug output-file)
(define-c-procedure c-fprintf libc-stdio 'fprintf 'int '(pointer pointer))
(define characters-written
(c-fprintf output-file (string->c-bytevector "Hello world")))
(c-fprintf output-file (string->c-utf8 "Hello world")))
(debug characters-written)
(assert equal? (= characters-written 11) #t)
(define-c-procedure c-fclose libc-stdio 'fclose 'int '(pointer))
@@ -508,7 +508,7 @@
(assert equal? (c-null? 100) #f)
(assert equal? (c-null? 'bar) #f)
;;make-c-bytevector
;; make-c-bytevector
(print-header 'make-c-bytevector )
@@ -520,8 +520,15 @@
;(assert equal? (c-bytevector? "Hello world") #f)
(assert equal? (c-null? test-pointer) #f)
;; call-with-address-of-c-bytevector
(print-header "c-bytevector-u8-set! c-bytevector-u8-ref")
(define u8-pointer (make-c-bytevector (c-size-of 'uint8)))
(c-bytevector-u8-set! u8-pointer 0 42)
(debug u8-pointer)
(debug (c-bytevector-u8-ref u8-pointer 0))
(assert equal? (= (c-bytevector-u8-ref u8-pointer 0) 42) #t)
;; call-with-address-of-c-bytevector
(print-header 'call-with-address-of-c-bytevector)
@@ -532,15 +539,15 @@
'(pointer pointer))
(define input-pointer (make-c-bytevector (c-size-of 'int)))
(pffi-pointer-set! input-pointer 'int 0 100)
(debug (pffi-pointer-get input-pointer 'int 0))
(c-bytevector-s32-native-set! input-pointer 0 100)
(debug (c-bytevector-s32-native-ref input-pointer 0))
(call-with-address-of-c-bytevector
input-pointer
(lambda (address)
(test-passing-pointer-address input-pointer address)))
(debug input-pointer)
(debug (pffi-pointer-get input-pointer 'int 0))
(assert equal? (= (pffi-pointer-get input-pointer 'int 0) 42) #t)
(debug (c-bytevector-s32-native-ref input-pointer 0))
(assert equal? (= (c-bytevector-s32-native-ref input-pointer 0) 42) #t)
;; c-free
@@ -551,59 +558,6 @@
(c-free pointer-to-be-freed)
(debug pointer-to-be-freed)
;; pffi-pointer-set! and pffi-pointer-get 1/2
(print-header "pffi-pointer-set! and pffi-pointer-get 1/2")
(define set-pointer (make-c-bytevector 256))
(define offset 64)
(define value 1)
(debug set-pointer)
(debug offset)
(debug value)
(cond-expand
(gambit
(define test-type
(lambda (type)
(begin
(pffi-pointer-set! set-pointer type offset value)
(assert = (pffi-pointer-get set-pointer type offset) value)))))
(else
(define-syntax test-type
(syntax-rules ()
((_ type)
(begin
(pffi-pointer-set! set-pointer type offset value)
(assert = (pffi-pointer-get set-pointer type offset) value)))))))
(test-type 'int8)
(test-type 'uint8)
(test-type 'int16)
(test-type 'uint16)
(test-type 'int32)
(test-type 'uint32)
(test-type 'int64)
(test-type 'uint64)
(test-type 'short)
(test-type 'unsigned-short)
(test-type 'int)
(test-type 'unsigned-int)
(test-type 'long)
(test-type 'unsigned-long)
(pffi-pointer-set! set-pointer 'char offset #\X)
(debug (pffi-pointer-get set-pointer 'char offset))
(assert char=? (pffi-pointer-get set-pointer 'char offset) #\X)
(pffi-pointer-set! set-pointer 'float offset 1.5)
(debug (pffi-pointer-get set-pointer 'float offset))
(assert = (pffi-pointer-get set-pointer 'float offset) 1.5)
(pffi-pointer-set! set-pointer 'double offset 1.5)
(debug (pffi-pointer-get set-pointer 'double offset))
(assert = (pffi-pointer-get set-pointer 'double offset) 1.5)
; pffi-define-struct
(print-header "pffi-define-struct")
@@ -672,86 +626,6 @@
(debug (list bt1 bt2))
(assert equal? bt1 bt2)
;; string->c-bytevector
(print-header 'string->c-bytevector)
(define string-pointer (string->c-bytevector "Hello world"))
(debug string-pointer)
(debug (c-bytevector->string string-pointer))
(assert equal? (c-bytevector? string-pointer) #t)
(assert equal? (c-null? string-pointer) #f)
(debug (pffi-pointer-get string-pointer 'char 0))
(assert char=? (pffi-pointer-get string-pointer 'char 0) #\H)
(debug (pffi-pointer-get string-pointer 'char 1))
(assert char=? (pffi-pointer-get string-pointer 'char 1) #\e)
(debug (pffi-pointer-get string-pointer 'char 2))
(assert char=? (pffi-pointer-get string-pointer 'char 2) #\l)
(debug (pffi-pointer-get string-pointer 'char 3))
(assert char=? (pffi-pointer-get string-pointer 'char 3) #\l)
(debug (pffi-pointer-get string-pointer 'char 4))
(assert char=? (pffi-pointer-get string-pointer 'char 4) #\o)
(debug (pffi-pointer-get string-pointer 'char 10))
(assert char=? (pffi-pointer-get string-pointer 'char 10) #\d)
;; c-bytevector->string
(print-header 'c-bytevector->string)
(define pointer-string (c-bytevector->string string-pointer))
(debug pointer-string)
(assert equal? (string? pointer-string) #t)
(assert string=? pointer-string "Hello world")
(assert string=? (c-bytevector->string (string->c-bytevector "https://scheme.org")) "https://scheme.org")
(define test-url-string "https://scheme.org")
(debug test-url-string)
(define test-url (string->c-bytevector test-url-string))
(debug test-url)
(debug (c-bytevector->string test-url))
(assert equal? (string=? (c-bytevector->string test-url) test-url-string) #t)
;; pffi-pointer-get
(print-header "pffi-pointer-get")
(define hello-string "hello")
(define hello-string-pointer (string->c-bytevector hello-string))
(debug (pffi-pointer-get hello-string-pointer 'char 0))
(assert char=? (pffi-pointer-get hello-string-pointer 'char 0) #\h)
(debug (pffi-pointer-get hello-string-pointer 'char 1))
(assert char=? (pffi-pointer-get hello-string-pointer 'char 1) #\e)
(debug (pffi-pointer-get hello-string-pointer 'char 4))
(assert char=? (pffi-pointer-get hello-string-pointer 'char 4) #\o)
;; pffi-pointer-set! and pffi-pointer-get 2/2
(print-header "pffi-pointer-set! and pffi-pointer-get 2/2")
(define pointer-to-be-set (string->c-bytevector "FOOBAR"))
(debug pointer-to-be-set)
(debug (c-bytevector->string pointer-to-be-set))
(pffi-pointer-set! set-pointer 'pointer offset pointer-to-be-set)
(debug (pffi-pointer-get set-pointer 'pointer offset))
(assert equal?
(c-bytevector? (pffi-pointer-get set-pointer 'pointer offset))
#t)
(debug (c-bytevector->string (pffi-pointer-get set-pointer 'pointer offset)))
(assert equal?
(string? (c-bytevector->string (pffi-pointer-get set-pointer 'pointer offset)))
#t)
(debug (c-bytevector->string (pffi-pointer-get set-pointer 'pointer offset)))
(assert equal?
(string=? (c-bytevector->string (pffi-pointer-get set-pointer 'pointer offset)) "FOOBAR")
#t)
(define string-to-be-set "FOOBAR")
(debug string-to-be-set)
(pffi-pointer-set! set-pointer 'pointer offset (string->c-bytevector string-to-be-set))
(assert string=? (c-bytevector->string (pffi-pointer-get set-pointer 'pointer offset)) "FOOBAR")
;; pffi-struct-get
(print-header 'pffi-struct-get)
@@ -806,8 +680,8 @@
(debug (pffi-struct-get struct-test 'f))
(assert = (pffi-struct-get struct-test 'f) 6.0)
(debug (pffi-struct-get struct-test 'g))
(debug (c-bytevector->string (pffi-struct-get struct-test 'g)))
(assert equal? (string=? (c-bytevector->string (pffi-struct-get struct-test 'g)) "FOOBAR") #t)
(debug (c-utf8->string (pffi-struct-get struct-test 'g)))
(assert equal? (string=? (c-utf8->string (pffi-struct-get struct-test 'g)) "FOOBAR") #t)
(debug (pffi-struct-get struct-test 'h))
(assert = (pffi-struct-get struct-test 'h) 8)
(debug (pffi-struct-get struct-test 'i))
@@ -851,7 +725,7 @@
(pffi-struct-set! struct-test1 'd #\d)
(pffi-struct-set! struct-test1 'e (make-c-null))
(pffi-struct-set! struct-test1 'f 6.0)
(pffi-struct-set! struct-test1 'g (string->c-bytevector "foo"))
(pffi-struct-set! struct-test1 'g (string->c-utf8 "foo"))
(pffi-struct-set! struct-test1 'h 8)
(pffi-struct-set! struct-test1 'i (make-c-null))
(pffi-struct-set! struct-test1 'j 10)
@@ -900,8 +774,8 @@
;(assert equal? (c-null? (pffi-struct-get struct-test2 'e)) #t)
;(debug (pffi-struct-get struct-test2 'f))
;(assert = (pffi-struct-get struct-test2 'f) 6.0)
;(debug (c-bytevector->string (pffi-struct-get struct-test2 'g)))
;(assert equal? (string=? (c-bytevector->string (pffi-struct-get struct-test2 'g)) "FOOBAR") #t)
;(debug (c-utf8->string (pffi-struct-get struct-test2 'g)))
;(assert equal? (string=? (c-bytevector->utf8 (pffi-struct-get struct-test2 'g)) "FOOBAR") #t)
;(debug (pffi-struct-get struct-test2 'h))
;(assert = (pffi-struct-get struct-test2 'h) 8)
;(debug (pffi-struct-get struct-test2 'i))
@@ -961,8 +835,6 @@
;(debug (pffi-struct-set! struct-color 'a 103))
;(assert = (c-color-check-by-value (pffi-struct-dereference struct-color)) 0)
(exit 0)
;(print-header "pffi-struct-dereference 2")
;(define-c-procedure c-test-check-by-value c-testlib 'test_check_by_value 'int '((struct . test)))
@@ -989,7 +861,7 @@
;(debug (pffi-struct-set! struct-test3 'd #\d))
;(debug (pffi-struct-set! struct-test3 'e (make-c-null)))
;(debug (pffi-struct-set! struct-test3 'f 6.0))
;(debug (pffi-struct-set! struct-test3 'g (string->c-bytevector "foo")))
;(debug (pffi-struct-set! struct-test3 'g (string->c-utf8 "foo")))
;(debug (pffi-struct-set! struct-test3 'h 8))
;(debug (pffi-struct-set! struct-test3 'i (make-c-null)))
;(debug (pffi-struct-set! struct-test3 'j 10))