RosettaCodeData/Task/Call-a-foreign-language-function/Ol/call-a-foreign-language-function-3.ol
2026-04-30 12:34:36 -04:00

27 lines
897 B
Text

(import (otus ffi))
(define libc (or
(load-dynamic-library "libc.so") ; General Posix
(load-dynamic-library "libc.so.6") ; Linux
(load-dynamic-library "libc.so.6.1") ; Linux (DEC Alpha)
(load-dynamic-library "libc.so.7") ; Latest *BSD
(load-dynamic-library "libSystem.B.dylib") ; macOS / Darwin
(load-dynamic-library "shlwapi.dll") )) ; Windows
(define lib2
(load-dynamic-library "kernel32.dll")) ; Windows
(define strdup
(let ((strdup (or
(libc type-vptr "strdup" type-string) ; All
(libc type-vptr "StrDupA" type-string))) ; Win
(free (or
(libc fft-void "free" type-vptr) ; All
(lib2 fft-void "LocalFree" type-vptr)))) ; Win
(lambda (str)
(let*((dupped (strdup str))
(result (vptr->string dupped)))
(free dupped)
result))))
(print (strdup "Hello World!"))