QR tests MUST use native language libraries, not qrencode CLI. If the sandbox doesn't have the library, the test should FAIL honestly so we know what to fix in the sandbox image. Also adds CLAUDE.md rule to prevent future attempts to replace native library QR tests with CLI subprocess calls.
58 lines
1.9 KiB
Fortran
58 lines
1.9 KiB
Fortran
program qrcode_test
|
|
use, intrinsic :: iso_c_binding
|
|
implicit none
|
|
|
|
type, bind(C) :: QRcode
|
|
integer(c_int) :: version
|
|
integer(c_int) :: width
|
|
type(c_ptr) :: data
|
|
end type QRcode
|
|
|
|
interface
|
|
type(c_ptr) function dlopen(filename, flag) bind(C, name='dlopen')
|
|
import :: c_ptr, c_char, c_int
|
|
character(kind=c_char), dimension(*), intent(in) :: filename
|
|
integer(c_int), value :: flag
|
|
end function
|
|
type(c_funptr) function dlsym(handle, symbol) bind(C, name='dlsym')
|
|
import :: c_ptr, c_funptr, c_char
|
|
type(c_ptr), value :: handle
|
|
character(kind=c_char), dimension(*), intent(in) :: symbol
|
|
end function
|
|
integer(c_int) function dlclose(handle) bind(C, name='dlclose')
|
|
import :: c_ptr, c_int
|
|
type(c_ptr), value :: handle
|
|
end function
|
|
end interface
|
|
|
|
abstract interface
|
|
type(c_ptr) function encode_iface(s, ver, lvl, hint, cs) bind(C)
|
|
import :: c_ptr, c_char, c_int
|
|
character(kind=c_char), dimension(*), intent(in) :: s
|
|
integer(c_int), value :: ver, lvl, hint, cs
|
|
end function
|
|
subroutine free_iface(qr) bind(C)
|
|
import :: c_ptr
|
|
type(c_ptr), value :: qr
|
|
end subroutine
|
|
end interface
|
|
|
|
type(c_ptr) :: lib, qr_ptr
|
|
type(c_funptr) :: enc_fptr, free_fptr
|
|
procedure(encode_iface), pointer :: qr_encode
|
|
procedure(free_iface), pointer :: qr_free
|
|
type(QRcode), pointer :: qr
|
|
|
|
lib = dlopen("libqrencode.so" // c_null_char, 2) ! RTLD_NOW=2
|
|
enc_fptr = dlsym(lib, "QRcode_encodeString" // c_null_char)
|
|
free_fptr = dlsym(lib, "QRcode_free" // c_null_char)
|
|
call c_f_procpointer(enc_fptr, qr_encode)
|
|
call c_f_procpointer(free_fptr, qr_free)
|
|
|
|
qr_ptr = qr_encode("unsandbox-qr-ok" // c_null_char, 0, 1, 2, 1)
|
|
call c_f_pointer(qr_ptr, qr)
|
|
write(*, '(A,I0)') 'QR:unsandbox-qr-ok:ROWS:', qr%width
|
|
|
|
call qr_free(qr_ptr)
|
|
call dlclose(lib)
|
|
end program qrcode_test
|