1# test 8/16/32/64 bit signed/unsigned integer arguments and return types for ffi functions
2# requires ffi_lib.c to be compiled as: $(CC) -shared -o ffi_lib.so ffi_lib.c
3
4import uos, usys
5
6try:
7    import ffi
8except ImportError:
9    print("SKIP")
10    raise SystemExit
11
12ffi_lib_filename = "./" + usys.argv[0].rsplit("/", 1)[0] + "/ffi_lib.so"
13try:
14    uos.stat(ffi_lib_filename)
15except OSError:
16    print("SKIP")
17    raise SystemExit
18
19ffi_lib = ffi.open(ffi_lib_filename)
20
21f8i = ffi_lib.func("b", "f8i", "b")
22f8u = ffi_lib.func("B", "f8u", "B")
23f16i = ffi_lib.func("h", "f16i", "h")
24f16u = ffi_lib.func("H", "f16u", "H")
25f32i = ffi_lib.func("i", "f32i", "i")
26f32u = ffi_lib.func("I", "f32u", "I")
27f64i = ffi_lib.func("q", "f64i", "q")
28f64u = ffi_lib.func("Q", "f64u", "Q")
29
30for func_name in ("f8i", "f8u", "f16i", "f16u", "f32i", "f32u", "f64i", "f64u"):
31    func = globals()[func_name]
32    for val in (
33        0,
34        0x7F,
35        0x80,
36        0xFF,
37        0x100,
38        0x7FFF,
39        0x8000,
40        0xFFFF,
41        0x10000,
42        0x7FFFFFFF,
43        0x80000000,
44        0xFFFFFFFF,
45        0x100000000,
46        0x7FFF_FFFF_FFFF_FFFF,
47        0x8000_0000_0000_0000,
48        0xFFFF_FFFF_FFFF_FFFF,
49        0x1_0000_0000_0000_0000,
50    ):
51        print("{}({:x}) = {:x}".format(func_name, val, func(val)))
52