ffi 0.5.0-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of ffi might be problematic. Click here for more details.
- data/LICENSE +51 -0
- data/README.rdoc +69 -0
- data/Rakefile +191 -0
- data/ext/ffi_c/AbstractMemory.c +489 -0
- data/ext/ffi_c/AbstractMemory.h +160 -0
- data/ext/ffi_c/ArrayType.c +129 -0
- data/ext/ffi_c/ArrayType.h +58 -0
- data/ext/ffi_c/AutoPointer.c +61 -0
- data/ext/ffi_c/AutoPointer.h +18 -0
- data/ext/ffi_c/Buffer.c +187 -0
- data/ext/ffi_c/Call.c +853 -0
- data/ext/ffi_c/Call.h +86 -0
- data/ext/ffi_c/ClosurePool.c +302 -0
- data/ext/ffi_c/ClosurePool.h +29 -0
- data/ext/ffi_c/DynamicLibrary.c +216 -0
- data/ext/ffi_c/DynamicLibrary.h +22 -0
- data/ext/ffi_c/Function.c +478 -0
- data/ext/ffi_c/Function.h +80 -0
- data/ext/ffi_c/FunctionInfo.c +221 -0
- data/ext/ffi_c/LastError.c +159 -0
- data/ext/ffi_c/LastError.h +18 -0
- data/ext/ffi_c/MemoryPointer.c +178 -0
- data/ext/ffi_c/MemoryPointer.h +20 -0
- data/ext/ffi_c/MethodHandle.c +346 -0
- data/ext/ffi_c/MethodHandle.h +53 -0
- data/ext/ffi_c/Platform.c +59 -0
- data/ext/ffi_c/Platform.h +16 -0
- data/ext/ffi_c/Pointer.c +224 -0
- data/ext/ffi_c/Pointer.h +49 -0
- data/ext/ffi_c/Struct.c +770 -0
- data/ext/ffi_c/Struct.h +80 -0
- data/ext/ffi_c/StructByValue.c +140 -0
- data/ext/ffi_c/StructByValue.h +53 -0
- data/ext/ffi_c/StructLayout.c +450 -0
- data/ext/ffi_c/Type.c +329 -0
- data/ext/ffi_c/Type.h +57 -0
- data/ext/ffi_c/Types.c +103 -0
- data/ext/ffi_c/Types.h +85 -0
- data/ext/ffi_c/Variadic.c +260 -0
- data/ext/ffi_c/compat.h +72 -0
- data/ext/ffi_c/endian.h +40 -0
- data/ext/ffi_c/extconf.rb +30 -0
- data/ext/ffi_c/ffi.c +82 -0
- data/ext/ffi_c/libffi.bsd.mk +34 -0
- data/ext/ffi_c/libffi.darwin.mk +75 -0
- data/ext/ffi_c/libffi.gnu.mk +29 -0
- data/ext/ffi_c/libffi.mk +13 -0
- data/ext/ffi_c/libffi/ChangeLog +3243 -0
- data/ext/ffi_c/libffi/ChangeLog.libffi +347 -0
- data/ext/ffi_c/libffi/ChangeLog.libgcj +40 -0
- data/ext/ffi_c/libffi/ChangeLog.v1 +764 -0
- data/ext/ffi_c/libffi/LICENSE +21 -0
- data/ext/ffi_c/libffi/Makefile.am +177 -0
- data/ext/ffi_c/libffi/Makefile.in +1640 -0
- data/ext/ffi_c/libffi/README +328 -0
- data/ext/ffi_c/libffi/TODO +1 -0
- data/ext/ffi_c/libffi/acinclude.m4 +92 -0
- data/ext/ffi_c/libffi/aclocal.m4 +7516 -0
- data/ext/ffi_c/libffi/compile +142 -0
- data/ext/ffi_c/libffi/config.guess +1516 -0
- data/ext/ffi_c/libffi/config.sub +1626 -0
- data/ext/ffi_c/libffi/configure +24414 -0
- data/ext/ffi_c/libffi/configure.ac +365 -0
- data/ext/ffi_c/libffi/configure.host +11 -0
- data/ext/ffi_c/libffi/depcomp +584 -0
- data/ext/ffi_c/libffi/doc/libffi.info +533 -0
- data/ext/ffi_c/libffi/doc/libffi.texi +541 -0
- data/ext/ffi_c/libffi/doc/stamp-vti +4 -0
- data/ext/ffi_c/libffi/doc/version.texi +4 -0
- data/ext/ffi_c/libffi/fficonfig.h.in +160 -0
- data/ext/ffi_c/libffi/include/Makefile.am +9 -0
- data/ext/ffi_c/libffi/include/Makefile.in +422 -0
- data/ext/ffi_c/libffi/include/ffi.h.in +393 -0
- data/ext/ffi_c/libffi/include/ffi_common.h +98 -0
- data/ext/ffi_c/libffi/install-sh +323 -0
- data/ext/ffi_c/libffi/libffi.pc.in +10 -0
- data/ext/ffi_c/libffi/libtool-version +29 -0
- data/ext/ffi_c/libffi/ltcf-c.sh +861 -0
- data/ext/ffi_c/libffi/ltcf-cxx.sh +1069 -0
- data/ext/ffi_c/libffi/ltcf-gcj.sh +700 -0
- data/ext/ffi_c/libffi/ltconfig +2862 -0
- data/ext/ffi_c/libffi/ltmain.sh +6930 -0
- data/ext/ffi_c/libffi/man/Makefile.am +8 -0
- data/ext/ffi_c/libffi/man/Makefile.in +395 -0
- data/ext/ffi_c/libffi/man/ffi.3 +31 -0
- data/ext/ffi_c/libffi/man/ffi_call.3 +103 -0
- data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +66 -0
- data/ext/ffi_c/libffi/mdate-sh +201 -0
- data/ext/ffi_c/libffi/missing +353 -0
- data/ext/ffi_c/libffi/mkinstalldirs +158 -0
- data/ext/ffi_c/libffi/src/alpha/ffi.c +284 -0
- data/ext/ffi_c/libffi/src/alpha/ffitarget.h +48 -0
- data/ext/ffi_c/libffi/src/alpha/osf.S +366 -0
- data/ext/ffi_c/libffi/src/arm/ffi.c +309 -0
- data/ext/ffi_c/libffi/src/arm/ffitarget.h +49 -0
- data/ext/ffi_c/libffi/src/arm/sysv.S +299 -0
- data/ext/ffi_c/libffi/src/closures.c +596 -0
- data/ext/ffi_c/libffi/src/cris/ffi.c +383 -0
- data/ext/ffi_c/libffi/src/cris/ffitarget.h +51 -0
- data/ext/ffi_c/libffi/src/cris/sysv.S +215 -0
- data/ext/ffi_c/libffi/src/debug.c +59 -0
- data/ext/ffi_c/libffi/src/dlmalloc.c +5099 -0
- data/ext/ffi_c/libffi/src/frv/eabi.S +128 -0
- data/ext/ffi_c/libffi/src/frv/ffi.c +292 -0
- data/ext/ffi_c/libffi/src/frv/ffitarget.h +61 -0
- data/ext/ffi_c/libffi/src/ia64/ffi.c +580 -0
- data/ext/ffi_c/libffi/src/ia64/ffitarget.h +50 -0
- data/ext/ffi_c/libffi/src/ia64/ia64_flags.h +40 -0
- data/ext/ffi_c/libffi/src/ia64/unix.S +560 -0
- data/ext/ffi_c/libffi/src/java_raw_api.c +359 -0
- data/ext/ffi_c/libffi/src/m32r/ffi.c +232 -0
- data/ext/ffi_c/libffi/src/m32r/ffitarget.h +48 -0
- data/ext/ffi_c/libffi/src/m32r/sysv.S +121 -0
- data/ext/ffi_c/libffi/src/m68k/ffi.c +278 -0
- data/ext/ffi_c/libffi/src/m68k/ffitarget.h +49 -0
- data/ext/ffi_c/libffi/src/m68k/sysv.S +234 -0
- data/ext/ffi_c/libffi/src/mips/ffi.c +926 -0
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +202 -0
- data/ext/ffi_c/libffi/src/mips/n32.S +534 -0
- data/ext/ffi_c/libffi/src/mips/o32.S +381 -0
- data/ext/ffi_c/libffi/src/pa/ffi.c +709 -0
- data/ext/ffi_c/libffi/src/pa/ffitarget.h +77 -0
- data/ext/ffi_c/libffi/src/pa/hpux32.S +368 -0
- data/ext/ffi_c/libffi/src/pa/linux.S +357 -0
- data/ext/ffi_c/libffi/src/powerpc/aix.S +225 -0
- data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +247 -0
- data/ext/ffi_c/libffi/src/powerpc/asm.h +125 -0
- data/ext/ffi_c/libffi/src/powerpc/darwin.S +245 -0
- data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +317 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi.c +1429 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +800 -0
- data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +118 -0
- data/ext/ffi_c/libffi/src/powerpc/linux64.S +187 -0
- data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +236 -0
- data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +327 -0
- data/ext/ffi_c/libffi/src/powerpc/sysv.S +230 -0
- data/ext/ffi_c/libffi/src/prep_cif.c +174 -0
- data/ext/ffi_c/libffi/src/raw_api.c +254 -0
- data/ext/ffi_c/libffi/src/s390/ffi.c +780 -0
- data/ext/ffi_c/libffi/src/s390/ffitarget.h +60 -0
- data/ext/ffi_c/libffi/src/s390/sysv.S +434 -0
- data/ext/ffi_c/libffi/src/sh/ffi.c +716 -0
- data/ext/ffi_c/libffi/src/sh/ffitarget.h +49 -0
- data/ext/ffi_c/libffi/src/sh/sysv.S +850 -0
- data/ext/ffi_c/libffi/src/sh64/ffi.c +453 -0
- data/ext/ffi_c/libffi/src/sh64/ffitarget.h +53 -0
- data/ext/ffi_c/libffi/src/sh64/sysv.S +530 -0
- data/ext/ffi_c/libffi/src/sparc/ffi.c +610 -0
- data/ext/ffi_c/libffi/src/sparc/ffitarget.h +66 -0
- data/ext/ffi_c/libffi/src/sparc/v8.S +272 -0
- data/ext/ffi_c/libffi/src/sparc/v9.S +307 -0
- data/ext/ffi_c/libffi/src/types.c +77 -0
- data/ext/ffi_c/libffi/src/x86/darwin.S +443 -0
- data/ext/ffi_c/libffi/src/x86/darwin64.S +416 -0
- data/ext/ffi_c/libffi/src/x86/ffi.c +475 -0
- data/ext/ffi_c/libffi/src/x86/ffi64.c +572 -0
- data/ext/ffi_c/libffi/src/x86/ffitarget.h +90 -0
- data/ext/ffi_c/libffi/src/x86/freebsd.S +458 -0
- data/ext/ffi_c/libffi/src/x86/sysv.S +437 -0
- data/ext/ffi_c/libffi/src/x86/unix64.S +418 -0
- data/ext/ffi_c/libffi/src/x86/win32.S +391 -0
- data/ext/ffi_c/libffi/testsuite/Makefile.am +71 -0
- data/ext/ffi_c/libffi/testsuite/Makefile.in +447 -0
- data/ext/ffi_c/libffi/testsuite/config/default.exp +1 -0
- data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +289 -0
- data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +263 -0
- data/ext/ffi_c/libffi/testsuite/lib/wrapper.exp +45 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +36 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +97 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +89 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +89 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +90 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +97 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +72 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +102 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +103 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +104 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +110 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +97 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +101 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +121 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +103 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +106 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +117 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +106 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +132 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +121 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +107 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +125 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +105 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +96 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +101 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +100 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +101 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +100 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +51 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +51 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +82 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +82 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +94 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +82 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +94 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +52 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +50 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +50 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +50 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +51 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +54 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +51 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +86 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/float.c +59 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +58 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +57 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +72 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +62 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +69 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +63 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +53 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +160 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +169 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +141 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +118 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +119 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +119 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +120 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +139 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +119 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +139 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +139 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +59 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +35 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +35 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +36 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +49 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +42 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +34 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +41 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +42 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +36 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +38 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +38 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +38 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +44 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +44 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +65 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +67 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +59 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +63 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +65 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +64 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +74 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +80 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +67 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +86 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +38 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +123 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc +53 -0
- data/ext/ffi_c/libffi/texinfo.tex +7482 -0
- data/ext/ffi_c/rbffi.h +26 -0
- data/gen/Rakefile +12 -0
- data/lib/1.8/ffi_c.so +0 -0
- data/lib/1.9/ffi_c.so +0 -0
- data/lib/ffi.rb +11 -0
- data/lib/ffi/autopointer.rb +61 -0
- data/lib/ffi/buffer.rb +0 -0
- data/lib/ffi/callback.rb +10 -0
- data/lib/ffi/enum.rb +78 -0
- data/lib/ffi/errno.rb +8 -0
- data/lib/ffi/ffi.rb +99 -0
- data/lib/ffi/io.rb +21 -0
- data/lib/ffi/library.rb +218 -0
- data/lib/ffi/managedstruct.rb +55 -0
- data/lib/ffi/memorypointer.rb +73 -0
- data/lib/ffi/platform.rb +88 -0
- data/lib/ffi/pointer.rb +119 -0
- data/lib/ffi/struct.rb +183 -0
- data/lib/ffi/tools/const_generator.rb +177 -0
- data/lib/ffi/tools/generator.rb +58 -0
- data/lib/ffi/tools/generator_task.rb +35 -0
- data/lib/ffi/tools/struct_generator.rb +194 -0
- data/lib/ffi/tools/types_generator.rb +123 -0
- data/lib/ffi/types.rb +153 -0
- data/lib/ffi/union.rb +12 -0
- data/lib/ffi/variadic.rb +25 -0
- data/spec/ffi/bool_spec.rb +24 -0
- data/spec/ffi/buffer_spec.rb +202 -0
- data/spec/ffi/callback_spec.rb +591 -0
- data/spec/ffi/enum_spec.rb +164 -0
- data/spec/ffi/errno_spec.rb +13 -0
- data/spec/ffi/function_spec.rb +73 -0
- data/spec/ffi/library_spec.rb +148 -0
- data/spec/ffi/managed_struct_spec.rb +56 -0
- data/spec/ffi/number_spec.rb +231 -0
- data/spec/ffi/pointer_spec.rb +195 -0
- data/spec/ffi/rbx/attach_function_spec.rb +27 -0
- data/spec/ffi/rbx/memory_pointer_spec.rb +102 -0
- data/spec/ffi/rbx/spec_helper.rb +1 -0
- data/spec/ffi/rbx/struct_spec.rb +13 -0
- data/spec/ffi/spec_helper.rb +17 -0
- data/spec/ffi/string_spec.rb +103 -0
- data/spec/ffi/struct_callback_spec.rb +64 -0
- data/spec/ffi/struct_initialize_spec.rb +30 -0
- data/spec/ffi/struct_spec.rb +529 -0
- data/spec/ffi/typedef_spec.rb +48 -0
- data/spec/ffi/union_spec.rb +60 -0
- data/spec/ffi/variadic_spec.rb +84 -0
- data/spec/spec.opts +4 -0
- metadata +396 -0
data/ext/ffi_c/Types.h
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2008, 2009, Wayne Meissner
|
3
|
+
* Copyright (c) 2009, Luc Heinrich <luc@honk-honk.com>
|
4
|
+
*
|
5
|
+
* All rights reserved.
|
6
|
+
*
|
7
|
+
* Redistribution and use in source and binary forms, with or without
|
8
|
+
* modification, are permitted provided that the following conditions are met:
|
9
|
+
*
|
10
|
+
* * Redistributions of source code must retain the above copyright notice, this
|
11
|
+
* list of conditions and the following disclaimer.
|
12
|
+
* * Redistributions in binary form must reproduce the above copyright notice
|
13
|
+
* this list of conditions and the following disclaimer in the documentation
|
14
|
+
* and/or other materials provided with the distribution.
|
15
|
+
* * The name of the author or authors may not be used to endorse or promote
|
16
|
+
* products derived from this software without specific prior written permission.
|
17
|
+
*
|
18
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
19
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
20
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
21
|
+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
22
|
+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
23
|
+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
24
|
+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
25
|
+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
26
|
+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
27
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28
|
+
*/
|
29
|
+
|
30
|
+
#ifndef RBFFI_TYPES_H
|
31
|
+
#define RBFFI_TYPES_H
|
32
|
+
|
33
|
+
#ifdef __cplusplus
|
34
|
+
extern "C" {
|
35
|
+
#endif
|
36
|
+
|
37
|
+
typedef enum {
|
38
|
+
NATIVE_VOID,
|
39
|
+
NATIVE_INT8,
|
40
|
+
NATIVE_UINT8,
|
41
|
+
NATIVE_INT16,
|
42
|
+
NATIVE_UINT16,
|
43
|
+
NATIVE_INT32,
|
44
|
+
NATIVE_UINT32,
|
45
|
+
NATIVE_INT64,
|
46
|
+
NATIVE_UINT64,
|
47
|
+
NATIVE_FLOAT32,
|
48
|
+
NATIVE_FLOAT64,
|
49
|
+
NATIVE_POINTER,
|
50
|
+
NATIVE_CALLBACK,
|
51
|
+
NATIVE_FUNCTION,
|
52
|
+
NATIVE_BUFFER_IN,
|
53
|
+
NATIVE_BUFFER_OUT,
|
54
|
+
NATIVE_BUFFER_INOUT,
|
55
|
+
NATIVE_CHAR_ARRAY,
|
56
|
+
NATIVE_BOOL,
|
57
|
+
|
58
|
+
/**
|
59
|
+
* An immutable string. Nul terminated, but only copies in to the native function
|
60
|
+
*/
|
61
|
+
NATIVE_STRING,
|
62
|
+
/** A Rubinus :string arg - copies data both ways, and nul terminates */
|
63
|
+
NATIVE_RBXSTRING,
|
64
|
+
/** The function takes a variable number of arguments */
|
65
|
+
NATIVE_VARARGS,
|
66
|
+
/** A typedef-ed enum */
|
67
|
+
NATIVE_ENUM,
|
68
|
+
/** Struct-by-value param or result */
|
69
|
+
NATIVE_STRUCT,
|
70
|
+
/** An array type definition */
|
71
|
+
NATIVE_ARRAY,
|
72
|
+
} NativeType;
|
73
|
+
|
74
|
+
#include <ffi.h>
|
75
|
+
#include "Type.h"
|
76
|
+
|
77
|
+
VALUE rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr, VALUE enums);
|
78
|
+
void rbffi_Types_Init(VALUE moduleFFI);
|
79
|
+
|
80
|
+
#ifdef __cplusplus
|
81
|
+
}
|
82
|
+
#endif
|
83
|
+
|
84
|
+
#endif /* RBFFI_TYPES_H */
|
85
|
+
|
@@ -0,0 +1,260 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2008, 2009, Wayne Meissner
|
3
|
+
* All rights reserved.
|
4
|
+
*
|
5
|
+
* Redistribution and use in source and binary forms, with or without
|
6
|
+
* modification, are permitted provided that the following conditions are met:
|
7
|
+
*
|
8
|
+
* * Redistributions of source code must retain the above copyright notice, this
|
9
|
+
* list of conditions and the following disclaimer.
|
10
|
+
* * Redistributions in binary form must reproduce the above copyright notice
|
11
|
+
* this list of conditions and the following disclaimer in the documentation
|
12
|
+
* and/or other materials provided with the distribution.
|
13
|
+
* * The name of the author or authors may not be used to endorse or promote
|
14
|
+
* products derived from this software without specific prior written permission.
|
15
|
+
*
|
16
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
17
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
18
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
19
|
+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
20
|
+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
21
|
+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
22
|
+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
23
|
+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
24
|
+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
25
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
*/
|
27
|
+
|
28
|
+
#include <sys/param.h>
|
29
|
+
#include <sys/types.h>
|
30
|
+
|
31
|
+
#include <stdio.h>
|
32
|
+
#include <stdint.h>
|
33
|
+
#include <stdbool.h>
|
34
|
+
#include <ruby.h>
|
35
|
+
|
36
|
+
#include <ffi.h>
|
37
|
+
#include "rbffi.h"
|
38
|
+
#include "compat.h"
|
39
|
+
|
40
|
+
#include "AbstractMemory.h"
|
41
|
+
#include "Pointer.h"
|
42
|
+
#include "Types.h"
|
43
|
+
#include "Type.h"
|
44
|
+
#include "LastError.h"
|
45
|
+
#include "MethodHandle.h"
|
46
|
+
#include "Call.h"
|
47
|
+
|
48
|
+
typedef struct VariadicInvoker_ {
|
49
|
+
VALUE rbAddress;
|
50
|
+
VALUE rbReturnType;
|
51
|
+
VALUE rbEnums;
|
52
|
+
|
53
|
+
Type* returnType;
|
54
|
+
ffi_abi abi;
|
55
|
+
void* function;
|
56
|
+
int paramCount;
|
57
|
+
} VariadicInvoker;
|
58
|
+
|
59
|
+
|
60
|
+
static VALUE variadic_allocate(VALUE klass);
|
61
|
+
static VALUE variadic_initialize(VALUE self, VALUE rbFunction, VALUE rbParameterTypes,
|
62
|
+
VALUE rbReturnType, VALUE options);
|
63
|
+
static void variadic_mark(VariadicInvoker *);
|
64
|
+
|
65
|
+
static VALUE classVariadicInvoker = Qnil;
|
66
|
+
|
67
|
+
|
68
|
+
static VALUE
|
69
|
+
variadic_allocate(VALUE klass)
|
70
|
+
{
|
71
|
+
VariadicInvoker *invoker;
|
72
|
+
VALUE obj = Data_Make_Struct(klass, VariadicInvoker, variadic_mark, -1, invoker);
|
73
|
+
|
74
|
+
invoker->rbAddress = Qnil;
|
75
|
+
invoker->rbEnums = Qnil;
|
76
|
+
invoker->rbReturnType = Qnil;
|
77
|
+
|
78
|
+
return obj;
|
79
|
+
}
|
80
|
+
|
81
|
+
static void
|
82
|
+
variadic_mark(VariadicInvoker *invoker)
|
83
|
+
{
|
84
|
+
rb_gc_mark(invoker->rbEnums);
|
85
|
+
rb_gc_mark(invoker->rbAddress);
|
86
|
+
rb_gc_mark(invoker->rbReturnType);
|
87
|
+
}
|
88
|
+
|
89
|
+
static VALUE
|
90
|
+
variadic_initialize(VALUE self, VALUE rbFunction, VALUE rbParameterTypes, VALUE rbReturnType, VALUE options)
|
91
|
+
{
|
92
|
+
VariadicInvoker* invoker = NULL;
|
93
|
+
VALUE retval = Qnil;
|
94
|
+
VALUE convention = Qnil;
|
95
|
+
VALUE fixed = Qnil;
|
96
|
+
int i;
|
97
|
+
|
98
|
+
Check_Type(options, T_HASH);
|
99
|
+
convention = rb_hash_aref(options, ID2SYM(rb_intern("convention")));
|
100
|
+
|
101
|
+
Data_Get_Struct(self, VariadicInvoker, invoker);
|
102
|
+
invoker->rbEnums = rb_hash_aref(options, ID2SYM(rb_intern("enums")));
|
103
|
+
invoker->rbAddress = rbFunction;
|
104
|
+
invoker->function = rbffi_AbstractMemory_Cast(rbFunction, rbffi_PointerClass)->address;
|
105
|
+
|
106
|
+
#if defined(_WIN32) || defined(__WIN32__)
|
107
|
+
VALUE rbConventionStr = rb_funcall2(convention, rb_intern("to_s"), 0, NULL);
|
108
|
+
invoker->abi = (RTEST(convention) && strcmp(StringValueCStr(rbConventionStr), "stdcall") == 0)
|
109
|
+
? FFI_STDCALL : FFI_DEFAULT_ABI;
|
110
|
+
#else
|
111
|
+
invoker->abi = FFI_DEFAULT_ABI;
|
112
|
+
#endif
|
113
|
+
|
114
|
+
invoker->rbReturnType = rbffi_Type_Lookup(rbReturnType);
|
115
|
+
if (!RTEST(invoker->rbReturnType)) {
|
116
|
+
VALUE typeName = rb_funcall2(rbReturnType, rb_intern("inspect"), 0, NULL);
|
117
|
+
rb_raise(rb_eTypeError, "Invalid return type (%s)", RSTRING_PTR(typeName));
|
118
|
+
}
|
119
|
+
|
120
|
+
Data_Get_Struct(rbReturnType, Type, invoker->returnType);
|
121
|
+
|
122
|
+
invoker->paramCount = -1;
|
123
|
+
|
124
|
+
fixed = rb_ary_new2(RARRAY_LEN(rbParameterTypes) - 1);
|
125
|
+
for (i = 0; i < RARRAY_LEN(rbParameterTypes); ++i) {
|
126
|
+
VALUE entry = rb_ary_entry(rbParameterTypes, i);
|
127
|
+
VALUE rbType = rbffi_Type_Lookup(entry);
|
128
|
+
Type* type;
|
129
|
+
|
130
|
+
if (!RTEST(rbType)) {
|
131
|
+
VALUE typeName = rb_funcall2(entry, rb_intern("inspect"), 0, NULL);
|
132
|
+
rb_raise(rb_eTypeError, "Invalid parameter type (%s)", RSTRING_PTR(typeName));
|
133
|
+
}
|
134
|
+
Data_Get_Struct(rbType, Type, type);
|
135
|
+
if (type->nativeType != NATIVE_VARARGS) {
|
136
|
+
rb_ary_push(fixed, entry);
|
137
|
+
}
|
138
|
+
}
|
139
|
+
/*
|
140
|
+
* @fixed and @type_map are used by the parameter mangling ruby code
|
141
|
+
*/
|
142
|
+
rb_iv_set(self, "@fixed", fixed);
|
143
|
+
rb_iv_set(self, "@type_map", rb_hash_aref(options, ID2SYM(rb_intern("type_map"))));
|
144
|
+
|
145
|
+
return retval;
|
146
|
+
}
|
147
|
+
|
148
|
+
|
149
|
+
static inline VALUE
|
150
|
+
ffi_invoke(ffi_cif* cif, void* function, Type* returnType, void** ffiValues,
|
151
|
+
VALUE rbReturnType, VALUE rbEnums)
|
152
|
+
{
|
153
|
+
FFIStorage retval;
|
154
|
+
|
155
|
+
#ifdef USE_RAW
|
156
|
+
ffi_raw_call(cif, function, &retval, (ffi_raw *) ffiValues[0]);
|
157
|
+
#else
|
158
|
+
ffi_call(cif, function, &retval, ffiValues);
|
159
|
+
#endif
|
160
|
+
rbffi_save_errno();
|
161
|
+
|
162
|
+
return rbffi_NativeValue_ToRuby(returnType, rbReturnType, &retval, rbEnums);
|
163
|
+
}
|
164
|
+
|
165
|
+
static VALUE
|
166
|
+
variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues)
|
167
|
+
{
|
168
|
+
VariadicInvoker* invoker;
|
169
|
+
FFIStorage* params;
|
170
|
+
ffi_cif cif;
|
171
|
+
void** ffiValues;
|
172
|
+
ffi_type** ffiParamTypes;
|
173
|
+
ffi_type* ffiReturnType;
|
174
|
+
NativeType* paramTypes;
|
175
|
+
VALUE* argv;
|
176
|
+
int paramCount = 0, i;
|
177
|
+
ffi_status ffiStatus;
|
178
|
+
|
179
|
+
Check_Type(parameterTypes, T_ARRAY);
|
180
|
+
Check_Type(parameterValues, T_ARRAY);
|
181
|
+
|
182
|
+
Data_Get_Struct(self, VariadicInvoker, invoker);
|
183
|
+
paramCount = RARRAY_LEN(parameterTypes);
|
184
|
+
paramTypes = ALLOCA_N(NativeType, paramCount);
|
185
|
+
ffiParamTypes = ALLOCA_N(ffi_type *, paramCount);
|
186
|
+
params = ALLOCA_N(FFIStorage, paramCount);
|
187
|
+
ffiValues = ALLOCA_N(void*, paramCount);
|
188
|
+
argv = ALLOCA_N(VALUE, paramCount);
|
189
|
+
|
190
|
+
for (i = 0; i < paramCount; ++i) {
|
191
|
+
VALUE entry = rb_ary_entry(parameterTypes, i);
|
192
|
+
int paramType = rbffi_Type_GetIntValue(entry);
|
193
|
+
Type* type;
|
194
|
+
Data_Get_Struct(entry, Type, type);
|
195
|
+
|
196
|
+
switch (paramType) {
|
197
|
+
case NATIVE_INT8:
|
198
|
+
case NATIVE_INT16:
|
199
|
+
case NATIVE_INT32:
|
200
|
+
case NATIVE_ENUM:
|
201
|
+
paramType = NATIVE_INT32;
|
202
|
+
ffiParamTypes[i] = &ffi_type_sint;
|
203
|
+
break;
|
204
|
+
case NATIVE_UINT8:
|
205
|
+
case NATIVE_UINT16:
|
206
|
+
case NATIVE_UINT32:
|
207
|
+
paramType = NATIVE_UINT32;
|
208
|
+
ffiParamTypes[i] = &ffi_type_uint;
|
209
|
+
break;
|
210
|
+
case NATIVE_FLOAT32:
|
211
|
+
paramType = NATIVE_FLOAT64;
|
212
|
+
ffiParamTypes[i] = &ffi_type_double;
|
213
|
+
break;
|
214
|
+
default:
|
215
|
+
ffiParamTypes[i] = type->ffiType;
|
216
|
+
break;
|
217
|
+
}
|
218
|
+
paramTypes[i] = paramType;
|
219
|
+
if (ffiParamTypes[i] == NULL) {
|
220
|
+
rb_raise(rb_eArgError, "Invalid parameter type #%x", paramType);
|
221
|
+
}
|
222
|
+
argv[i] = rb_ary_entry(parameterValues, i);
|
223
|
+
}
|
224
|
+
|
225
|
+
ffiReturnType = invoker->returnType->ffiType;
|
226
|
+
if (ffiReturnType == NULL) {
|
227
|
+
rb_raise(rb_eArgError, "Invalid return type");
|
228
|
+
}
|
229
|
+
ffiStatus = ffi_prep_cif(&cif, invoker->abi, paramCount, ffiReturnType, ffiParamTypes);
|
230
|
+
switch (ffiStatus) {
|
231
|
+
case FFI_BAD_ABI:
|
232
|
+
rb_raise(rb_eArgError, "Invalid ABI specified");
|
233
|
+
case FFI_BAD_TYPEDEF:
|
234
|
+
rb_raise(rb_eArgError, "Invalid argument type specified");
|
235
|
+
case FFI_OK:
|
236
|
+
break;
|
237
|
+
default:
|
238
|
+
rb_raise(rb_eArgError, "Unknown FFI error");
|
239
|
+
}
|
240
|
+
|
241
|
+
rbffi_SetupCallParams(paramCount, argv, -1, paramTypes, params,
|
242
|
+
ffiValues, NULL, 0, invoker->rbEnums);
|
243
|
+
|
244
|
+
return ffi_invoke(&cif, invoker->function, invoker->returnType,
|
245
|
+
ffiValues, invoker->rbReturnType, invoker->rbEnums);
|
246
|
+
}
|
247
|
+
|
248
|
+
|
249
|
+
void
|
250
|
+
rbffi_Variadic_Init(VALUE moduleFFI)
|
251
|
+
{
|
252
|
+
classVariadicInvoker = rb_define_class_under(moduleFFI, "VariadicInvoker", rb_cObject);
|
253
|
+
rb_global_variable(&classVariadicInvoker);
|
254
|
+
|
255
|
+
rb_define_alloc_func(classVariadicInvoker, variadic_allocate);
|
256
|
+
|
257
|
+
rb_define_method(classVariadicInvoker, "initialize", variadic_initialize, 4);
|
258
|
+
rb_define_method(classVariadicInvoker, "invoke", variadic_invoke, 2);
|
259
|
+
}
|
260
|
+
|
data/ext/ffi_c/compat.h
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2008, 2009, Wayne Meissner
|
3
|
+
* All rights reserved.
|
4
|
+
*
|
5
|
+
* Redistribution and use in source and binary forms, with or without
|
6
|
+
* modification, are permitted provided that the following conditions are met:
|
7
|
+
*
|
8
|
+
* * Redistributions of source code must retain the above copyright notice, this
|
9
|
+
* list of conditions and the following disclaimer.
|
10
|
+
* * Redistributions in binary form must reproduce the above copyright notice
|
11
|
+
* this list of conditions and the following disclaimer in the documentation
|
12
|
+
* and/or other materials provided with the distribution.
|
13
|
+
* * The name of the author or authors may not be used to endorse or promote
|
14
|
+
* products derived from this software without specific prior written permission.
|
15
|
+
*
|
16
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
17
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
18
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
19
|
+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
20
|
+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
21
|
+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
22
|
+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
23
|
+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
24
|
+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
25
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
*/
|
27
|
+
|
28
|
+
#ifndef RBFFI_COMPAT_H
|
29
|
+
#define RBFFI_COMPAT_H
|
30
|
+
|
31
|
+
#include <ruby.h>
|
32
|
+
|
33
|
+
#ifndef RARRAY_LEN
|
34
|
+
# define RARRAY_LEN(ary) RARRAY(ary)->len
|
35
|
+
#endif
|
36
|
+
|
37
|
+
#ifndef RARRAY_PTR
|
38
|
+
# define RARRAY_PTR(ary) RARRAY(ary)->ptr
|
39
|
+
#endif
|
40
|
+
|
41
|
+
#ifndef RSTRING_LEN
|
42
|
+
# define RSTRING_LEN(s) RSTRING(s)->len
|
43
|
+
#endif
|
44
|
+
|
45
|
+
#ifndef RSTRING_PTR
|
46
|
+
# define RSTRING_PTR(s) RSTRING(s)->ptr
|
47
|
+
#endif
|
48
|
+
|
49
|
+
#ifndef NUM2ULL
|
50
|
+
# define NUM2ULL(x) rb_num2ull((VALUE)x)
|
51
|
+
#endif
|
52
|
+
|
53
|
+
#ifndef roundup
|
54
|
+
# define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
|
55
|
+
#endif
|
56
|
+
|
57
|
+
#ifdef __GNUC__
|
58
|
+
# define likely(x) __builtin_expect((x), 1)
|
59
|
+
# define unlikely(x) __builtin_expect((x), 0)
|
60
|
+
#else
|
61
|
+
# define likely(x) (x)
|
62
|
+
# define unlikely(x) (x)
|
63
|
+
#endif
|
64
|
+
|
65
|
+
#ifndef MAX
|
66
|
+
# define MAX(a, b) ((a) < (b) ? (b) : (a))
|
67
|
+
#endif
|
68
|
+
#ifndef MIN
|
69
|
+
# define MIN(a, b) ((a) < (b) ? (a) : (b))
|
70
|
+
#endif
|
71
|
+
|
72
|
+
#endif /* RBFFI_COMPAT_H */
|
data/ext/ffi_c/endian.h
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
#ifndef JFFI_ENDIAN_H
|
2
|
+
#define JFFI_ENDIAN_H
|
3
|
+
|
4
|
+
#include <sys/param.h>
|
5
|
+
#include <sys/types.h>
|
6
|
+
|
7
|
+
#ifdef __linux__
|
8
|
+
# include_next <endian.h>
|
9
|
+
#endif
|
10
|
+
|
11
|
+
#ifdef __sun
|
12
|
+
# include <sys/byteorder.h>
|
13
|
+
# define LITTLE_ENDIAN 1234
|
14
|
+
# define BIG_ENDIAN 4321
|
15
|
+
# if defined(_BIG_ENDIAN)
|
16
|
+
# define BYTE_ORDER BIG_ENDIAN
|
17
|
+
# elif defined(_LITTLE_ENDIAN)
|
18
|
+
# define BYTE_ORDER LITTLE_ENDIAN
|
19
|
+
# else
|
20
|
+
# error "Cannot determine endian-ness"
|
21
|
+
# endif
|
22
|
+
#endif
|
23
|
+
|
24
|
+
#if defined(_AIX) && !defined(BYTE_ORDER)
|
25
|
+
# define LITTLE_ENDIAN 1234
|
26
|
+
# define BIG_ENDIAN 4321
|
27
|
+
# if defined(__BIG_ENDIAN__)
|
28
|
+
# define BYTE_ORDER BIG_ENDIAN
|
29
|
+
# elif defined(__LITTLE_ENDIAN__)
|
30
|
+
# define BYTE_ORDER LITTLE_ENDIAN
|
31
|
+
# else
|
32
|
+
# error "Cannot determine endian-ness"
|
33
|
+
# endif
|
34
|
+
#endif
|
35
|
+
|
36
|
+
#if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) || !defined(BIG_ENDIAN)
|
37
|
+
# error "Cannot determine the endian-ness of this platform"
|
38
|
+
#endif
|
39
|
+
|
40
|
+
#endif /* JFFI_ENDIAN_H */
|