un-inception/test/qr.nim
russell@unturf.com edfe6dc865 fix(qr): Fortran dlopen FFI + Nim versioned library names
- Fortran: use dlopen/dlsym at runtime instead of direct linking
  (sandbox doesn't pass -lqrencode to gfortran)
- Both: try libqrencode.so.4, .so.3, .so in order
2026-01-28 07:41:29 -05:00

32 lines
806 B
Nim

import dynlib
type
QRcode {.pure.} = object
version: cint
width: cint
data: pointer
type
QRencodeString = proc(s: cstring, ver: cint, level: cint, hint: cint, cs: cint): ptr QRcode {.cdecl.}
QRfree = proc(qr: ptr QRcode) {.cdecl.}
# Try versioned library names (Ubuntu 24.04 uses libqrencode.so.4)
var lib = loadLib("libqrencode.so.4")
if lib == nil:
lib = loadLib("libqrencode.so.3")
if lib == nil:
lib = loadLib("libqrencode.so")
if lib == nil:
quit("Failed to load libqrencode", 1)
let encode = cast[QRencodeString](lib.symAddr("QRcode_encodeString"))
let free_qr = cast[QRfree](lib.symAddr("QRcode_free"))
let qr = encode("unsandbox-qr-ok", 0, 1, 2, 1)
if qr != nil:
echo "QR:unsandbox-qr-ok:ROWS:", qr.width
free_qr(qr)
else:
echo "QR encode failed"
unloadLib(lib)