ffi 0.1.0

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.

Files changed (279) hide show
  1. data/LICENSE +51 -0
  2. data/README +0 -0
  3. data/Rakefile +90 -0
  4. data/ext/AbstractMemory.c +254 -0
  5. data/ext/AbstractMemory.h +36 -0
  6. data/ext/Buffer.c +94 -0
  7. data/ext/Callback.c +240 -0
  8. data/ext/Callback.h +47 -0
  9. data/ext/Invoker.c +269 -0
  10. data/ext/MemoryPointer.c +164 -0
  11. data/ext/MemoryPointer.h +25 -0
  12. data/ext/Platform.c +41 -0
  13. data/ext/Platform.h +23 -0
  14. data/ext/Types.c +65 -0
  15. data/ext/Types.h +51 -0
  16. data/ext/extconf.rb +13 -0
  17. data/ext/ffi.c +54 -0
  18. data/ext/ffi.mk +24 -0
  19. data/ext/libffi.darwin.mk +44 -0
  20. data/ext/libffi.mk +10 -0
  21. data/ext/libffi/ChangeLog +3243 -0
  22. data/ext/libffi/ChangeLog.libffi +347 -0
  23. data/ext/libffi/ChangeLog.libgcj +40 -0
  24. data/ext/libffi/ChangeLog.v1 +764 -0
  25. data/ext/libffi/LICENSE +21 -0
  26. data/ext/libffi/Makefile.am +177 -0
  27. data/ext/libffi/Makefile.in +1640 -0
  28. data/ext/libffi/README +328 -0
  29. data/ext/libffi/TODO +1 -0
  30. data/ext/libffi/acinclude.m4 +92 -0
  31. data/ext/libffi/aclocal.m4 +7516 -0
  32. data/ext/libffi/compile +142 -0
  33. data/ext/libffi/config.guess +1516 -0
  34. data/ext/libffi/config.sub +1626 -0
  35. data/ext/libffi/configure +24414 -0
  36. data/ext/libffi/configure.ac +365 -0
  37. data/ext/libffi/configure.host +11 -0
  38. data/ext/libffi/depcomp +584 -0
  39. data/ext/libffi/doc/libffi.info +533 -0
  40. data/ext/libffi/doc/libffi.texi +541 -0
  41. data/ext/libffi/doc/stamp-vti +4 -0
  42. data/ext/libffi/doc/version.texi +4 -0
  43. data/ext/libffi/fficonfig.h.in +160 -0
  44. data/ext/libffi/include/Makefile.am +9 -0
  45. data/ext/libffi/include/Makefile.in +422 -0
  46. data/ext/libffi/include/ffi.h.in +393 -0
  47. data/ext/libffi/include/ffi_common.h +98 -0
  48. data/ext/libffi/install-sh +323 -0
  49. data/ext/libffi/libffi.pc.in +10 -0
  50. data/ext/libffi/libtool-version +29 -0
  51. data/ext/libffi/ltcf-c.sh +861 -0
  52. data/ext/libffi/ltcf-cxx.sh +1069 -0
  53. data/ext/libffi/ltcf-gcj.sh +700 -0
  54. data/ext/libffi/ltconfig +2862 -0
  55. data/ext/libffi/ltmain.sh +6930 -0
  56. data/ext/libffi/man/Makefile.am +8 -0
  57. data/ext/libffi/man/Makefile.in +395 -0
  58. data/ext/libffi/man/ffi.3 +31 -0
  59. data/ext/libffi/man/ffi_call.3 +103 -0
  60. data/ext/libffi/man/ffi_prep_cif.3 +66 -0
  61. data/ext/libffi/mdate-sh +201 -0
  62. data/ext/libffi/missing +353 -0
  63. data/ext/libffi/mkinstalldirs +158 -0
  64. data/ext/libffi/src/alpha/ffi.c +284 -0
  65. data/ext/libffi/src/alpha/ffitarget.h +48 -0
  66. data/ext/libffi/src/alpha/osf.S +366 -0
  67. data/ext/libffi/src/arm/ffi.c +309 -0
  68. data/ext/libffi/src/arm/ffitarget.h +49 -0
  69. data/ext/libffi/src/arm/sysv.S +299 -0
  70. data/ext/libffi/src/closures.c +596 -0
  71. data/ext/libffi/src/cris/ffi.c +383 -0
  72. data/ext/libffi/src/cris/ffitarget.h +51 -0
  73. data/ext/libffi/src/cris/sysv.S +215 -0
  74. data/ext/libffi/src/debug.c +59 -0
  75. data/ext/libffi/src/dlmalloc.c +5099 -0
  76. data/ext/libffi/src/frv/eabi.S +128 -0
  77. data/ext/libffi/src/frv/ffi.c +292 -0
  78. data/ext/libffi/src/frv/ffitarget.h +61 -0
  79. data/ext/libffi/src/ia64/ffi.c +580 -0
  80. data/ext/libffi/src/ia64/ffitarget.h +50 -0
  81. data/ext/libffi/src/ia64/ia64_flags.h +40 -0
  82. data/ext/libffi/src/ia64/unix.S +560 -0
  83. data/ext/libffi/src/java_raw_api.c +359 -0
  84. data/ext/libffi/src/m32r/ffi.c +232 -0
  85. data/ext/libffi/src/m32r/ffitarget.h +48 -0
  86. data/ext/libffi/src/m32r/sysv.S +121 -0
  87. data/ext/libffi/src/m68k/ffi.c +278 -0
  88. data/ext/libffi/src/m68k/ffitarget.h +49 -0
  89. data/ext/libffi/src/m68k/sysv.S +234 -0
  90. data/ext/libffi/src/mips/ffi.c +926 -0
  91. data/ext/libffi/src/mips/ffitarget.h +202 -0
  92. data/ext/libffi/src/mips/n32.S +534 -0
  93. data/ext/libffi/src/mips/o32.S +381 -0
  94. data/ext/libffi/src/pa/ffi.c +709 -0
  95. data/ext/libffi/src/pa/ffitarget.h +77 -0
  96. data/ext/libffi/src/pa/hpux32.S +368 -0
  97. data/ext/libffi/src/pa/linux.S +357 -0
  98. data/ext/libffi/src/powerpc/aix.S +225 -0
  99. data/ext/libffi/src/powerpc/aix_closure.S +247 -0
  100. data/ext/libffi/src/powerpc/asm.h +125 -0
  101. data/ext/libffi/src/powerpc/darwin.S +245 -0
  102. data/ext/libffi/src/powerpc/darwin_closure.S +317 -0
  103. data/ext/libffi/src/powerpc/ffi.c +1429 -0
  104. data/ext/libffi/src/powerpc/ffi_darwin.c +800 -0
  105. data/ext/libffi/src/powerpc/ffitarget.h +118 -0
  106. data/ext/libffi/src/powerpc/linux64.S +187 -0
  107. data/ext/libffi/src/powerpc/linux64_closure.S +236 -0
  108. data/ext/libffi/src/powerpc/ppc_closure.S +327 -0
  109. data/ext/libffi/src/powerpc/sysv.S +230 -0
  110. data/ext/libffi/src/prep_cif.c +174 -0
  111. data/ext/libffi/src/raw_api.c +254 -0
  112. data/ext/libffi/src/s390/ffi.c +780 -0
  113. data/ext/libffi/src/s390/ffitarget.h +60 -0
  114. data/ext/libffi/src/s390/sysv.S +434 -0
  115. data/ext/libffi/src/sh/ffi.c +716 -0
  116. data/ext/libffi/src/sh/ffitarget.h +49 -0
  117. data/ext/libffi/src/sh/sysv.S +850 -0
  118. data/ext/libffi/src/sh64/ffi.c +453 -0
  119. data/ext/libffi/src/sh64/ffitarget.h +53 -0
  120. data/ext/libffi/src/sh64/sysv.S +530 -0
  121. data/ext/libffi/src/sparc/ffi.c +610 -0
  122. data/ext/libffi/src/sparc/ffitarget.h +66 -0
  123. data/ext/libffi/src/sparc/v8.S +272 -0
  124. data/ext/libffi/src/sparc/v9.S +307 -0
  125. data/ext/libffi/src/types.c +77 -0
  126. data/ext/libffi/src/x86/darwin.S +443 -0
  127. data/ext/libffi/src/x86/darwin64.S +416 -0
  128. data/ext/libffi/src/x86/ffi.c +475 -0
  129. data/ext/libffi/src/x86/ffi64.c +572 -0
  130. data/ext/libffi/src/x86/ffitarget.h +90 -0
  131. data/ext/libffi/src/x86/freebsd.S +458 -0
  132. data/ext/libffi/src/x86/sysv.S +437 -0
  133. data/ext/libffi/src/x86/unix64.S +418 -0
  134. data/ext/libffi/src/x86/win32.S +391 -0
  135. data/ext/libffi/testsuite/Makefile.am +71 -0
  136. data/ext/libffi/testsuite/Makefile.in +447 -0
  137. data/ext/libffi/testsuite/config/default.exp +1 -0
  138. data/ext/libffi/testsuite/lib/libffi-dg.exp +289 -0
  139. data/ext/libffi/testsuite/lib/target-libpath.exp +263 -0
  140. data/ext/libffi/testsuite/lib/wrapper.exp +45 -0
  141. data/ext/libffi/testsuite/libffi.call/call.exp +36 -0
  142. data/ext/libffi/testsuite/libffi.call/closure_fn0.c +97 -0
  143. data/ext/libffi/testsuite/libffi.call/closure_fn1.c +89 -0
  144. data/ext/libffi/testsuite/libffi.call/closure_fn2.c +89 -0
  145. data/ext/libffi/testsuite/libffi.call/closure_fn3.c +90 -0
  146. data/ext/libffi/testsuite/libffi.call/closure_fn4.c +97 -0
  147. data/ext/libffi/testsuite/libffi.call/closure_fn5.c +99 -0
  148. data/ext/libffi/testsuite/libffi.call/closure_fn6.c +98 -0
  149. data/ext/libffi/testsuite/libffi.call/closure_stdcall.c +72 -0
  150. data/ext/libffi/testsuite/libffi.call/cls_12byte.c +102 -0
  151. data/ext/libffi/testsuite/libffi.call/cls_16byte.c +103 -0
  152. data/ext/libffi/testsuite/libffi.call/cls_18byte.c +104 -0
  153. data/ext/libffi/testsuite/libffi.call/cls_19byte.c +110 -0
  154. data/ext/libffi/testsuite/libffi.call/cls_1_1byte.c +97 -0
  155. data/ext/libffi/testsuite/libffi.call/cls_20byte.c +99 -0
  156. data/ext/libffi/testsuite/libffi.call/cls_20byte1.c +101 -0
  157. data/ext/libffi/testsuite/libffi.call/cls_24byte.c +121 -0
  158. data/ext/libffi/testsuite/libffi.call/cls_2byte.c +98 -0
  159. data/ext/libffi/testsuite/libffi.call/cls_3_1byte.c +103 -0
  160. data/ext/libffi/testsuite/libffi.call/cls_3byte1.c +98 -0
  161. data/ext/libffi/testsuite/libffi.call/cls_3byte2.c +98 -0
  162. data/ext/libffi/testsuite/libffi.call/cls_4_1byte.c +106 -0
  163. data/ext/libffi/testsuite/libffi.call/cls_4byte.c +98 -0
  164. data/ext/libffi/testsuite/libffi.call/cls_5_1_byte.c +117 -0
  165. data/ext/libffi/testsuite/libffi.call/cls_5byte.c +106 -0
  166. data/ext/libffi/testsuite/libffi.call/cls_64byte.c +132 -0
  167. data/ext/libffi/testsuite/libffi.call/cls_6_1_byte.c +121 -0
  168. data/ext/libffi/testsuite/libffi.call/cls_6byte.c +107 -0
  169. data/ext/libffi/testsuite/libffi.call/cls_7_1_byte.c +125 -0
  170. data/ext/libffi/testsuite/libffi.call/cls_7byte.c +105 -0
  171. data/ext/libffi/testsuite/libffi.call/cls_8byte.c +96 -0
  172. data/ext/libffi/testsuite/libffi.call/cls_9byte1.c +98 -0
  173. data/ext/libffi/testsuite/libffi.call/cls_9byte2.c +99 -0
  174. data/ext/libffi/testsuite/libffi.call/cls_align_double.c +101 -0
  175. data/ext/libffi/testsuite/libffi.call/cls_align_float.c +99 -0
  176. data/ext/libffi/testsuite/libffi.call/cls_align_longdouble.c +100 -0
  177. data/ext/libffi/testsuite/libffi.call/cls_align_pointer.c +101 -0
  178. data/ext/libffi/testsuite/libffi.call/cls_align_sint16.c +99 -0
  179. data/ext/libffi/testsuite/libffi.call/cls_align_sint32.c +99 -0
  180. data/ext/libffi/testsuite/libffi.call/cls_align_sint64.c +99 -0
  181. data/ext/libffi/testsuite/libffi.call/cls_align_uint16.c +99 -0
  182. data/ext/libffi/testsuite/libffi.call/cls_align_uint32.c +99 -0
  183. data/ext/libffi/testsuite/libffi.call/cls_align_uint64.c +100 -0
  184. data/ext/libffi/testsuite/libffi.call/cls_double.c +51 -0
  185. data/ext/libffi/testsuite/libffi.call/cls_float.c +51 -0
  186. data/ext/libffi/testsuite/libffi.call/cls_multi_schar.c +82 -0
  187. data/ext/libffi/testsuite/libffi.call/cls_multi_sshort.c +82 -0
  188. data/ext/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +94 -0
  189. data/ext/libffi/testsuite/libffi.call/cls_multi_uchar.c +99 -0
  190. data/ext/libffi/testsuite/libffi.call/cls_multi_ushort.c +82 -0
  191. data/ext/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +94 -0
  192. data/ext/libffi/testsuite/libffi.call/cls_schar.c +52 -0
  193. data/ext/libffi/testsuite/libffi.call/cls_sint.c +50 -0
  194. data/ext/libffi/testsuite/libffi.call/cls_sshort.c +50 -0
  195. data/ext/libffi/testsuite/libffi.call/cls_uchar.c +50 -0
  196. data/ext/libffi/testsuite/libffi.call/cls_uint.c +51 -0
  197. data/ext/libffi/testsuite/libffi.call/cls_ulonglong.c +54 -0
  198. data/ext/libffi/testsuite/libffi.call/cls_ushort.c +51 -0
  199. data/ext/libffi/testsuite/libffi.call/ffitest.h +86 -0
  200. data/ext/libffi/testsuite/libffi.call/float.c +59 -0
  201. data/ext/libffi/testsuite/libffi.call/float1.c +58 -0
  202. data/ext/libffi/testsuite/libffi.call/float2.c +57 -0
  203. data/ext/libffi/testsuite/libffi.call/float3.c +72 -0
  204. data/ext/libffi/testsuite/libffi.call/float4.c +62 -0
  205. data/ext/libffi/testsuite/libffi.call/many.c +69 -0
  206. data/ext/libffi/testsuite/libffi.call/many_win32.c +63 -0
  207. data/ext/libffi/testsuite/libffi.call/negint.c +53 -0
  208. data/ext/libffi/testsuite/libffi.call/nested_struct.c +160 -0
  209. data/ext/libffi/testsuite/libffi.call/nested_struct1.c +169 -0
  210. data/ext/libffi/testsuite/libffi.call/nested_struct10.c +141 -0
  211. data/ext/libffi/testsuite/libffi.call/nested_struct2.c +118 -0
  212. data/ext/libffi/testsuite/libffi.call/nested_struct3.c +119 -0
  213. data/ext/libffi/testsuite/libffi.call/nested_struct4.c +119 -0
  214. data/ext/libffi/testsuite/libffi.call/nested_struct5.c +120 -0
  215. data/ext/libffi/testsuite/libffi.call/nested_struct6.c +139 -0
  216. data/ext/libffi/testsuite/libffi.call/nested_struct7.c +119 -0
  217. data/ext/libffi/testsuite/libffi.call/nested_struct8.c +139 -0
  218. data/ext/libffi/testsuite/libffi.call/nested_struct9.c +139 -0
  219. data/ext/libffi/testsuite/libffi.call/problem1.c +98 -0
  220. data/ext/libffi/testsuite/libffi.call/promotion.c +59 -0
  221. data/ext/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
  222. data/ext/libffi/testsuite/libffi.call/return_dbl.c +35 -0
  223. data/ext/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
  224. data/ext/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
  225. data/ext/libffi/testsuite/libffi.call/return_fl.c +35 -0
  226. data/ext/libffi/testsuite/libffi.call/return_fl1.c +36 -0
  227. data/ext/libffi/testsuite/libffi.call/return_fl2.c +49 -0
  228. data/ext/libffi/testsuite/libffi.call/return_fl3.c +42 -0
  229. data/ext/libffi/testsuite/libffi.call/return_ldl.c +34 -0
  230. data/ext/libffi/testsuite/libffi.call/return_ll.c +41 -0
  231. data/ext/libffi/testsuite/libffi.call/return_ll1.c +42 -0
  232. data/ext/libffi/testsuite/libffi.call/return_sc.c +36 -0
  233. data/ext/libffi/testsuite/libffi.call/return_sl.c +38 -0
  234. data/ext/libffi/testsuite/libffi.call/return_uc.c +38 -0
  235. data/ext/libffi/testsuite/libffi.call/return_ul.c +38 -0
  236. data/ext/libffi/testsuite/libffi.call/strlen.c +44 -0
  237. data/ext/libffi/testsuite/libffi.call/strlen_win32.c +44 -0
  238. data/ext/libffi/testsuite/libffi.call/struct1.c +65 -0
  239. data/ext/libffi/testsuite/libffi.call/struct2.c +67 -0
  240. data/ext/libffi/testsuite/libffi.call/struct3.c +59 -0
  241. data/ext/libffi/testsuite/libffi.call/struct4.c +63 -0
  242. data/ext/libffi/testsuite/libffi.call/struct5.c +65 -0
  243. data/ext/libffi/testsuite/libffi.call/struct6.c +64 -0
  244. data/ext/libffi/testsuite/libffi.call/struct7.c +74 -0
  245. data/ext/libffi/testsuite/libffi.call/struct8.c +80 -0
  246. data/ext/libffi/testsuite/libffi.call/struct9.c +67 -0
  247. data/ext/libffi/testsuite/libffi.special/ffitestcxx.h +86 -0
  248. data/ext/libffi/testsuite/libffi.special/special.exp +38 -0
  249. data/ext/libffi/testsuite/libffi.special/unwindtest.cc +123 -0
  250. data/ext/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc +53 -0
  251. data/ext/libffi/texinfo.tex +7482 -0
  252. data/ext/rbffi.h +32 -0
  253. data/lib/ffi.rb +2 -0
  254. data/lib/ffi/buffer.rb +25 -0
  255. data/lib/ffi/callback.rb +10 -0
  256. data/lib/ffi/ffi.rb +259 -0
  257. data/lib/ffi/memorypointer.rb +169 -0
  258. data/lib/ffi/platform.rb +75 -0
  259. data/lib/ffi/struct.rb +263 -0
  260. data/nbproject/Makefile-Default.mk +54 -0
  261. data/nbproject/Makefile-impl.mk +123 -0
  262. data/nbproject/configurations.xml +169 -0
  263. data/nbproject/private/configurations.xml +22 -0
  264. data/nbproject/private/private.xml +7 -0
  265. data/nbproject/project.properties +0 -0
  266. data/nbproject/project.xml +11 -0
  267. data/samples/getlogin.rb +7 -0
  268. data/samples/getpid.rb +7 -0
  269. data/samples/gettimeofday.rb +13 -0
  270. data/samples/hello.rb +7 -0
  271. data/samples/qsort.rb +20 -0
  272. data/specs/buffer_spec.rb +141 -0
  273. data/specs/callback_spec.rb +31 -0
  274. data/specs/rbx/attach_function_spec.rb +26 -0
  275. data/specs/rbx/memory_pointer_spec.rb +108 -0
  276. data/specs/rbx/spec_helper.rb +1 -0
  277. data/specs/rbx/struct_spec.rb +13 -0
  278. data/specs/spec_helper.rb +2 -0
  279. metadata +359 -0
@@ -0,0 +1,75 @@
1
+ require 'rbconfig'
2
+ module FFI
3
+ class PlatformError < FFI::NativeError; end
4
+
5
+ module Platform
6
+ OS = case Config::CONFIG['host_os'].downcase
7
+ when /linux/
8
+ "linux"
9
+ when /darwin/
10
+ "darwin"
11
+ when /freebsd/
12
+ "freebsd"
13
+ when /openbsd/
14
+ "openbsd"
15
+ when /sunos|solaris/
16
+ "solaris"
17
+ when /win/
18
+ "windows"
19
+ else
20
+ raise FFI::PlatformError, "Unknown operating system: #{OS_}"
21
+ end
22
+ ARCH = case CPU.downcase
23
+ when /i?86|x86|i86pc/
24
+ "i386"
25
+ when /amd64|x86_64/
26
+ "x86_64"
27
+ else
28
+ raise FFI::PlatformError, "Unknown cpu architecture: #{ARCH_}"
29
+ end
30
+ private
31
+ def self.is_os(os)
32
+ OS == os
33
+ end
34
+
35
+ NAME = "#{ARCH}-#{OS}"
36
+ IS_LINUX = is_os("linux")
37
+ IS_MAC = is_os("darwin")
38
+ IS_FREEBSD = is_os("freebsd")
39
+ IS_OPENBSD = is_os("openbsd")
40
+ IS_WINDOWS = is_os("windows")
41
+ IS_BSD = IS_MAC || IS_FREEBSD || IS_OPENBSD
42
+ public
43
+ LIBC = if IS_WINDOWS
44
+ "msvcrt"
45
+ elsif IS_LINUX
46
+ "libc.so.6"
47
+ else
48
+ "c"
49
+ end
50
+ LIBPREFIX = IS_WINDOWS ? '' : 'lib'
51
+ LIBSUFFIX = case OS
52
+ when /darwin/
53
+ '.dylib'
54
+ when /linux|bsd|solaris/
55
+ '.so'
56
+ when /win/
57
+ '.dll'
58
+ else
59
+ raise PlatformError, "Cannot determine shared library extension for #{OS}"
60
+ end
61
+ def self.bsd?
62
+ IS_BSD
63
+ end
64
+ def self.windows?
65
+ IS_WINDOWS
66
+ end
67
+ def self.mac?
68
+ IS_MAC
69
+ end
70
+ def self.unix?
71
+ !IS_WINDOWS
72
+ end
73
+ end
74
+ end
75
+
@@ -0,0 +1,263 @@
1
+ require 'ffi/platform'
2
+ module FFI
3
+ class StructLayout
4
+ def initialize(fields, size)
5
+ @fields = fields
6
+ @size = size
7
+ end
8
+
9
+ def [](name)
10
+ @fields[name]
11
+ end
12
+ def size
13
+ @size
14
+ end
15
+ end
16
+ class StructLayoutBuilder
17
+ LONG_ALIGN = Platform::ARCH =~ /sparc.*/ ? 64 : Platform::LONG_SIZE
18
+ ADDRESS_ALIGN = Platform::ARCH =~ /sparc.*/ ? 64 : Platform::ADDRESS_SIZE
19
+ FLOAT_ALIGN = Platform::ARCH =~ /sparc.*/ ? 64 : Platform::ADDRESS_SIZE
20
+ DOUBLE_ALIGN = Platform::ARCH =~ /sparc.*/ ? 64 : Platform::ADDRESS_SIZE
21
+ class Field
22
+ def initialize(off)
23
+ @off = off
24
+ end
25
+
26
+ def offset
27
+ @off
28
+ end
29
+ def size
30
+ self.size
31
+ end
32
+ def align
33
+ self.align
34
+ end
35
+ def self.align
36
+ self.size
37
+ end
38
+ end
39
+ class Signed8 < Field
40
+ def self.size; 8; end
41
+ def put(ptr, val)
42
+ ptr.put_int8(@off, val)
43
+ end
44
+ def get(ptr)
45
+ ptr.get_int8(@off)
46
+ end
47
+ end
48
+ class Unsigned8 < Field
49
+ def self.size; 8; end
50
+ def put(ptr, val)
51
+ ptr.put_uint8(@off, val)
52
+ end
53
+ def get(ptr)
54
+ ptr.get_uint8(@off)
55
+ end
56
+ end
57
+ class Signed16 < Field
58
+ def self.size; 16; end
59
+ def put(ptr, val)
60
+ ptr.put_int16(@off, val)
61
+ end
62
+ def get(ptr)
63
+ ptr.get_int16(@off)
64
+ end
65
+ end
66
+ class Unsigned16 < Field
67
+ def self.size; 16; end
68
+ def put(ptr, val)
69
+ ptr.put_uint16(@off, val)
70
+ end
71
+ def get(ptr)
72
+ ptr.get_uint16(@off)
73
+ end
74
+ end
75
+ class Signed32 < Field
76
+ def self.size; 32; end
77
+ def put(ptr, val)
78
+ ptr.put_int32(@off, val)
79
+ end
80
+ def get(ptr)
81
+ ptr.get_int32(@off)
82
+ end
83
+ end
84
+ class Unsigned32 < Field
85
+ def self.size; 32; end
86
+ def put(ptr, val)
87
+ ptr.put_uint32(@off, val)
88
+ end
89
+ def get(ptr)
90
+ ptr.get_uint32(@off)
91
+ end
92
+ end
93
+ class Signed64 < Field
94
+ def self.size; 64; end
95
+ def self.align; LONG_ALIGN; end
96
+ def put(ptr, val)
97
+ ptr.put_int64(@off, val)
98
+ end
99
+ def get(ptr)
100
+ ptr.get_int64(@off)
101
+ end
102
+ end
103
+ class Unsigned64 < Field
104
+ def self.size; 64; end
105
+ def self.align; LONG_ALIGN; end
106
+ def put(ptr, val)
107
+ ptr.put_uint64(@off, val)
108
+ end
109
+ def get(ptr)
110
+ ptr.get_uint64(@off)
111
+ end
112
+ end
113
+ def initialize
114
+ @fields = {}
115
+ @size = 0
116
+ end
117
+ def add_field(name, type, offset=nil)
118
+ field_class = case type
119
+ when :char, NativeType::INT8
120
+ Signed8
121
+ when :uchar, NativeType::UINT8
122
+ Unsigned8
123
+ when :short, NativeType::INT16
124
+ Signed16
125
+ when :ushort, NativeType::UINT16
126
+ Unsigned16
127
+ when :long, NativeType::LONG
128
+ FFI::Platform::LONG_SIZE == 32 ? Signed32 : Signed64
129
+ when :ulong, NativeType::ULONG
130
+ FFI::Platform::LONG_SIZE == 32 ? Unsigned32 : Unsigned64
131
+ when :int, NativeType::INT32
132
+ Signed32
133
+ when :uint, NativeType::UINT32
134
+ Unsigned32
135
+ when :long_long, NativeType::INT64
136
+ Signed64
137
+ when :ulong_long, NativeType::UINT64
138
+ Unsigned64
139
+ else
140
+ raise ArgumentError, "Unknown type: #{type}"
141
+ end
142
+
143
+ size = field_class.size / 8
144
+ off = offset ? offset.to_i : align(@size, field_class.align)
145
+ @fields[name] = field_class.new(off)
146
+ @size = off + size
147
+ end
148
+ def build
149
+ StructLayout.new @fields, @size
150
+ end
151
+ def align(offset, bits)
152
+ bytes = bits / 8
153
+ mask = bytes - 1;
154
+ off = offset;
155
+ ((off & mask) != 0) ? (off & ~mask) + bytes : off
156
+ end
157
+ end
158
+ class BaseStruct
159
+ Buffer = FFI::Buffer
160
+ attr_reader :pointer
161
+
162
+ def initialize(pointer = nil, *spec)
163
+ @cspec = self.class.layout(*spec)
164
+
165
+ if pointer then
166
+ @pointer = pointer
167
+ else
168
+ @pointer = MemoryPointer.new size
169
+ end
170
+ end
171
+ def self.alloc_inout(clear = true)
172
+ self.new(Buffer.alloc_inout(@size, 1, clear))
173
+ end
174
+ def self.alloc_in(clear = true)
175
+ self.new(Buffer.alloc_in(@size, 1, clear))
176
+ end
177
+ def self.alloc_out(clear = true)
178
+ self.new(Buffer.alloc_out(@size, 1, clear))
179
+ end
180
+ def self.size
181
+ @size
182
+ end
183
+ def self.members
184
+ @layout.members
185
+ end
186
+ def size
187
+ self.class.size
188
+ end
189
+ def [](field)
190
+ @cspec[field].get(@pointer)
191
+ end
192
+ def []=(field, val)
193
+ @cspec[field].put(@pointer, val)
194
+ end
195
+ def members
196
+ @cspec.members
197
+ end
198
+ def values
199
+ @cspec.members.map { |m| self[m] }
200
+ end
201
+ def clear
202
+ @pointer.clear
203
+ self
204
+ end
205
+ end
206
+ class Struct < BaseStruct
207
+ def self.jruby_layout(spec)
208
+ raise "Ruby version not supported" if RUBY_VERSION =~ /1.8.*/
209
+ builder = FFI::StructLayoutBuilder.new
210
+ spec[0].each do |name,type|
211
+ builder.add_field(name, FFI.find_type(type))
212
+ end
213
+ builder.build
214
+ end
215
+ def self.rubinius_layout(spec)
216
+ builder = FFI::StructLayoutBuilder.new
217
+ i = 0
218
+ while i < spec.size
219
+ name, type, offset = spec[i, 3]
220
+
221
+ code = FFI.find_type(type)
222
+ builder.add_field(name, code, offset)
223
+ i += 3
224
+ end
225
+ builder.build
226
+ end
227
+ def self.layout(*spec)
228
+
229
+ return @layout if spec.size == 0
230
+ cspec = spec[0].kind_of?(Hash) ? jruby_layout(spec) : rubinius_layout(spec)
231
+
232
+ @layout = cspec unless self == FFI::Struct
233
+ @size = cspec.size
234
+ return cspec
235
+ end
236
+ def self.config(base, *fields)
237
+ config = Config::CONFIG
238
+ @size = config["#{base}.sizeof"]
239
+
240
+ builder = StructLayoutBuilder.new
241
+
242
+ fields.each do |field|
243
+ offset = config["#{base}.#{field}.offset"]
244
+ size = config["#{base}.#{field}.size"]
245
+ type = config["#{base}.#{field}.type"]
246
+ type = type ? type.to_sym : FFI.size_to_type(size)
247
+
248
+ code = FFI.find_type type
249
+ if (code == NativeType::CHAR_ARRAY)
250
+ builder.add_char_array(field.to_s, size, offset)
251
+ else
252
+ builder.add_field(field.to_s, code, offset)
253
+ end
254
+ end
255
+ cspec = builder.build
256
+
257
+ @layout = cspec
258
+ @size = cspec.size if @size < cspec.size
259
+
260
+ return cspec
261
+ end
262
+ end
263
+ end
@@ -0,0 +1,54 @@
1
+ #
2
+ # Generated Makefile - do not edit!
3
+ #
4
+ # Edit the Makefile in the project folder instead (../Makefile). Each target
5
+ # has a -pre and a -post target defined where you can add customized code.
6
+ #
7
+ # This makefile implements configuration specific macros and targets.
8
+
9
+
10
+ # Environment
11
+ MKDIR=mkdir
12
+ CP=cp
13
+ CCADMIN=CCadmin
14
+ RANLIB=ranlib
15
+ CC=gcc
16
+ CCC=g++
17
+ CXX=g++
18
+ FC=
19
+
20
+ # Include project Makefile
21
+ include ruby-ffi-Makefile.mk
22
+
23
+ # Object Directory
24
+ OBJECTDIR=build/Default/GNU-MacOSX
25
+
26
+ # Object Files
27
+ OBJECTFILES=
28
+
29
+ # C Compiler Flags
30
+ CFLAGS=
31
+
32
+ # CC Compiler Flags
33
+ CCFLAGS=
34
+ CXXFLAGS=
35
+
36
+ # Fortran Compiler Flags
37
+ FFLAGS=
38
+
39
+ # Link Libraries and Options
40
+ LDLIBSOPTIONS=
41
+
42
+ # Build Targets
43
+ .build-conf: ${BUILD_SUBPROJECTS}
44
+ cd . && make -f Makefile
45
+
46
+ # Subprojects
47
+ .build-subprojects:
48
+
49
+ # Clean Targets
50
+ .clean-conf:
51
+ cd . && make -f Makefile clean
52
+
53
+ # Subprojects
54
+ .clean-subprojects:
@@ -0,0 +1,123 @@
1
+ #
2
+ # Generated Makefile - do not edit!
3
+ #
4
+ # Edit the Makefile in the project folder instead (../Makefile). Each target
5
+ # has a pre- and a post- target defined where you can add customization code.
6
+ #
7
+ # This makefile implements macros and targets common to all configurations.
8
+ #
9
+ # NOCDDL
10
+
11
+
12
+ # Building and Cleaning subprojects are done by default, but can be controlled with the SUB
13
+ # macro. If SUB=no, subprojects will not be built or cleaned. The following macro
14
+ # statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf
15
+ # and .clean-reqprojects-conf unless SUB has the value 'no'
16
+ SUB_no=NO
17
+ SUBPROJECTS=${SUB_${SUB}}
18
+ BUILD_SUBPROJECTS_=.build-subprojects
19
+ BUILD_SUBPROJECTS_NO=
20
+ BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}}
21
+ CLEAN_SUBPROJECTS_=.clean-subprojects
22
+ CLEAN_SUBPROJECTS_NO=
23
+ CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}}
24
+
25
+
26
+ # Project Name
27
+ PROJECTNAME=ruby-ffi
28
+
29
+ # Active Configuration
30
+ DEFAULTCONF=Default
31
+ CONF=${DEFAULTCONF}
32
+
33
+ # All Configurations
34
+ ALLCONFS=Default
35
+
36
+
37
+ # build
38
+ .build-impl: .validate-impl .depcheck-impl
39
+ @#echo "=> Running $@... Configuration=$(CONF)"
40
+ ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf
41
+
42
+
43
+ # clean
44
+ .clean-impl: .validate-impl .depcheck-impl
45
+ @#echo "=> Running $@... Configuration=$(CONF)"
46
+ ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf
47
+
48
+
49
+ # clobber
50
+ .clobber-impl: .depcheck-impl
51
+ @#echo "=> Running $@..."
52
+ for CONF in ${ALLCONFS}; \
53
+ do \
54
+ ${MAKE} -f nbproject/Makefile-$${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf; \
55
+ done
56
+
57
+ # all
58
+ .all-impl: .depcheck-impl
59
+ @#echo "=> Running $@..."
60
+ for CONF in ${ALLCONFS}; \
61
+ do \
62
+ ${MAKE} -f nbproject/Makefile-$${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf; \
63
+ done
64
+
65
+ # dependency checking support
66
+ .depcheck-impl:
67
+ @echo "# This code depends on make tool being used" >.dep.inc
68
+ @if [ -n "${MAKE_VERSION}" ]; then \
69
+ echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \
70
+ echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \
71
+ echo "include \$${DEPFILES}" >>.dep.inc; \
72
+ echo "endif" >>.dep.inc; \
73
+ else \
74
+ echo ".KEEP_STATE:" >>.dep.inc; \
75
+ echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \
76
+ fi
77
+
78
+ # configuration validation
79
+ .validate-impl:
80
+ @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
81
+ then \
82
+ echo ""; \
83
+ echo "Error: can not find the makefile for configuration '${CONF}' in project ${PROJECTNAME}"; \
84
+ echo "See 'make help' for details."; \
85
+ echo "Current directory: " `pwd`; \
86
+ echo ""; \
87
+ fi
88
+ @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
89
+ then \
90
+ exit 1; \
91
+ fi
92
+
93
+
94
+ # help
95
+ .help-impl:
96
+ @echo "This makefile supports the following configurations:"
97
+ @echo " ${ALLCONFS}"
98
+ @echo ""
99
+ @echo "and the following targets:"
100
+ @echo " build (default target)"
101
+ @echo " clean"
102
+ @echo " clobber"
103
+ @echo " all"
104
+ @echo " help"
105
+ @echo ""
106
+ @echo "Makefile Usage:"
107
+ @echo " make [CONF=<CONFIGURATION>] [SUB=no] build"
108
+ @echo " make [CONF=<CONFIGURATION>] [SUB=no] clean"
109
+ @echo " make [SUB=no] clobber"
110
+ @echo " make [SUB=no] all"
111
+ @echo " make help"
112
+ @echo ""
113
+ @echo "Target 'build' will build a specific configuration and, unless 'SUB=no',"
114
+ @echo " also build subprojects."
115
+ @echo "Target 'clean' will clean a specific configuration and, unless 'SUB=no',"
116
+ @echo " also clean subprojects."
117
+ @echo "Target 'clobber' will remove all built files from all configurations and,"
118
+ @echo " unless 'SUB=no', also from subprojects."
119
+ @echo "Target 'all' will will build all configurations and, unless 'SUB=no',"
120
+ @echo " also build subprojects."
121
+ @echo "Target 'help' prints this message."
122
+ @echo ""
123
+