/tools/Ruby/lib/ruby/1.8/dl/types.rb

http://github.com/agross/netopenspace · Ruby · 245 lines · 226 code · 11 blank · 8 comment · 30 complexity · 0d62b35cea75ae04163047b390b02655 MD5 · raw file

  1. # -*- ruby -*-
  2. require 'dl'
  3. module DL
  4. class Types
  5. TYPES = [
  6. # FORMAT:
  7. # ["alias name",
  8. # "type name", encoding_method, decoding_method, for function prototypes
  9. # "type name", encoding_method, decoding_method] for structures (not implemented)
  10. # for Windows
  11. ["DWORD", "unsigned long", nil, nil,
  12. "unsigned long", nil, nil],
  13. ["PDWORD", "unsigned long *", nil, nil,
  14. "unsigned long *", nil, nil],
  15. ["WORD", "unsigned short", nil, nil,
  16. "unsigned short", nil, nil],
  17. ["PWORD", "unsigned int *", nil, nil,
  18. "unsigned int *", nil, nil],
  19. ["BYTE", "unsigned char", nil, nil,
  20. "unsigned char", nil, nil],
  21. ["PBYTE", "unsigned char *", nil, nil,
  22. "unsigned char *", nil, nil],
  23. ["BOOL", "ibool", nil, nil,
  24. "ibool", nil, nil],
  25. ["ATOM", "int", nil, nil,
  26. "int", nil, nil],
  27. ["BYTE", "unsigned char", nil, nil,
  28. "unsigned char", nil, nil],
  29. ["PBYTE", "unsigned char *", nil, nil,
  30. "unsigned char *", nil, nil],
  31. ["UINT", "unsigned int", nil, nil,
  32. "unsigned int", nil, nil],
  33. ["ULONG", "unsigned long", nil, nil,
  34. "unsigned long", nil, nil],
  35. ["UCHAR", "unsigned char", nil, nil,
  36. "unsigned char", nil, nil],
  37. ["HANDLE", "unsigned long", nil, nil,
  38. "unsigned long", nil, nil],
  39. ["PHANDLE","void*", nil, nil,
  40. "void*", nil, nil],
  41. ["PVOID", "void*", nil, nil,
  42. "void*", nil, nil],
  43. ["LPCSTR", "char*", nil, nil,
  44. "char*", nil, nil],
  45. ["HDC", "unsigned int", nil, nil,
  46. "unsigned int", nil, nil],
  47. ["HWND", "unsigned int", nil, nil,
  48. "unsigned int", nil, nil],
  49. # Others
  50. ["uint", "unsigned int", nil, nil,
  51. "unsigned int", nil, nil],
  52. ["u_int", "unsigned int", nil, nil,
  53. "unsigned int", nil, nil],
  54. ["ulong", "unsigned long", nil, nil,
  55. "unsigned long", nil, nil],
  56. ["u_long", "unsigned long", nil, nil,
  57. "unsigned long", nil, nil],
  58. # DL::Importable primitive types
  59. ["ibool",
  60. "I",
  61. proc{|v| v ? 1 : 0},
  62. proc{|v| (v != 0) ? true : false},
  63. "I",
  64. proc{|v| v ? 1 : 0 },
  65. proc{|v| (v != 0) ? true : false} ],
  66. ["cbool",
  67. "C",
  68. proc{|v| v ? 1 : 0},
  69. proc{|v| (v != 0) ? true : false},
  70. "C",
  71. proc{|v,len| v ? 1 : 0},
  72. proc{|v,len| (v != 0) ? true : false}],
  73. ["lbool",
  74. "L",
  75. proc{|v| v ? 1 : 0},
  76. proc{|v| (v != 0) ? true : false},
  77. "L",
  78. proc{|v,len| v ? 1 : 0},
  79. proc{|v,len| (v != 0) ? true : false}],
  80. ["unsigned char",
  81. "C",
  82. proc{|v| [v].pack("C").unpack("c")[0]},
  83. proc{|v| [v].pack("c").unpack("C")[0]},
  84. "C",
  85. proc{|v| [v].pack("C").unpack("c")[0]},
  86. proc{|v| [v].pack("c").unpack("C")[0]}],
  87. ["unsigned short",
  88. "H",
  89. proc{|v| [v].pack("S").unpack("s")[0]},
  90. proc{|v| [v].pack("s").unpack("S")[0]},
  91. "H",
  92. proc{|v| [v].pack("S").unpack("s")[0]},
  93. proc{|v| [v].pack("s").unpack("S")[0]}],
  94. ["unsigned int",
  95. "I",
  96. proc{|v| [v].pack("I").unpack("i")[0]},
  97. proc{|v| [v].pack("i").unpack("I")[0]},
  98. "I",
  99. proc{|v| [v].pack("I").unpack("i")[0]},
  100. proc{|v| [v].pack("i").unpack("I")[0]}],
  101. ["unsigned long",
  102. "L",
  103. proc{|v| [v].pack("L").unpack("l")[0]},
  104. proc{|v| [v].pack("l").unpack("L")[0]},
  105. "L",
  106. proc{|v| [v].pack("L").unpack("l")[0]},
  107. proc{|v| [v].pack("l").unpack("L")[0]}],
  108. ["unsigned char ref",
  109. "c",
  110. proc{|v| [v].pack("C").unpack("c")[0]},
  111. proc{|v| [v].pack("c").unpack("C")[0]},
  112. nil, nil, nil],
  113. ["unsigned int ref",
  114. "i",
  115. proc{|v| [v].pack("I").unpack("i")[0]},
  116. proc{|v| [v].pack("i").unpack("I")[0]},
  117. nil, nil, nil],
  118. ["unsigned long ref",
  119. "l",
  120. proc{|v| [v].pack("L").unpack("l")[0]},
  121. proc{|v| [v].pack("l").unpack("L")[0]},
  122. nil, nil, nil],
  123. ["char ref", "c", nil, nil,
  124. nil, nil, nil],
  125. ["short ref", "h", nil, nil,
  126. nil, nil, nil],
  127. ["int ref", "i", nil, nil,
  128. nil, nil, nil],
  129. ["long ref", "l", nil, nil,
  130. nil, nil, nil],
  131. ["float ref", "f", nil, nil,
  132. nil, nil, nil],
  133. ["double ref","d", nil, nil,
  134. nil, nil, nil],
  135. ["char", "C", nil, nil,
  136. "C", nil, nil],
  137. ["short", "H", nil, nil,
  138. "H", nil, nil],
  139. ["int", "I", nil, nil,
  140. "I", nil, nil],
  141. ["long", "L", nil, nil,
  142. "L", nil, nil],
  143. ["float", "F", nil, nil,
  144. "F", nil, nil],
  145. ["double", "D", nil, nil,
  146. "D", nil, nil],
  147. [/^char\s*\*$/,"s",nil, nil,
  148. "S",nil, nil],
  149. [/^const char\s*\*$/,"S",nil, nil,
  150. "S",nil, nil],
  151. [/^.+\*$/, "P", nil, nil,
  152. "P", nil, nil],
  153. [/^.+\[\]$/, "a", nil, nil,
  154. "a", nil, nil],
  155. ["void", "0", nil, nil,
  156. nil, nil, nil],
  157. ]
  158. def initialize
  159. init_types()
  160. end
  161. def typealias(ty1, ty2, enc=nil, dec=nil, ty3=nil, senc=nil, sdec=nil)
  162. @TYDEFS.unshift([ty1, ty2, enc, dec, ty3, senc, sdec])
  163. end
  164. def init_types
  165. @TYDEFS = TYPES.dup
  166. end
  167. def encode_argument_type(alias_type)
  168. proc_encode = nil
  169. proc_decode = nil
  170. @TYDEFS.each{|aty,ty,enc,dec,_,_,_|
  171. if( (aty.is_a?(Regexp) && (aty =~ alias_type)) || (aty == alias_type) )
  172. alias_type = alias_type.gsub(aty,ty) if ty
  173. alias_type.strip! if alias_type
  174. if( proc_encode )
  175. if( enc )
  176. conv1 = proc_encode
  177. proc_encode = proc{|v| enc.call(conv1.call(v))}
  178. end
  179. else
  180. if( enc )
  181. proc_encode = enc
  182. end
  183. end
  184. if( proc_decode )
  185. if( dec )
  186. conv2 = proc_decode
  187. proc_decode = proc{|v| dec.call(conv2.call(v))}
  188. end
  189. else
  190. if( dec )
  191. proc_decode = dec
  192. end
  193. end
  194. end
  195. }
  196. return [alias_type, proc_encode, proc_decode]
  197. end
  198. def encode_return_type(ty)
  199. ty, enc, dec = encode_argument_type(ty)
  200. return [ty, enc, dec]
  201. end
  202. def encode_struct_type(alias_type)
  203. proc_encode = nil
  204. proc_decode = nil
  205. @TYDEFS.each{|aty,_,_,_,ty,enc,dec|
  206. if( (aty.is_a?(Regexp) && (aty =~ alias_type)) || (aty == alias_type) )
  207. alias_type = alias_type.gsub(aty,ty) if ty
  208. alias_type.strip! if alias_type
  209. if( proc_encode )
  210. if( enc )
  211. conv1 = proc_encode
  212. proc_encode = proc{|v| enc.call(conv1.call(v))}
  213. end
  214. else
  215. if( enc )
  216. proc_encode = enc
  217. end
  218. end
  219. if( proc_decode )
  220. if( dec )
  221. conv2 = proc_decode
  222. proc_decode = proc{|v| dec.call(conv2.call(v))}
  223. end
  224. else
  225. if( dec )
  226. proc_decode = dec
  227. end
  228. end
  229. end
  230. }
  231. return [alias_type, proc_encode, proc_decode]
  232. end
  233. end # end of Types
  234. end