RosettaCodeData/Task/Call-a-foreign-language-function/Ol/call-a-foreign-language-function-3.ol

28 lines
897 B
Text
Raw Permalink Normal View History

2026-02-01 16:33:20 -08:00
(import (otus ffi))
2023-07-01 11:58:00 -04:00
2026-02-01 16:33:20 -08:00
(define libc (or
(load-dynamic-library "libc.so") ; General Posix
(load-dynamic-library "libc.so.6") ; Linux
2026-04-30 12:34:36 -04:00
(load-dynamic-library "libc.so.6.1") ; Linux (DEC Alpha)
2026-02-01 16:33:20 -08:00
(load-dynamic-library "libc.so.7") ; Latest *BSD
2026-04-30 12:34:36 -04:00
(load-dynamic-library "libSystem.B.dylib") ; macOS / Darwin
2026-02-01 16:33:20 -08:00
(load-dynamic-library "shlwapi.dll") )) ; Windows
2023-07-01 11:58:00 -04:00
2026-02-01 16:33:20 -08:00
(define lib2
(load-dynamic-library "kernel32.dll")) ; Windows
2023-07-01 11:58:00 -04:00
2026-02-01 16:33:20 -08:00
(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))))
2023-07-01 11:58:00 -04:00
2026-02-01 16:33:20 -08:00
(print (strdup "Hello World!"))