ffidb 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +16 -0
- data/VERSION +1 -1
- data/etc/templates/c.erb +3 -3
- data/etc/templates/cpp.erb +3 -3
- data/etc/templates/dart.erb +5 -4
- data/etc/templates/go.erb +3 -3
- data/etc/templates/java.erb +5 -5
- data/etc/templates/lisp.erb +6 -6
- data/etc/templates/python.erb +5 -5
- data/etc/templates/ruby.erb +7 -7
- data/lib/ffidb/exporter.rb +114 -5
- data/lib/ffidb/exporters/dart.rb +46 -24
- data/lib/ffidb/exporters/java.rb +1 -15
- data/lib/ffidb/exporters/lisp.rb +6 -11
- data/lib/ffidb/exporters/python.rb +20 -12
- data/lib/ffidb/exporters/ruby.rb +19 -10
- data/lib/ffidb/type.rb +34 -15
- metadata +19 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3d376934e5941a0509caeef0ec2b8c0fd2726234b62b499098097b501889012
|
4
|
+
data.tar.gz: 311ba10e14c9c50818cf8a3ffa928c55a989f285c599cd08e56c70caeed73319
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: abfe03bcad1996b4eca15e62e8eacb0486b5a826d75e34c05ec63d500efbe74087b12259dc82fab13d934d4b573add37bc122a63a091a4ee3a6735d9605434a1
|
7
|
+
data.tar.gz: 0aa715b38545c0e4d09558b251ba198efa24bcd1bc6cc3c0e162aa75b8baf85cfd5e9f85319a71502d7d6885d3688aeff071fd9ab13a9d6b3cef60534fdc5c08
|
data/README.md
CHANGED
@@ -18,6 +18,22 @@ After installation, download and initialize the FFI DB registry as follows:
|
|
18
18
|
|
19
19
|
Your local FFI DB registry is located at the path `$HOME/.ffidb/`.
|
20
20
|
|
21
|
+
Features
|
22
|
+
--------
|
23
|
+
|
24
|
+
### Code generation
|
25
|
+
|
26
|
+
| ID | Language | typedefs | enums | structs | unions | functions |
|
27
|
+
| :------ | :---------- | :------- | :---- | :------ | :----- | :-------- |
|
28
|
+
| c | C | | ✔ | ✔ | | ✔ |
|
29
|
+
| c++ | C++ | | ✔ | ✔ | | ✔ |
|
30
|
+
| dart | Dart | | ✔ | ✔ | | ✔ |
|
31
|
+
| go | Go | | ✔ | ✔ | | ✔ |
|
32
|
+
| java | Java | | ✔ | ✔ | | ✔ |
|
33
|
+
| lisp | Common Lisp | | ✔ | ✔ | | ✔ |
|
34
|
+
| python | Python | | ✔ | ✔ | | ✔ |
|
35
|
+
| ruby | Ruby | | ✔ | ✔ | | ✔ |
|
36
|
+
|
21
37
|
Examples (API)
|
22
38
|
--------------
|
23
39
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.13.0
|
data/etc/templates/c.erb
CHANGED
@@ -15,7 +15,7 @@
|
|
15
15
|
<% for enum in @enums[library] || [] %>
|
16
16
|
|
17
17
|
<% if enum.comment %>
|
18
|
-
|
18
|
+
<%= format_comment(enum.comment, '//') %>
|
19
19
|
<% end %>
|
20
20
|
enum <%= enum.name %> {
|
21
21
|
<% for name, value in enum.values || {} %>
|
@@ -26,7 +26,7 @@ enum <%= enum.name %> {
|
|
26
26
|
<% for struct in @structs[library] || [] %>
|
27
27
|
|
28
28
|
<% if struct.comment %>
|
29
|
-
|
29
|
+
<%= format_comment(struct.comment, '//') %>
|
30
30
|
<% end %>
|
31
31
|
struct <%= struct.name %> {
|
32
32
|
<% for name, type in struct.fields || {} %>
|
@@ -37,7 +37,7 @@ struct <%= struct.name %> {
|
|
37
37
|
<% for function in @functions[library] || [] %>
|
38
38
|
|
39
39
|
<% if function.comment %>
|
40
|
-
|
40
|
+
<%= format_comment(function.comment, '//') %>
|
41
41
|
<% end %>
|
42
42
|
extern <%= function.type %> <%= function.name %>(<%=
|
43
43
|
function.parameters.each_value.map { |p| "#{p.type} #{p.name}" }.join(', ')
|
data/etc/templates/cpp.erb
CHANGED
@@ -13,7 +13,7 @@ namespace <%= self.options[:module] || library&.name || :lib %> {
|
|
13
13
|
<% for enum in @enums[library] || [] %>
|
14
14
|
|
15
15
|
<% if enum.comment %>
|
16
|
-
|
16
|
+
<%= format_comment(enum.comment, ' //') %>
|
17
17
|
<% end %>
|
18
18
|
enum <%= enum.name %> {
|
19
19
|
<% for name, value in enum.values || {} %>
|
@@ -24,7 +24,7 @@ namespace <%= self.options[:module] || library&.name || :lib %> {
|
|
24
24
|
<% for struct in @structs[library] || [] %>
|
25
25
|
|
26
26
|
<% if struct.comment %>
|
27
|
-
|
27
|
+
<%= format_comment(struct.comment, ' //') %>
|
28
28
|
<% end %>
|
29
29
|
struct <%= struct.name %> {
|
30
30
|
<% for name, type in struct.fields || {} %>
|
@@ -35,7 +35,7 @@ namespace <%= self.options[:module] || library&.name || :lib %> {
|
|
35
35
|
<% for function in @functions[library] || [] %>
|
36
36
|
|
37
37
|
<% if function.comment %>
|
38
|
-
|
38
|
+
<%= format_comment(function.comment, ' //') %>
|
39
39
|
<% end %>
|
40
40
|
extern "C" <%= function.type %> <%= function.name %>(<%=
|
41
41
|
function.parameters.each_value.map { |p| "#{p.type} #{p.name}" }.join(', ')
|
data/etc/templates/dart.erb
CHANGED
@@ -16,7 +16,7 @@ final <%= library&.name || :lib %> = DynamicLibrary.open('<%= dlopen_paths_for(l
|
|
16
16
|
<% for enum in @enums[library] || [] %>
|
17
17
|
|
18
18
|
<% if enum.comment %>
|
19
|
-
|
19
|
+
<%= format_comment(enum.comment, '///') %>
|
20
20
|
<% end %>
|
21
21
|
abstract class <%= enum.name %> {
|
22
22
|
<%= enum.name %>._();
|
@@ -29,11 +29,12 @@ abstract class <%= enum.name %> {
|
|
29
29
|
<% for struct in @structs[library] || [] %>
|
30
30
|
|
31
31
|
<% if struct.comment %>
|
32
|
-
|
32
|
+
<%= format_comment(struct.comment, '///') %>
|
33
33
|
<% end %>
|
34
34
|
<% if struct.opaque? %>
|
35
35
|
class <%= struct.name %> extends Struct {
|
36
|
-
|
36
|
+
@Uint8()
|
37
|
+
int _opaque;
|
37
38
|
<% else %>
|
38
39
|
class <%= struct.name %> extends Struct {
|
39
40
|
<% for (name, type), i in (struct.fields || {}).each_with_index %>
|
@@ -51,7 +52,7 @@ class <%= struct.name %> extends Struct {
|
|
51
52
|
<% for function in @functions[library] || [] %>
|
52
53
|
|
53
54
|
<% if function.comment %>
|
54
|
-
|
55
|
+
<%= format_comment(function.comment, '///') %>
|
55
56
|
<% end %>
|
56
57
|
final <%= dart_param_type(function.type) %> Function(<%=
|
57
58
|
function.parameters.each_value.map { |p| dart_param_type(p.type) }.join(', ')
|
data/etc/templates/go.erb
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
<% for enum in @enums[library] || [] %>
|
18
18
|
|
19
19
|
<% if enum.comment %>
|
20
|
-
|
20
|
+
<%= format_comment(enum.comment, '//') %>
|
21
21
|
<% end %>
|
22
22
|
enum <%= enum.name %> {
|
23
23
|
<% for name, value in enum.values || {} %>
|
@@ -28,7 +28,7 @@ enum <%= enum.name %> {
|
|
28
28
|
<% for struct in @structs[library] || [] %>
|
29
29
|
|
30
30
|
<% if struct.comment %>
|
31
|
-
|
31
|
+
<%= format_comment(struct.comment, '//') %>
|
32
32
|
<% end %>
|
33
33
|
struct <%= struct.name %> {
|
34
34
|
<% for name, type in struct.fields || {} %>
|
@@ -39,7 +39,7 @@ struct <%= struct.name %> {
|
|
39
39
|
<% for function in @functions[library] || [] %>
|
40
40
|
|
41
41
|
<% if function.comment %>
|
42
|
-
|
42
|
+
<%= format_comment(function.comment, '//') %>
|
43
43
|
<% end %>
|
44
44
|
extern <%= function.type %> <%= function.name %>(<%=
|
45
45
|
function.parameters.each_value.map { |p| "#{p.type} #{p.name}" }.join(', ')
|
data/etc/templates/java.erb
CHANGED
@@ -16,9 +16,9 @@ public interface <%= library&.interface_name || :FFI %> extends Library {
|
|
16
16
|
<% end %>
|
17
17
|
<% for enum in @enums[library] || [] %>
|
18
18
|
|
19
|
-
<% if enum.comment %>
|
20
|
-
|
21
|
-
<% end %>
|
19
|
+
<% if enum.comment %>
|
20
|
+
<%= format_comment(enum.comment, ' //') %>
|
21
|
+
<% end %>
|
22
22
|
public static class <%= enum.name %> {
|
23
23
|
<% for name, value in enum.values || {} %>
|
24
24
|
public static final int <%= name %> = <%= value %>;
|
@@ -28,7 +28,7 @@ public interface <%= library&.interface_name || :FFI %> extends Library {
|
|
28
28
|
<% for struct in @structs[library] || [] %>
|
29
29
|
|
30
30
|
<% if struct.comment %>
|
31
|
-
|
31
|
+
<%= format_comment(struct.comment, ' //') %>
|
32
32
|
<% end %>
|
33
33
|
<% if struct.opaque? %>
|
34
34
|
@FieldOrder({ "_opaque" })
|
@@ -46,7 +46,7 @@ public interface <%= library&.interface_name || :FFI %> extends Library {
|
|
46
46
|
<% for function in @functions[library] || [] %>
|
47
47
|
|
48
48
|
<% if function.comment %>
|
49
|
-
|
49
|
+
<%= format_comment(function.comment, ' //') %>
|
50
50
|
<% end %>
|
51
51
|
<%= param_type(function.type) %> <%= function.name %>(<%=
|
52
52
|
function.parameters.each_value.map { |p| [param_type(p.type), p.name].join(' ') }.join(', ')
|
data/etc/templates/lisp.erb
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
<% for enum in @enums[library] || [] %>
|
15
15
|
|
16
16
|
<% if enum.comment %>
|
17
|
-
|
17
|
+
<%= format_comment(enum.comment, ';;') %>
|
18
18
|
<% end %>
|
19
19
|
(cffi:defcenum <%= enum.name %>
|
20
20
|
<% for name, value in enum.values || {} %>
|
@@ -25,14 +25,14 @@
|
|
25
25
|
<% for struct in @structs[library] || [] %>
|
26
26
|
|
27
27
|
<% if struct.comment %>
|
28
|
-
|
28
|
+
<%= format_comment(struct.comment, ';;') %>
|
29
29
|
<% end %>
|
30
30
|
<% if struct.opaque? %>
|
31
31
|
(cffi:defctype <%= struct.name %> :pointer)
|
32
32
|
<% else %>
|
33
33
|
(cffi:defcstruct <%= struct.name %>
|
34
34
|
<% for name, type in struct.fields || {} %>
|
35
|
-
(<%= name %> <%= struct_type(type)
|
35
|
+
(<%= name %> <%= struct_type(type) %>)
|
36
36
|
<% end %>
|
37
37
|
)
|
38
38
|
<% end %>
|
@@ -40,10 +40,10 @@
|
|
40
40
|
<% for function in @functions[library] || [] %>
|
41
41
|
|
42
42
|
<% if function.comment %>
|
43
|
-
|
43
|
+
<%= format_comment(function.comment, ';;') %>
|
44
44
|
<% end %>
|
45
|
-
(cffi:defcfun "<%= function.name %>" <%= param_type(function.type)
|
46
|
-
function.parameters.each_value.map { |p| "(#{p.name} #{param_type(p.type)
|
45
|
+
(cffi:defcfun "<%= function.name %>" <%= param_type(function.type) %><%=
|
46
|
+
function.parameters.each_value.map { |p| " (#{p.name} #{param_type(p.type)})" }.join
|
47
47
|
%>)
|
48
48
|
<% end %>
|
49
49
|
<% end %>
|
data/etc/templates/python.erb
CHANGED
@@ -18,7 +18,7 @@ import ctypes, ctypes.util
|
|
18
18
|
<% for enum in @enums[library] || [] %>
|
19
19
|
|
20
20
|
<% if enum.comment %>
|
21
|
-
|
21
|
+
<%= format_comment(enum.comment, '#') %>
|
22
22
|
<% end %>
|
23
23
|
<%= enum.name %> = ctypes.c_int
|
24
24
|
<% for name, value in enum.values || {} %>
|
@@ -28,12 +28,12 @@ import ctypes, ctypes.util
|
|
28
28
|
<% for struct in @structs[library] || [] %>
|
29
29
|
|
30
30
|
<% if struct.comment %>
|
31
|
-
|
31
|
+
<%= format_comment(struct.comment, '#') %>
|
32
32
|
<% end %>
|
33
33
|
<% if struct.opaque? %>
|
34
|
-
<%= struct.name %> = ctypes.POINTER(ctypes.
|
34
|
+
<%= struct.name %> = ctypes.POINTER(ctypes.c_void_p)
|
35
35
|
<% else %>
|
36
|
-
class <%= struct.name %>(Structure):
|
36
|
+
class <%= struct.name %>(ctypes.Structure):
|
37
37
|
<% if struct.fields.nil? || struct.fields.empty? %>
|
38
38
|
_fields_ = []
|
39
39
|
<% else %>
|
@@ -48,7 +48,7 @@ class <%= struct.name %>(Structure):
|
|
48
48
|
<% for function in @functions[library] || [] %>
|
49
49
|
|
50
50
|
<% if function.comment %>
|
51
|
-
|
51
|
+
<%= format_comment(function.comment, '#') %>
|
52
52
|
<% end %>
|
53
53
|
<%= function.name %> = <%= library&.name || :lib %>.<%= function.name %>
|
54
54
|
<%= function.name %>.restype = <%= param_type(function.type) %>
|
data/etc/templates/ruby.erb
CHANGED
@@ -13,7 +13,7 @@ module <%= options[:module] || library&.name&.capitalize || :FFI %>
|
|
13
13
|
<% for enum in @enums[library] || [] %>
|
14
14
|
|
15
15
|
<% if enum.comment %>
|
16
|
-
|
16
|
+
<%= format_comment(enum.comment, ' #') %>
|
17
17
|
<% end %>
|
18
18
|
<%= enum.name %> = :int
|
19
19
|
<% for name, value in enum.values || {} %>
|
@@ -23,14 +23,14 @@ module <%= options[:module] || library&.name&.capitalize || :FFI %>
|
|
23
23
|
<% for struct in @structs[library] || [] %>
|
24
24
|
|
25
25
|
<% if struct.comment %>
|
26
|
-
|
26
|
+
<%= format_comment(struct.comment, ' #') %>
|
27
27
|
<% end %>
|
28
28
|
<% if struct.opaque? %>
|
29
|
-
<%= struct.name %> =
|
29
|
+
<%= struct.name %> = :pointer
|
30
30
|
<% else %>
|
31
31
|
class <%= struct.name %> < FFI::Struct
|
32
32
|
<% for (name, type), i in (struct.fields || {}).each_with_index %>
|
33
|
-
<%= i.zero? ? 'layout' : ' '*6 %> :<%= name %>, <%= struct_type(type)
|
33
|
+
<%= i.zero? ? 'layout' : ' '*6 %> :<%= name %>, <%= struct_type(type) %><%= (i == (struct.fields || {}).size-1) ? '' : ',' %> # <%= type %>
|
34
34
|
<% end %>
|
35
35
|
end
|
36
36
|
<% end %>
|
@@ -38,11 +38,11 @@ module <%= options[:module] || library&.name&.capitalize || :FFI %>
|
|
38
38
|
<% for function in @functions[library] || [] %>
|
39
39
|
|
40
40
|
<% if function.comment %>
|
41
|
-
|
41
|
+
<%= format_comment(function.comment, ' #') %>
|
42
42
|
<% end %>
|
43
43
|
attach_function :<%= function.name %>, [<%=
|
44
|
-
function.parameters.each_value.map { |
|
45
|
-
%>],
|
44
|
+
function.parameters.each_value.map { |param| param_type(param.type) }.join(', ')
|
45
|
+
%>], <%= param_type(function.type) %>
|
46
46
|
<% end %>
|
47
47
|
end # <%= options[:module] || library&.name&.capitalize || :FFI %>
|
48
48
|
<% end %>
|
data/lib/ffidb/exporter.rb
CHANGED
@@ -88,7 +88,8 @@ module FFIDB
|
|
88
88
|
end
|
89
89
|
|
90
90
|
def export_typedef(typedef, disabled: nil)
|
91
|
-
|
91
|
+
@typedefs[@library] ||= {}
|
92
|
+
@typedefs[@library][typedef.name] = typedef
|
92
93
|
end
|
93
94
|
|
94
95
|
def export_enum(enum, disabled: nil)
|
@@ -96,15 +97,15 @@ module FFIDB
|
|
96
97
|
end
|
97
98
|
|
98
99
|
def export_struct(struct, disabled: nil)
|
99
|
-
(@structs[@library] ||= []) << struct
|
100
|
+
(@structs[@library] ||= []) << self.resolve_struct(struct)
|
100
101
|
end
|
101
102
|
|
102
103
|
def export_union(union, disabled: nil)
|
103
|
-
(@unions[@library] ||= []) << union
|
104
|
+
(@unions[@library] ||= []) << self.resolve_union(union)
|
104
105
|
end
|
105
106
|
|
106
107
|
def export_function(function, disabled: nil)
|
107
|
-
(@functions[@library] ||= []) << function
|
108
|
+
(@functions[@library] ||= []) << self.resolve_function(function)
|
108
109
|
end
|
109
110
|
|
110
111
|
def finish_library
|
@@ -125,13 +126,121 @@ module FFIDB
|
|
125
126
|
@stream.print *args
|
126
127
|
end
|
127
128
|
|
129
|
+
##
|
130
|
+
# @param [String] comment
|
131
|
+
# @param [String] prefix
|
132
|
+
# @return [String]
|
133
|
+
def format_comment(comment, prefix)
|
134
|
+
prefix = prefix + ' '
|
135
|
+
comment.each_line.map(&:strip).map { |s| s.prepend(prefix) }.join("\n")
|
136
|
+
end
|
137
|
+
|
138
|
+
##
|
139
|
+
# @param [Function] function
|
140
|
+
# @feturn [Function]
|
141
|
+
def resolve_function(function)
|
142
|
+
function.type = self.resolve_type(function.type)
|
143
|
+
function.parameters.transform_values! do |param|
|
144
|
+
param.type = self.resolve_type(param.type)
|
145
|
+
param
|
146
|
+
end
|
147
|
+
function
|
148
|
+
end
|
149
|
+
|
150
|
+
##
|
151
|
+
# @param [Struct] struct
|
152
|
+
# @feturn [Struct]
|
153
|
+
def resolve_struct(struct)
|
154
|
+
struct.fields.each do |field_name, field_type|
|
155
|
+
struct.fields[field_name] = self.resolve_type(field_type)
|
156
|
+
end
|
157
|
+
struct
|
158
|
+
end
|
159
|
+
|
160
|
+
##
|
161
|
+
# @param [Union] union
|
162
|
+
# @feturn [Union]
|
163
|
+
def resolve_union(union)
|
164
|
+
self.resolve_struct(union)
|
165
|
+
end
|
166
|
+
|
167
|
+
##
|
168
|
+
# @param [Type] type
|
169
|
+
# @return [Type, Symbol]
|
170
|
+
def resolve_type(type)
|
171
|
+
case
|
172
|
+
when type.struct_pointer?
|
173
|
+
name = type.spec.gsub(/^const /, '').gsub(/^struct /, '').gsub(/\s*\*+$/, '')
|
174
|
+
name.to_sym
|
175
|
+
when type.struct? || type.union?
|
176
|
+
type
|
177
|
+
when typedef = lookup_typedef(type.name)
|
178
|
+
case typedef.type.tag
|
179
|
+
when :enum then type.name.to_sym
|
180
|
+
when :struct then (type.pointer? ? type.name : "#{type.name}.by_value").to_sym # FIXME
|
181
|
+
else typedef.type
|
182
|
+
end
|
183
|
+
else type
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
##
|
188
|
+
# @param [Type] type
|
189
|
+
# @return [Symbolic]
|
190
|
+
def lookup_symbol(type)
|
191
|
+
self.lookup_typedef(type.name)
|
192
|
+
end
|
193
|
+
|
194
|
+
##
|
195
|
+
# @param [Symbol] type_name
|
196
|
+
# @return [Typedef]
|
197
|
+
def lookup_typedef(type_name)
|
198
|
+
@typedefs && @typedefs[@library] && @typedefs[@library][type_name]
|
199
|
+
end
|
200
|
+
|
201
|
+
##
|
202
|
+
# @param [Symbol, Type] c_type
|
203
|
+
# @return [#to_s]
|
204
|
+
def struct_type(c_type)
|
205
|
+
return c_type if c_type.is_a?(Symbol) # a resolved typedef
|
206
|
+
self.param_type(c_type)
|
207
|
+
end
|
208
|
+
|
209
|
+
##
|
210
|
+
# @param [Symbol, Type] c_type
|
211
|
+
# @return [#to_s]
|
212
|
+
def param_type(c_type)
|
213
|
+
return c_type if c_type.is_a?(Symbol) # a resolved typedef
|
214
|
+
case
|
215
|
+
when type = typemap[c_type.to_s] then type
|
216
|
+
when c_type.enum? then typemap['int']
|
217
|
+
when c_type.pointer? then typemap['void *']
|
218
|
+
when c_type.array? then typemap['void *']
|
219
|
+
else
|
220
|
+
warn "#{$0}: unknown C type #{c_type}, mapping to enum (int)" if debug?
|
221
|
+
typemap['int'] # TODO: typedef or enum
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
def typemap
|
226
|
+
@typemap ||= self.load_typemap(self.class.const_get(:TYPE_MAP))
|
227
|
+
end
|
228
|
+
|
229
|
+
def load_typemap(typemap_name)
|
230
|
+
::YAML.load(File.read(self.path_to_typemap(typemap_name))).freeze
|
231
|
+
end
|
232
|
+
|
233
|
+
def path_to_typemap(typemap_name)
|
234
|
+
File.expand_path("../../etc/mappings/#{typemap_name}", __dir__)
|
235
|
+
end
|
236
|
+
|
128
237
|
def render_template(template_name)
|
129
238
|
#ERB.new(self.load_template(template_name)).result(binding)
|
130
239
|
Tilt.new(self.path_to_template(template_name)).render(self)
|
131
240
|
end
|
132
241
|
|
133
242
|
def load_template(template_name)
|
134
|
-
File.read(self.path_to_template(template_name))
|
243
|
+
File.read(self.path_to_template(template_name)).freeze
|
135
244
|
end
|
136
245
|
|
137
246
|
def path_to_template(template_name)
|
data/lib/ffidb/exporters/dart.rb
CHANGED
@@ -10,25 +10,24 @@ module FFIDB::Exporters
|
|
10
10
|
# @see https://flutter.dev/docs/development/platform-integration/c-interop
|
11
11
|
# @see https://api.dart.dev/dev/dart-ffi/dart-ffi-library.html
|
12
12
|
class Dart < FFIDB::Exporter
|
13
|
-
|
14
|
-
.freeze
|
13
|
+
TYPE_MAP = 'dart.yaml'
|
15
14
|
|
16
15
|
# @see https://dart.dev/guides/language/language-tour
|
17
16
|
TYPE_MAP_DART = {
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
'Pointer<Int8>'
|
31
|
-
|
17
|
+
'Void' => :void,
|
18
|
+
'Int8' => :int,
|
19
|
+
'Int16' => :int,
|
20
|
+
'Int32' => :int,
|
21
|
+
'Int64' => :int,
|
22
|
+
'Uint8' => :int,
|
23
|
+
'Uint16' => :int,
|
24
|
+
'Uint32' => :int,
|
25
|
+
'Uint64' => :int,
|
26
|
+
'Float' => :double,
|
27
|
+
'Double' => :double,
|
28
|
+
'IntPtr' => :int,
|
29
|
+
'Pointer<Int8>' => 'Pointer<Int8>',
|
30
|
+
'Pointer<Void>' => 'Pointer<Void>',
|
32
31
|
}
|
33
32
|
|
34
33
|
def finish
|
@@ -39,22 +38,45 @@ module FFIDB::Exporters
|
|
39
38
|
|
40
39
|
##
|
41
40
|
# @param [FFIDB::Type] c_type
|
42
|
-
# @return [
|
41
|
+
# @return [String]
|
42
|
+
def dart_struct_type(c_type)
|
43
|
+
case
|
44
|
+
when c_type.array? then self.dart_param_type(c_type) # TODO: https://github.com/dart-lang/sdk/issues/35763
|
45
|
+
else self.dart_param_type(c_type)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
##
|
50
|
+
# @param [FFIDB::Type] c_type
|
51
|
+
# @return [String]
|
52
|
+
def ffi_struct_type(c_type)
|
53
|
+
case
|
54
|
+
when c_type.array? then self.ffi_param_type(c_type) # TODO: https://github.com/dart-lang/sdk/issues/35763
|
55
|
+
else self.ffi_param_type(c_type)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
##
|
60
|
+
# @param [FFIDB::Type] c_type
|
61
|
+
# @return [String]
|
43
62
|
def dart_param_type(c_type)
|
44
|
-
|
63
|
+
case
|
64
|
+
when c_type.array?
|
65
|
+
"Pointer<#{self.dart_param_type(c_type.array_type)}>"
|
66
|
+
when type = TYPE_MAP_DART[self.ffi_param_type(c_type)] then type
|
67
|
+
else TYPE_MAP_DART[self.typemap['int']].to_s
|
68
|
+
end
|
45
69
|
end
|
46
|
-
alias_method :dart_struct_type, :dart_param_type
|
47
70
|
|
48
71
|
##
|
49
72
|
# @param [FFIDB::Type] c_type
|
50
|
-
# @return [
|
73
|
+
# @return [String]
|
51
74
|
def ffi_param_type(c_type)
|
52
75
|
case
|
53
|
-
|
54
|
-
|
55
|
-
else
|
76
|
+
when c_type.array?
|
77
|
+
"Pointer<#{self.ffi_param_type(c_type.array_type)}>"
|
78
|
+
else self.param_type(c_type)
|
56
79
|
end
|
57
80
|
end
|
58
|
-
alias_method :ffi_struct_type, :ffi_param_type
|
59
81
|
end # Dart
|
60
82
|
end # FFIDB::Exporters
|
data/lib/ffidb/exporters/java.rb
CHANGED
@@ -8,8 +8,7 @@ module FFIDB::Exporters
|
|
8
8
|
#
|
9
9
|
# @see https://github.com/java-native-access/jna/blob/master/www/GettingStarted.md
|
10
10
|
class Java < FFIDB::Exporter
|
11
|
-
TYPE_MAP =
|
12
|
-
.freeze
|
11
|
+
TYPE_MAP = 'java.yaml'
|
13
12
|
|
14
13
|
def begin_library(library)
|
15
14
|
if library
|
@@ -22,18 +21,5 @@ module FFIDB::Exporters
|
|
22
21
|
def finish
|
23
22
|
puts self.render_template('java.erb')
|
24
23
|
end
|
25
|
-
|
26
|
-
protected
|
27
|
-
|
28
|
-
##
|
29
|
-
# @param [FFIDB::Type] c_type
|
30
|
-
# @return [#to_s]
|
31
|
-
def param_type(c_type)
|
32
|
-
case
|
33
|
-
when c_type.enum? then :int
|
34
|
-
else TYPE_MAP[c_type.to_s] || TYPE_MAP['void *']
|
35
|
-
end
|
36
|
-
end
|
37
|
-
alias_method :struct_type, :param_type
|
38
24
|
end # Java
|
39
25
|
end # FFIDB::Exporters
|
data/lib/ffidb/exporters/lisp.rb
CHANGED
@@ -8,9 +8,7 @@ module FFIDB::Exporters
|
|
8
8
|
#
|
9
9
|
# @see https://common-lisp.net/project/cffi/
|
10
10
|
class Lisp < FFIDB::Exporter
|
11
|
-
TYPE_MAP =
|
12
|
-
.transform_values(&:to_sym)
|
13
|
-
.freeze
|
11
|
+
TYPE_MAP = 'lisp.yaml'
|
14
12
|
|
15
13
|
def finish
|
16
14
|
puts self.render_template('lisp.erb')
|
@@ -20,22 +18,19 @@ module FFIDB::Exporters
|
|
20
18
|
|
21
19
|
##
|
22
20
|
# @param [FFIDB::Type] c_type
|
23
|
-
# @return [
|
21
|
+
# @return [String]
|
24
22
|
def struct_type(c_type)
|
25
23
|
case
|
26
|
-
when c_type.array? then [c_type.array_type.to_s.to_sym, :count, c_type.array_size]
|
27
|
-
else
|
24
|
+
when c_type.array? then [c_type.array_type.to_s.to_sym, :count, c_type.array_size].map(&:inspect).join(' ')
|
25
|
+
else self.param_type(c_type)
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
31
29
|
##
|
32
30
|
# @param [FFIDB::Type] c_type
|
33
|
-
# @return [
|
31
|
+
# @return [String]
|
34
32
|
def param_type(c_type)
|
35
|
-
|
36
|
-
when c_type.enum? then :int
|
37
|
-
else TYPE_MAP[c_type.to_s] || TYPE_MAP['void *']
|
38
|
-
end
|
33
|
+
':' << super(c_type)
|
39
34
|
end
|
40
35
|
end # Lisp
|
41
36
|
end # FFIDB::Exporters
|
@@ -8,8 +8,7 @@ module FFIDB::Exporters
|
|
8
8
|
#
|
9
9
|
# @see https://docs.python.org/3/library/ctypes.html
|
10
10
|
class Python < FFIDB::Exporter
|
11
|
-
TYPE_MAP =
|
12
|
-
.freeze
|
11
|
+
TYPE_MAP = 'python.yaml'
|
13
12
|
|
14
13
|
def finish
|
15
14
|
puts self.render_template('python.erb')
|
@@ -18,18 +17,27 @@ module FFIDB::Exporters
|
|
18
17
|
protected
|
19
18
|
|
20
19
|
##
|
21
|
-
# @param [FFIDB::Type] c_type
|
22
|
-
# @return [
|
23
|
-
def
|
24
|
-
case
|
25
|
-
when c_type.
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
else "ctypes.#{py_type}"
|
20
|
+
# @param [Symbol, FFIDB::Type] c_type
|
21
|
+
# @return [String]
|
22
|
+
def struct_type(c_type)
|
23
|
+
case c_type
|
24
|
+
when Symbol then c_type.to_s # a typedef
|
25
|
+
else case
|
26
|
+
when c_type.array? then [self.param_type(c_type.array_type), '*', c_type.array_size].join(' ')
|
27
|
+
else self.param_type(c_type)
|
30
28
|
end
|
31
29
|
end
|
32
30
|
end
|
33
|
-
|
31
|
+
|
32
|
+
##
|
33
|
+
# @param [Symbol, FFIDB::Type] c_type
|
34
|
+
# @return [String]
|
35
|
+
def param_type(c_type)
|
36
|
+
case type = super(c_type)
|
37
|
+
when Symbol then type.to_s # a typedef
|
38
|
+
when 'None' then type
|
39
|
+
else "ctypes.#{type}"
|
40
|
+
end
|
41
|
+
end
|
34
42
|
end # Python
|
35
43
|
end # FFIDB::Exporters
|
data/lib/ffidb/exporters/ruby.rb
CHANGED
@@ -8,9 +8,7 @@ module FFIDB::Exporters
|
|
8
8
|
#
|
9
9
|
# @see https://github.com/ffi/ffi/wiki
|
10
10
|
class Ruby < FFIDB::Exporter
|
11
|
-
TYPE_MAP =
|
12
|
-
.transform_values(&:to_sym)
|
13
|
-
.freeze
|
11
|
+
TYPE_MAP = 'ruby.yaml'
|
14
12
|
|
15
13
|
def finish
|
16
14
|
puts self.render_template('ruby.erb')
|
@@ -19,15 +17,26 @@ module FFIDB::Exporters
|
|
19
17
|
protected
|
20
18
|
|
21
19
|
##
|
22
|
-
# @param [FFIDB::Type] c_type
|
23
|
-
# @return [
|
20
|
+
# @param [Symbol, FFIDB::Type] c_type
|
21
|
+
# @return [String]
|
22
|
+
def struct_type(c_type)
|
23
|
+
case c_type
|
24
|
+
when Symbol then c_type.to_s # a typedef
|
25
|
+
else case
|
26
|
+
when c_type.array? then [self.param_type(c_type.array_type), c_type.array_size].inspect
|
27
|
+
else self.param_type(c_type)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
##
|
33
|
+
# @param [Symbol, FFIDB::Type] c_type
|
34
|
+
# @return [String]
|
24
35
|
def param_type(c_type)
|
25
|
-
case
|
26
|
-
when
|
27
|
-
|
28
|
-
else TYPE_MAP[c_type.to_s] || TYPE_MAP['void *']
|
36
|
+
case type = super(c_type)
|
37
|
+
when Symbol then type.to_s # a typedef
|
38
|
+
else ':' << type.to_s
|
29
39
|
end
|
30
40
|
end
|
31
|
-
alias_method :struct_type, :param_type
|
32
41
|
end # Ruby
|
33
42
|
end # FFIDB::Exporters
|
data/lib/ffidb/type.rb
CHANGED
@@ -23,6 +23,23 @@ module FFIDB
|
|
23
23
|
# @return [Integer]
|
24
24
|
def <=>(other) self.spec <=> other.spec end
|
25
25
|
|
26
|
+
##
|
27
|
+
# @return [Symbol]
|
28
|
+
def tag
|
29
|
+
case self.spec.gsub(/^const /, '')
|
30
|
+
when 'enum', /^enum\s+/ then :enum
|
31
|
+
when 'struct', /^struct\s+/ then :struct
|
32
|
+
when 'union', /^union\s+/ then :union
|
33
|
+
else nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# @return [Symbol]
|
39
|
+
def name
|
40
|
+
self.spec.gsub(/\s*\*+$/, '').to_sym # TODO
|
41
|
+
end
|
42
|
+
|
26
43
|
##
|
27
44
|
# @return [Boolean]
|
28
45
|
def const_qualified?
|
@@ -50,13 +67,13 @@ module FFIDB
|
|
50
67
|
##
|
51
68
|
# @return [Boolean]
|
52
69
|
def enum?
|
53
|
-
!(self.pointer?) && self.spec.start_with?('enum ')
|
70
|
+
!(self.pointer?) && (self.spec == 'enum' || self.spec.start_with?('enum '))
|
54
71
|
end
|
55
72
|
|
56
73
|
##
|
57
74
|
# @return [Boolean]
|
58
75
|
def struct?
|
59
|
-
!(self.pointer?) && (self.spec.start_with?('struct ') || self.spec.start_with?('const struct '))
|
76
|
+
!(self.pointer?) && (self.spec == 'struct' || self.spec.start_with?('struct ') || self.spec.start_with?('const struct '))
|
60
77
|
end
|
61
78
|
|
62
79
|
##
|
@@ -180,19 +197,6 @@ module FFIDB
|
|
180
197
|
self.spec.include?('(*)')
|
181
198
|
end
|
182
199
|
|
183
|
-
##
|
184
|
-
# @return [Integer, Range, nil]
|
185
|
-
def sizeof
|
186
|
-
nil # TODO
|
187
|
-
end
|
188
|
-
alias_method :size, :sizeof
|
189
|
-
|
190
|
-
##
|
191
|
-
# @return [Integer, Range, nil]
|
192
|
-
def alignof
|
193
|
-
nil # TODO
|
194
|
-
end
|
195
|
-
|
196
200
|
##
|
197
201
|
# @return [String]
|
198
202
|
def to_s
|
@@ -210,5 +214,20 @@ module FFIDB
|
|
210
214
|
def inspect
|
211
215
|
"#{self.class}(#{self.spec.inspect})"
|
212
216
|
end
|
217
|
+
|
218
|
+
protected
|
219
|
+
|
220
|
+
##
|
221
|
+
# @return [Integer, Range, nil]
|
222
|
+
def sizeof
|
223
|
+
nil # TODO
|
224
|
+
end
|
225
|
+
alias_method :size, :sizeof
|
226
|
+
|
227
|
+
##
|
228
|
+
# @return [Integer, Range, nil]
|
229
|
+
def alignof
|
230
|
+
nil # TODO
|
231
|
+
end
|
213
232
|
end # Type
|
214
233
|
end # FFIDB
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ffidb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arto Bendiken
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-07-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0.6'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: dogma.rb
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: tilt
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -175,7 +189,7 @@ metadata:
|
|
175
189
|
documentation_uri: https://www.rubydoc.info/github/ffidb/ffidb.rb/master
|
176
190
|
homepage_uri: https://github.com/ffidb
|
177
191
|
source_code_uri: https://github.com/ffidb/ffidb.rb
|
178
|
-
post_install_message:
|
192
|
+
post_install_message:
|
179
193
|
rdoc_options: []
|
180
194
|
require_paths:
|
181
195
|
- lib
|
@@ -191,7 +205,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
191
205
|
version: 3.1.2
|
192
206
|
requirements: []
|
193
207
|
rubygems_version: 3.1.2
|
194
|
-
signing_key:
|
208
|
+
signing_key:
|
195
209
|
specification_version: 4
|
196
210
|
summary: Command-line interface (CLI) for the FFI DB registry.
|
197
211
|
test_files: []
|