un-inception/test/qr.hs
russell@unturf.com bec3f8c289 fix(qr): rewrite 7 failing language tests to use native C FFI
All use dlopen/dlsym to libqrencode.so (system-wide via gcc role):
- Haskell: System.Posix.DynamicLinker + foreign import ccall "dynamic"
- F#: Mono P/Invoke DllImport("libqrencode.so")
- COBOL: LINKAGE SECTION for proper struct pointer access
- Nim: dynlib module (loadLib/symAddr)
- Fortran: renamed dlclose binding to avoid symbol collision
- D: core.sys.posix.dlfcn (dlopen/dlsym)
- OCaml: Ctypes.foreign via ocamlfind #require
2026-01-27 19:53:21 -05:00

41 lines
1 KiB
Haskell

import System.Posix.DynamicLinker
import Foreign
import Foreign.C.Types
import Foreign.C.String
data QRcode = QRcode CInt CInt (Ptr Word8)
instance Storable QRcode where
sizeOf _ = 16
alignment _ = 8
peek ptr = QRcode
<$> peekByteOff ptr 0
<*> peekByteOff ptr 4
<*> peekByteOff ptr 8
poke _ _ = return ()
type EncodeFunc = CString -> CInt -> CInt -> CInt -> CInt -> IO (Ptr QRcode)
type FreeFunc = Ptr QRcode -> IO ()
foreign import ccall "dynamic"
mkEncode :: FunPtr EncodeFunc -> EncodeFunc
foreign import ccall "dynamic"
mkFree :: FunPtr FreeFunc -> FreeFunc
main :: IO ()
main = do
dl <- dlopen "libqrencode.so" [RTLD_LAZY]
encFP <- dlsym dl "QRcode_encodeString"
freeFP <- dlsym dl "QRcode_free"
let encode = mkEncode encFP
let qfree = mkFree freeFP
cs <- newCString "unsandbox-qr-ok"
qr <- encode cs 0 1 2 1
if qr == nullPtr
then putStrLn "QR encode failed"
else do
QRcode _ w _ <- peek qr
putStrLn $ "QR:unsandbox-qr-ok:ROWS:" ++ show w
qfree qr
free cs