ruby_header_parser 0.1.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 +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +55 -0
- data/.yardopts +7 -0
- data/CHANGELOG.md +5 -0
- data/CONFIG.md +126 -0
- data/LICENSE.txt +21 -0
- data/README.md +67 -0
- data/Rakefile +30 -0
- data/Steepfile +33 -0
- data/config/default.yml +170 -0
- data/lib/ruby_header_parser/argument_definition.rb +45 -0
- data/lib/ruby_header_parser/config.rb +77 -0
- data/lib/ruby_header_parser/enum_definition.rb +27 -0
- data/lib/ruby_header_parser/function_definition.rb +40 -0
- data/lib/ruby_header_parser/parser.rb +376 -0
- data/lib/ruby_header_parser/struct_definition.rb +21 -0
- data/lib/ruby_header_parser/type_definition.rb +21 -0
- data/lib/ruby_header_parser/typeref_definition.rb +32 -0
- data/lib/ruby_header_parser/util.rb +29 -0
- data/lib/ruby_header_parser/version.rb +5 -0
- data/lib/ruby_header_parser.rb +21 -0
- data/rbs_collection.lock.yaml +116 -0
- data/rbs_collection.yaml +26 -0
- data/sig/ruby_header_parser/argument_definition.rbs +14 -0
- data/sig/ruby_header_parser/config.rbs +19 -0
- data/sig/ruby_header_parser/enum_definition.rbs +10 -0
- data/sig/ruby_header_parser/function_definition.rbs +12 -0
- data/sig/ruby_header_parser/parser.rbs +84 -0
- data/sig/ruby_header_parser/struct_definition.rbs +9 -0
- data/sig/ruby_header_parser/type_definition.rbs +9 -0
- data/sig/ruby_header_parser/typeref_definition.rbs +12 -0
- data/sig/ruby_header_parser/util.rbs +9 -0
- data/sig/ruby_header_parser.rbs +7 -0
- metadata +207 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 73e54692bd969e0639672d95e7b5315bd5bbf8857c988343c0291af3ff5a3ab6
|
4
|
+
data.tar.gz: '099e7a0d30b0ef67d5c21853d123bf34927bae48915fef6cc1377fcea9e56689'
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 282901b284812616deb5c0f5c180aa67397fac1b52c6b121df2462e6094f8e0b88e4ab57b45d2a371fe5f6682cd113e5ff2fb7b99f23f77660a803865a3f61c6
|
7
|
+
data.tar.gz: c87c969a18e295904f4e35f56d83fb8173f7606464c46828ac27f56d1ebb4a4d2db164bcff20d6865fe2446e266fbbfde725ac3773327982e493d0077ce2e70e
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 3.3
|
3
|
+
NewCops: enable
|
4
|
+
SuggestExtensions: false
|
5
|
+
|
6
|
+
Gemspec/DevelopmentDependencies:
|
7
|
+
EnforcedStyle: gemspec
|
8
|
+
|
9
|
+
Layout/DotPosition:
|
10
|
+
EnforcedStyle: trailing
|
11
|
+
|
12
|
+
Layout/HashAlignment:
|
13
|
+
EnforcedColonStyle: table
|
14
|
+
EnforcedHashRocketStyle: table
|
15
|
+
|
16
|
+
Layout/SpaceAroundOperators:
|
17
|
+
Exclude:
|
18
|
+
# Suppress line breaks in spec files (e.g `it { should xxxx }`, `its(:method) { should xxxx }` )
|
19
|
+
- "**/*_spec.rb"
|
20
|
+
|
21
|
+
Lint/BinaryOperatorWithIdenticalOperands:
|
22
|
+
Exclude:
|
23
|
+
- "**/*_spec.rb" # for rspec-parameterized
|
24
|
+
|
25
|
+
Metrics/AbcSize:
|
26
|
+
Max: 20
|
27
|
+
|
28
|
+
Metrics/BlockLength:
|
29
|
+
Exclude:
|
30
|
+
- "*.gemspec"
|
31
|
+
- "**/*_spec.rb"
|
32
|
+
|
33
|
+
Metrics/MethodLength:
|
34
|
+
Max: 21
|
35
|
+
|
36
|
+
Style/NumericPredicate:
|
37
|
+
EnforcedStyle: comparison
|
38
|
+
|
39
|
+
Style/SingleLineMethods:
|
40
|
+
Enabled: false
|
41
|
+
|
42
|
+
Style/StringLiterals:
|
43
|
+
EnforcedStyle: double_quotes
|
44
|
+
|
45
|
+
Style/StringLiteralsInInterpolation:
|
46
|
+
EnforcedStyle: double_quotes
|
47
|
+
|
48
|
+
Style/TrailingCommaInArguments:
|
49
|
+
EnforcedStyleForMultiline: comma
|
50
|
+
|
51
|
+
Style/TrailingCommaInArrayLiteral:
|
52
|
+
EnforcedStyleForMultiline: comma
|
53
|
+
|
54
|
+
Style/TrailingCommaInHashLiteral:
|
55
|
+
EnforcedStyleForMultiline: comma
|
data/.yardopts
ADDED
data/CHANGELOG.md
ADDED
data/CONFIG.md
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
# Configuration file specification
|
2
|
+
|
3
|
+
## Example
|
4
|
+
```yaml
|
5
|
+
function:
|
6
|
+
include_name:
|
7
|
+
- !ruby/regexp /^rb_/i
|
8
|
+
- !ruby/regexp /^rstring_/i
|
9
|
+
|
10
|
+
exclude_name:
|
11
|
+
# deprecated functions
|
12
|
+
- !ruby/regexp /^rb_check_safe_str$/i
|
13
|
+
- !ruby/regexp /^rb_clear_constant_cache$/i
|
14
|
+
- !ruby/regexp /^rb_clone_setup$/i
|
15
|
+
|
16
|
+
pointer_hint:
|
17
|
+
RSTRING_PTR:
|
18
|
+
self: raw
|
19
|
+
rb_data_object_make:
|
20
|
+
4: sref
|
21
|
+
|
22
|
+
struct:
|
23
|
+
include_name:
|
24
|
+
- !ruby/regexp /^rb_/i
|
25
|
+
- re_registers
|
26
|
+
|
27
|
+
exclude_name:
|
28
|
+
- rb_data_type_struct
|
29
|
+
|
30
|
+
type:
|
31
|
+
include_name:
|
32
|
+
- !ruby/regexp /^rb_/i
|
33
|
+
- !ruby/regexp /^st_/i
|
34
|
+
- ID
|
35
|
+
- VALUE
|
36
|
+
|
37
|
+
exclude_name: []
|
38
|
+
|
39
|
+
enum:
|
40
|
+
include_name:
|
41
|
+
- ruby_value_type
|
42
|
+
- rb_io_wait_readwrite
|
43
|
+
|
44
|
+
exclude_name: []
|
45
|
+
```
|
46
|
+
|
47
|
+
## Full configuration file
|
48
|
+
[config/default.yml](config/default.yml) is used by https://github.com/sue445/go-gem-wrapper to generate bindings for Go.
|
49
|
+
|
50
|
+
## `function.include_name`, `struct.include_name`, `type.include_name`, `enum.include_name`
|
51
|
+
Return functions and structures that match the condition with a [RubyHeaderParser::Parser](lib/ruby_header_parser/parser.rb)
|
52
|
+
|
53
|
+
e.g.
|
54
|
+
|
55
|
+
```yaml
|
56
|
+
struct:
|
57
|
+
include_name:
|
58
|
+
- !ruby/regexp /^rb_/i
|
59
|
+
- re_registers
|
60
|
+
```
|
61
|
+
|
62
|
+
Elements in the array accept the following
|
63
|
+
|
64
|
+
* `String`: Exact match
|
65
|
+
* `Regexp`(`!ruby/regexp`): Regular expression match
|
66
|
+
|
67
|
+
## `function.exclude_name`, `struct.exclude_name`, `type.exclude_name`, `enum.exclude_name`
|
68
|
+
Doesn't return functions and structures that match the condition with a [RubyHeaderParser::Parser](lib/ruby_header_parser/parser.rb)
|
69
|
+
|
70
|
+
e.g.
|
71
|
+
|
72
|
+
```yaml
|
73
|
+
function:
|
74
|
+
exclude_name:
|
75
|
+
- !ruby/regexp /^rb_check_safe_str$/i
|
76
|
+
- rb_scan_args_bad_format
|
77
|
+
```
|
78
|
+
|
79
|
+
`exclude_name` is preferred over `include_name`
|
80
|
+
|
81
|
+
Other specifications are the same as `include_name`
|
82
|
+
|
83
|
+
## `function.pointer_hint`
|
84
|
+
Provide a hint if the function argument type is a pointer
|
85
|
+
|
86
|
+
e.g.
|
87
|
+
|
88
|
+
```yaml
|
89
|
+
function:
|
90
|
+
pointer_hint:
|
91
|
+
RSTRING_PTR: # function name (Exact match)
|
92
|
+
self: raw
|
93
|
+
rb_data_object_make:
|
94
|
+
4: sref
|
95
|
+
```
|
96
|
+
|
97
|
+
### Function arguments (`1`, `2`, `3`, ...)
|
98
|
+
* `ref` (default)
|
99
|
+
* normal pointer
|
100
|
+
* e.g. 1st argument of `VALUE rb_const_list(void*)`
|
101
|
+
* `in_ref`
|
102
|
+
* input only pointer
|
103
|
+
* e.g. 2nd argument of `void rb_define_variable(const char *name, VALUE *var)`
|
104
|
+
* `sref`
|
105
|
+
* special one for multiple pointer
|
106
|
+
* e.g. 3rd argument of `rb_data_typed_object_make(VALUE klass, const rb_data_type_t *type, void **datap, size_t size)`
|
107
|
+
* `array`
|
108
|
+
* array
|
109
|
+
* e.g. 4th argument of `VALUE rb_funcallv(VALUE recv, ID mid, int argc, const VALUE *argv)`
|
110
|
+
* `ref_array`
|
111
|
+
* array of pointer
|
112
|
+
* e.g. 10th argument of `rb_scan_args_set(int kw_flag, int argc, const VALUE *argv, int n_lead, int n_opt, int n_trail, bool f_var, bool f_hash, bool f_block, VALUE *vars[], RB_UNUSED_VAR(const char *fmt), RB_UNUSED_VAR(int varc))`
|
113
|
+
* `str_array`
|
114
|
+
* array of string
|
115
|
+
* e.g. 2nd argument of `int rb_find_file_ext(VALUE *feature, const char *const *exts)`
|
116
|
+
* `function`
|
117
|
+
* function pointer
|
118
|
+
* e.g. 4th argument of `void rb_define_method(VALUE klass, const char *mid, VALUE (*func)(), int arity)`
|
119
|
+
|
120
|
+
### Function return value (`self`)
|
121
|
+
* `ref` (default)
|
122
|
+
* normal pointer
|
123
|
+
* e.g. Return value of `int *rb_errno_ptr(void)`
|
124
|
+
* `raw`
|
125
|
+
* In many cases `char*` can be interpreted as a string. But if `raw` is specified, it suppresses interpretation as a string
|
126
|
+
* e.g. Return value of `char* RSTRING_PTR(VALUE str)`
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2024 sue445
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
# RubyHeaderParser
|
2
|
+
Parser for `ruby.h`
|
3
|
+
|
4
|
+
[](https://github.com/sue445/ruby_header_parser/actions/workflows/test.yml)
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Install the gem and add to the application's Gemfile by executing:
|
9
|
+
|
10
|
+
```bash
|
11
|
+
bundle add ruby_header_parser
|
12
|
+
```
|
13
|
+
|
14
|
+
If bundler is not being used to manage dependencies, install the gem by executing:
|
15
|
+
|
16
|
+
```bash
|
17
|
+
gem install ruby_header_parser
|
18
|
+
```
|
19
|
+
|
20
|
+
## Requirements
|
21
|
+
Following is required in addition to Ruby.
|
22
|
+
|
23
|
+
### ctags
|
24
|
+
macOS
|
25
|
+
|
26
|
+
```bash
|
27
|
+
brew install universal-ctags
|
28
|
+
```
|
29
|
+
|
30
|
+
Ubuntu
|
31
|
+
|
32
|
+
```bash
|
33
|
+
apt-get install -y universal-ctags
|
34
|
+
```
|
35
|
+
|
36
|
+
## Usage
|
37
|
+
```ruby
|
38
|
+
require "ruby_header_parser"
|
39
|
+
|
40
|
+
parser = RubyHeaderParser::Parser.new
|
41
|
+
|
42
|
+
function_definitions = parser.extract_function_definitions
|
43
|
+
static_inline_function_definitions = parser.extract_static_inline_function_definitions
|
44
|
+
struct_definitions = parser.extract_struct_definitions
|
45
|
+
type_definitions = parser.extract_type_definitions
|
46
|
+
enum_definitions = parser.extract_enum_definitions
|
47
|
+
```
|
48
|
+
|
49
|
+
See below for details.
|
50
|
+
|
51
|
+
https://sue445.github.io/ruby_header_parser/RubyHeaderParser/Parser.html
|
52
|
+
|
53
|
+
See [CONFIG.md](CONFIG.md) for config file details
|
54
|
+
|
55
|
+
## Development
|
56
|
+
|
57
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
58
|
+
|
59
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
60
|
+
|
61
|
+
## Contributing
|
62
|
+
|
63
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/sue445/ruby_header_parser.
|
64
|
+
|
65
|
+
## License
|
66
|
+
|
67
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bundler/gem_tasks"
|
4
|
+
require "rspec/core/rake_task"
|
5
|
+
|
6
|
+
RSpec::Core::RakeTask.new(:spec)
|
7
|
+
|
8
|
+
require "rubocop/rake_task"
|
9
|
+
|
10
|
+
RuboCop::RakeTask.new
|
11
|
+
|
12
|
+
namespace :rbs do
|
13
|
+
desc "`rbs collection install` and `git commit`"
|
14
|
+
task :install do
|
15
|
+
sh "rbs collection install"
|
16
|
+
sh "git add rbs_collection.lock.yaml"
|
17
|
+
sh "git commit -m 'rbs collection install' || true"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "Check rbs"
|
22
|
+
task :rbs do
|
23
|
+
sh "rbs validate"
|
24
|
+
sh "steep check"
|
25
|
+
end
|
26
|
+
|
27
|
+
desc "Run all development tasks"
|
28
|
+
task dev_all: %i[spec rubocop rbs]
|
29
|
+
|
30
|
+
task default: :dev_all
|
data/Steepfile
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# D = Steep::Diagnostic
|
4
|
+
|
5
|
+
target :lib do
|
6
|
+
signature "sig"
|
7
|
+
|
8
|
+
check "lib" # Directory name
|
9
|
+
# check "Gemfile" # File name
|
10
|
+
# check "app/models/**/*.rb" # Glob
|
11
|
+
# ignore "lib/templates/*.rb"
|
12
|
+
|
13
|
+
# library "pathname" # Standard libraries
|
14
|
+
# library "strong_json" # Gems
|
15
|
+
|
16
|
+
collection_config "rbs_collection.yaml"
|
17
|
+
|
18
|
+
# configure_code_diagnostics(D::Ruby.default) # `default` diagnostics setting (applies by default)
|
19
|
+
# configure_code_diagnostics(D::Ruby.strict) # `strict` diagnostics setting
|
20
|
+
# configure_code_diagnostics(D::Ruby.lenient) # `lenient` diagnostics setting
|
21
|
+
# configure_code_diagnostics(D::Ruby.silent) # `silent` diagnostics setting
|
22
|
+
# configure_code_diagnostics do |hash| # You can setup everything yourself
|
23
|
+
# hash[D::Ruby::NoMethod] = :information
|
24
|
+
# end
|
25
|
+
end
|
26
|
+
|
27
|
+
# target :test do
|
28
|
+
# signature "sig", "sig-private"
|
29
|
+
#
|
30
|
+
# check "test"
|
31
|
+
#
|
32
|
+
# # library "pathname" # Standard libraries
|
33
|
+
# end
|
data/config/default.yml
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
function:
|
2
|
+
include_name:
|
3
|
+
- !ruby/regexp /^rb_/i
|
4
|
+
- !ruby/regexp /^rstring_/i
|
5
|
+
|
6
|
+
exclude_name:
|
7
|
+
# deprecated functions
|
8
|
+
- !ruby/regexp /^rb_check_safe_str$/i
|
9
|
+
- !ruby/regexp /^rb_clear_constant_cache$/i
|
10
|
+
- !ruby/regexp /^rb_clone_setup$/i
|
11
|
+
- !ruby/regexp /^rb_complex_polar$/i
|
12
|
+
- !ruby/regexp /^rb_data_object_alloc$/i
|
13
|
+
- !ruby/regexp /^rb_data_object_get_warning$/i
|
14
|
+
- !ruby/regexp /^rb_data_object_wrap_warning$/i
|
15
|
+
- !ruby/regexp /^rb_data_typed_object_alloc$/i
|
16
|
+
- !ruby/regexp /^rb_dup_setup$/i
|
17
|
+
- !ruby/regexp /^rb_gc_force_recycle$/i
|
18
|
+
- !ruby/regexp /^rb_iterate$/i
|
19
|
+
- !ruby/regexp /^rb_obj_infect$/i
|
20
|
+
- !ruby/regexp /^rb_obj_infect_raw$/i
|
21
|
+
- !ruby/regexp /^rb_obj_taint$/i
|
22
|
+
- !ruby/regexp /^rb_obj_taint_raw$/i
|
23
|
+
- !ruby/regexp /^rb_obj_taintable$/i
|
24
|
+
- !ruby/regexp /^rb_obj_tainted$/i
|
25
|
+
- !ruby/regexp /^rb_obj_tainted_raw$/i
|
26
|
+
- !ruby/regexp /^rb_scan_args_length_mismatch$/i
|
27
|
+
- !ruby/regexp /^rb_varargs_bad_length$/i
|
28
|
+
|
29
|
+
# internal functions in ruby.h
|
30
|
+
- rb_scan_args_bad_format
|
31
|
+
|
32
|
+
# internal macros
|
33
|
+
- !ruby/regexp /^rb_define_global_function_(m?[0-9]+|notimpl)$/i
|
34
|
+
- !ruby/regexp /^rb_define_method_(m?[0-9]+|notimpl)$/i
|
35
|
+
- !ruby/regexp /^rb_define_method_id_(m?[0-9]+|notimpl)$/i
|
36
|
+
- !ruby/regexp /^rb_define_module_function_(m?[0-9]+|notimpl)$/i
|
37
|
+
- !ruby/regexp /^rb_define_private_method_(m?[0-9]+|notimpl)$/i
|
38
|
+
- !ruby/regexp /^rb_define_protected_method_(m?[0-9]+|notimpl)$/i
|
39
|
+
- !ruby/regexp /^rb_define_singleton_method_(m?[0-9]+|notimpl)$/i
|
40
|
+
|
41
|
+
# FIXME: Both `rb_hash` and `rb_Hash` are defined in ruby.h
|
42
|
+
# Converting to Go function names would result in both being `RbHash`
|
43
|
+
# Exclude one of the function names because duplicate function names will result in an error.
|
44
|
+
- rb_Hash
|
45
|
+
|
46
|
+
# Available only in certain platform
|
47
|
+
- !ruby/regexp /^rb_w32_/i
|
48
|
+
|
49
|
+
# FIXME: Workaround for "could not determine kind of name for C.rb_gc_unprotect_logging"
|
50
|
+
- rb_gc_unprotect_logging
|
51
|
+
|
52
|
+
# FIXME: Workaround for "could not determine kind of name for C.rb_iterate_deprecated"
|
53
|
+
- rb_iterate_deprecated
|
54
|
+
|
55
|
+
# FIXME: Workaround for "could not determine kind of name for C.rb_gc_guarded_ptr_val"
|
56
|
+
- rb_gc_guarded_ptr_val
|
57
|
+
|
58
|
+
# FIXME: Workaround for "cannot use _cgo2 (variable of type _Ctype_va_list) as *_Ctype_struct___va_list_tag value in argument to _Cfunc_rb_str_vcatf" on GitHub Actions (Ubuntu 22.04)
|
59
|
+
- rb_str_vcatf
|
60
|
+
|
61
|
+
# FIXME: Workaround for "cannot use _cgo4 (variable of type _Ctype_va_list) as *_Ctype_struct___va_list_tag value in argument to _Cfunc_rb_vrescue2" on GitHub Actions (Ubuntu 22.04)
|
62
|
+
- rb_vrescue2
|
63
|
+
|
64
|
+
# FIXME: Workaround for "cannot use _cgo1 (variable of type _Ctype_va_list) as *_Ctype_struct___va_list_tag value in argument to _Cfunc_rb_vsprintf" on GitHub Actions (Ubuntu 22.04)
|
65
|
+
- rb_vsprintf
|
66
|
+
|
67
|
+
# FIXME: Workaround for "undefined reference to `rb_class_descendants'" on GitHub Actions (Ubuntu 22.04)
|
68
|
+
- rb_class_descendants
|
69
|
+
|
70
|
+
pointer_hint:
|
71
|
+
RSTRING_PTR:
|
72
|
+
self: raw
|
73
|
+
rb_data_object_make:
|
74
|
+
4: sref
|
75
|
+
rb_data_typed_object_make:
|
76
|
+
3: sref
|
77
|
+
rb_define_global_function:
|
78
|
+
2: function
|
79
|
+
rb_define_method:
|
80
|
+
3: function
|
81
|
+
rb_define_method_id:
|
82
|
+
3: function
|
83
|
+
rb_define_module_function:
|
84
|
+
3: function
|
85
|
+
rb_define_private_method:
|
86
|
+
3: function
|
87
|
+
rb_define_protected_method:
|
88
|
+
3: function
|
89
|
+
rb_define_singleton_method:
|
90
|
+
3: function
|
91
|
+
rb_define_variable:
|
92
|
+
2: in_ref
|
93
|
+
rb_ensure:
|
94
|
+
1: function
|
95
|
+
3: function
|
96
|
+
rb_exec_recursive:
|
97
|
+
1: function
|
98
|
+
rb_exec_recursive_outer:
|
99
|
+
1: function
|
100
|
+
rb_exec_recursive_paired:
|
101
|
+
1: function
|
102
|
+
rb_exec_recursive_paired_outer:
|
103
|
+
1: function
|
104
|
+
rb_feature_provided:
|
105
|
+
2: sref
|
106
|
+
rb_find_file_ext:
|
107
|
+
2: str_array
|
108
|
+
rb_funcallv:
|
109
|
+
4: array
|
110
|
+
rb_funcallv_public:
|
111
|
+
4: array
|
112
|
+
rb_get_values_at:
|
113
|
+
5: function
|
114
|
+
rb_glob:
|
115
|
+
2: function
|
116
|
+
rb_hash_foreach:
|
117
|
+
2: function
|
118
|
+
rb_ivar_foreach:
|
119
|
+
2: function
|
120
|
+
rb_marshal_define_compat:
|
121
|
+
3: function
|
122
|
+
4: function
|
123
|
+
rb_mutex_synchronize:
|
124
|
+
2: function
|
125
|
+
rb_protect:
|
126
|
+
1: function
|
127
|
+
rb_rescue:
|
128
|
+
1: function
|
129
|
+
3: function
|
130
|
+
rb_scan_args_set:
|
131
|
+
10: ref_array
|
132
|
+
rb_set_end_proc:
|
133
|
+
1: function
|
134
|
+
rb_st_insert2:
|
135
|
+
4: function
|
136
|
+
rb_thread_call_with_gvl:
|
137
|
+
1: function
|
138
|
+
rb_thread_create:
|
139
|
+
1: function
|
140
|
+
rb_vrescue2:
|
141
|
+
1: function
|
142
|
+
3: function
|
143
|
+
|
144
|
+
struct:
|
145
|
+
include_name:
|
146
|
+
- !ruby/regexp /^rb_/i
|
147
|
+
- re_registers
|
148
|
+
|
149
|
+
exclude_name:
|
150
|
+
- rb_data_type_struct
|
151
|
+
|
152
|
+
type:
|
153
|
+
include_name:
|
154
|
+
- !ruby/regexp /^rb_/i
|
155
|
+
- !ruby/regexp /^st_/i
|
156
|
+
- ID
|
157
|
+
- VALUE
|
158
|
+
- regex_t
|
159
|
+
- OnigPosition
|
160
|
+
- pid_t
|
161
|
+
- off_t
|
162
|
+
|
163
|
+
exclude_name: []
|
164
|
+
|
165
|
+
enum:
|
166
|
+
include_name:
|
167
|
+
- ruby_value_type
|
168
|
+
- rb_io_wait_readwrite
|
169
|
+
|
170
|
+
exclude_name: []
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyHeaderParser
|
4
|
+
# argument definition for {RubyHeaderParser::FunctionDefinition}
|
5
|
+
class ArgumentDefinition
|
6
|
+
# @!attribute type
|
7
|
+
# @return [String]
|
8
|
+
attr_accessor :type
|
9
|
+
|
10
|
+
# @!attribute name
|
11
|
+
# @return [String]
|
12
|
+
attr_accessor :name
|
13
|
+
|
14
|
+
# @!attribute pointer
|
15
|
+
# @return [Symbol,nil] :ref, :array
|
16
|
+
attr_accessor :pointer
|
17
|
+
|
18
|
+
# @!attribute length
|
19
|
+
# @return [Integer]
|
20
|
+
attr_accessor :length
|
21
|
+
|
22
|
+
# @param type [String]
|
23
|
+
# @param name [String]
|
24
|
+
# @param pointer [Symbol,nil] :ref, :array
|
25
|
+
# @param length [String]
|
26
|
+
def initialize(type:, name:, pointer: nil, length: 0)
|
27
|
+
@type = type
|
28
|
+
@name = name
|
29
|
+
@pointer = pointer
|
30
|
+
@length = length
|
31
|
+
end
|
32
|
+
|
33
|
+
# @param other [ArgumentDefinition]
|
34
|
+
# @return [Boolean]
|
35
|
+
def ==(other)
|
36
|
+
other.is_a?(ArgumentDefinition) && type == other.type && name == other.name && pointer == other.pointer &&
|
37
|
+
length == other.length
|
38
|
+
end
|
39
|
+
|
40
|
+
# @return [Boolean]
|
41
|
+
def pointer?
|
42
|
+
!!pointer
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyHeaderParser
|
4
|
+
# Manager for config file
|
5
|
+
class Config
|
6
|
+
# @!attribute [r] data
|
7
|
+
# @return [Hash]
|
8
|
+
attr_reader :data
|
9
|
+
|
10
|
+
# @param config_file [String]
|
11
|
+
#
|
12
|
+
# @note See [CONFIG.md](../file.CONFIG.html) for config file details
|
13
|
+
def initialize(config_file)
|
14
|
+
yaml = File.read(config_file)
|
15
|
+
@data = YAML.safe_load(yaml, aliases: true, permitted_classes: [Regexp])
|
16
|
+
end
|
17
|
+
|
18
|
+
# @param function_name [String]
|
19
|
+
# @param pos [Integer] arg position (1 origin)
|
20
|
+
# @return [Symbol] :ref, :array, :ref_array, :function, :sref, :str_array, :in_ref
|
21
|
+
def function_arg_pointer_hint(function_name:, pos:)
|
22
|
+
pointer_hint = data["function"]["pointer_hint"].dig(function_name, pos)
|
23
|
+
return pointer_hint.to_sym if pointer_hint
|
24
|
+
|
25
|
+
:ref
|
26
|
+
end
|
27
|
+
|
28
|
+
# @param function_name [String]
|
29
|
+
# @return [Symbol] :ref, :raw
|
30
|
+
def function_self_pointer_hint(function_name)
|
31
|
+
pointer_hint = data["function"]["pointer_hint"].dig(function_name, "self")
|
32
|
+
return pointer_hint.to_sym if pointer_hint
|
33
|
+
|
34
|
+
:ref
|
35
|
+
end
|
36
|
+
|
37
|
+
# rubocop:disable Style/CaseEquality
|
38
|
+
|
39
|
+
# Whether generate C function to go
|
40
|
+
# @param function_name [String]
|
41
|
+
# @return [Boolean]
|
42
|
+
def should_generate_function?(function_name)
|
43
|
+
return false if data["function"]["exclude_name"].any? { |format| format === function_name }
|
44
|
+
|
45
|
+
data["function"]["include_name"].any? { |format| format === function_name }
|
46
|
+
end
|
47
|
+
|
48
|
+
# Whether generate C struct to go
|
49
|
+
# @param struct_name [String]
|
50
|
+
# @return [Boolean]
|
51
|
+
def should_generate_struct?(struct_name)
|
52
|
+
return false if data["struct"]["exclude_name"].any? { |format| format === struct_name }
|
53
|
+
|
54
|
+
data["struct"]["include_name"].any? { |format| format === struct_name }
|
55
|
+
end
|
56
|
+
|
57
|
+
# Whether generate C type to go
|
58
|
+
# @param type_name [String]
|
59
|
+
# @return [Boolean]
|
60
|
+
def should_generate_type?(type_name)
|
61
|
+
return false if data["type"]["exclude_name"].any? { |format| format === type_name }
|
62
|
+
|
63
|
+
data["type"]["include_name"].any? { |format| format === type_name }
|
64
|
+
end
|
65
|
+
|
66
|
+
# Whether generate C enum to go
|
67
|
+
# @param enum_name [String]
|
68
|
+
# @return [Boolean]
|
69
|
+
def should_generate_enum?(enum_name)
|
70
|
+
return false if data["enum"]["exclude_name"].any? { |format| format === enum_name }
|
71
|
+
|
72
|
+
data["enum"]["include_name"].any? { |format| format === enum_name }
|
73
|
+
end
|
74
|
+
|
75
|
+
# rubocop:enable Style/CaseEquality
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyHeaderParser
|
4
|
+
# enum definition in header file
|
5
|
+
class EnumDefinition
|
6
|
+
# @!attribute name
|
7
|
+
# @return [String]
|
8
|
+
attr_accessor :name
|
9
|
+
|
10
|
+
# @!attribute enum_value_definitions
|
11
|
+
# @return [Array<String>]
|
12
|
+
attr_accessor :values
|
13
|
+
|
14
|
+
# @param name [String]
|
15
|
+
# @param values [Array<String>]
|
16
|
+
def initialize(name:, values: [])
|
17
|
+
@name = name
|
18
|
+
@values = values
|
19
|
+
end
|
20
|
+
|
21
|
+
# @param other [EnumDefinition]
|
22
|
+
# @return [Boolean]
|
23
|
+
def ==(other)
|
24
|
+
other.is_a?(EnumDefinition) && name == other.name && values == other.values
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|