ffi_callback.py 644 B

123456789101112131415161718192021222324252627282930313233
  1. try:
  2. import ffi
  3. except ImportError:
  4. print("SKIP")
  5. raise SystemExit
  6. def ffi_open(names):
  7. err = None
  8. for n in names:
  9. try:
  10. mod = ffi.open(n)
  11. return mod
  12. except OSError as e:
  13. err = e
  14. raise err
  15. libc = ffi_open(('libc.so', 'libc.so.0', 'libc.so.6', 'libc.dylib'))
  16. qsort = libc.func("v", "qsort", "piip")
  17. def cmp(pa, pb):
  18. a = ffi.as_bytearray(pa, 1)
  19. b = ffi.as_bytearray(pb, 1)
  20. #print("cmp:", a, b)
  21. return a[0] - b[0]
  22. cmp_c = ffi.callback("i", cmp, "pp")
  23. s = bytearray(b"foobar")
  24. print("org string:", s)
  25. qsort(s, len(s), 1, cmp_c)
  26. print("qsort'ed:", s)