schemelib/bindings/utils.scm

32 lines
846 B
Scheme
Raw Normal View History

2020-07-09 14:20:59 +00:00
; Convert a char* to a Scheme string
; Extracted from this paper:
; http://scheme2011.ucombinator.org/papers/Keep2011.pdf
2020-07-09 16:00:50 +00:00
(define (char*->string fptr maxsize)
2020-07-09 14:20:59 +00:00
(let f ([i 0])
(let ([c (ftype-ref char () fptr i)])
2020-07-09 16:00:50 +00:00
(if (or (char=? c #\nul) (and (> maxsize 0) (>= i maxsize)))
2020-07-09 14:20:59 +00:00
(make-string i)
(let ([str (f (fx+ i 1))])
2020-07-09 16:00:50 +00:00
(string-set! str i c) str)))))
2020-07-09 14:20:59 +00:00
2020-07-10 08:32:46 +00:00
(define (string->char* src dest destmax)
(let ([strlen (string-length src)])
(let f ([i 0])
(cond
((or (>= i strlen) (>= i destmax)) dest)
(#t
(ftype-set! char () dest i (string-ref src i))
(f (fx+ i 1)))))))
2020-07-09 14:20:59 +00:00
(define (alloc size fx)
(let ([v (foreign-alloc size)])
(fx v)
(foreign-free v)))
(define (check-err ret msg)
(cond
((< ret 0)
(perror msg)
(raise msg))
(#t ret)))