cast-to-yaml 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2e8524dd3e090d0b7183a64d0211cb576e323335ef7f74c796bf9b782d6878d0
4
+ data.tar.gz: 6d477343c3f14724045a5630f755a6f00b67a0b30c2fcd5056ecda1b3fa6db26
5
+ SHA512:
6
+ metadata.gz: c285dfe327f870bf4d5d9da514f9211784dbc3d613fb6e3fe5fbc3443bfcf02426925df7fceb670ea2e40adc7447fba126e8a72daad88d2e1b524467628cc758
7
+ data.tar.gz: e9fb38a6ea74eb661e681f3d5282898cbba31b244db2b8530d1069ff09e657ed69b29f6fe910ceee38e474b9067c48518b99d1c35378f0296d5d6a69bb2accfc
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2019 alcf-perfengr
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 all
13
+ 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 THE
21
+ SOFTWARE.
@@ -0,0 +1,13 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'cast-to-yaml'
3
+ s.version = "0.1.0"
4
+ s.author = "Brice Videau"
5
+ s.email = "bvideau@anl.gov"
6
+ s.homepage = "https://github.com/alcf-perfengr/cast-to-yaml"
7
+ s.summary = "Extract information fom a c ast"
8
+ s.files = Dir[ 'cast-to-yaml.gemspec', 'LICENSE', 'lib/**/*.rb' ]
9
+ s.has_rdoc = false
10
+ s.license = 'MIT'
11
+ s.required_ruby_version = '>= 2.3.0'
12
+ s.add_dependency 'cast', '~> 0.3', '>=0.3.0'
13
+ end
@@ -0,0 +1,2 @@
1
+ require 'cast'
2
+ require_relative 'cast-to-yaml/to_yaml'
@@ -0,0 +1,268 @@
1
+ module C
2
+
3
+ class Declarator
4
+ def to_h(declaration)
5
+ res = {}
6
+ res["name"] = name.dup
7
+ res["type"] = if indirect_type
8
+ indirect_type.to_h(declaration)
9
+ else
10
+ declaration.type.to_h
11
+ end
12
+ if init
13
+ res["init"] = init.to_s
14
+ end
15
+ if num_bits
16
+ res["num_bits"] = num_bits.to_s
17
+ end
18
+ res
19
+ end
20
+ end
21
+
22
+ class Declaration
23
+
24
+ def to_a
25
+ declarators.collect { |d|
26
+ d.to_h(self)
27
+ }
28
+ end
29
+
30
+ def extract(res = Hash::new { |h, k| h[k] = [] })
31
+ if typedef?
32
+ declarators.each { |d|
33
+ res["typedefs"].push d.to_h(self)
34
+ }
35
+ else
36
+ declarators.each { |d|
37
+ if d.indirect_type && d.indirect_type.kind_of?(Function)
38
+ f = {}
39
+ f["name"] = d.name
40
+ if d.indirect_type.type
41
+ f["type"] = d.indirect_type.type.to_h(self)
42
+ else
43
+ f["type"] = type.to_h(self)
44
+ end
45
+ if d.indirect_type.params
46
+ f["params"] = d.indirect_type.params.collect { |p| p.to_h }
47
+ end
48
+
49
+ res["functions"].push f
50
+ else
51
+ res["declarations"].push d.to_h(self)
52
+ end
53
+ }
54
+ end
55
+ if type.kind_of?(Struct) && type.members && type.name
56
+ s = {}
57
+ s["name"] = type.name
58
+ m = []
59
+ type.members.each { |mem|
60
+ m += mem.to_a
61
+ }
62
+ s["members"] = m
63
+ res["structs"].push s
64
+ elsif type.kind_of?(Enum) && type.members && type.name
65
+ s = {}
66
+ s["name"] = type.name
67
+ m = []
68
+ type.members.each { |mem|
69
+ m.push mem.to_h
70
+ }
71
+ s["members"] = m
72
+ res["enums"].push s
73
+ elsif type.kind_of?(Union) && type.members && type.name
74
+ s = {}
75
+ s["name"] = type.name
76
+ m = []
77
+ type.members.each { |mem|
78
+ m += mem.to_a
79
+ }
80
+ s["members"] = m
81
+ res["unions"].push s
82
+ end
83
+ res
84
+ end
85
+ end
86
+
87
+ class TranslationUnit
88
+ def extract_declarations(res = Hash::new { |h, k| h[k] = [] })
89
+ entities.select { |e|
90
+ e.kind_of? Declaration
91
+ }.each { |e|
92
+ e.extract(res)
93
+ }
94
+ res
95
+ end
96
+ end
97
+
98
+ int_longnesses = ['short ', '', 'long ', 'long long ']
99
+ float_longnesses = ['float', 'double', 'long double']
100
+ ## DirectTypes
101
+ class Struct
102
+ def to_h
103
+ res = {}
104
+ res["kind"] = "struct"
105
+ if name
106
+ res["name"] = name
107
+ else
108
+ m = []
109
+ members.each { |mem|
110
+ m += mem.to_a
111
+ }
112
+ res["members"] = m
113
+ end
114
+ res["const"] = true if const?
115
+ res["restrict"] = true if restrict?
116
+ res["volatile"] = true if volatile?
117
+ res
118
+ end
119
+ end
120
+
121
+ class Union
122
+ def to_h
123
+ res = {}
124
+ res["kind"] = "union"
125
+ if name
126
+ res["name"] = name
127
+ else
128
+ m = []
129
+ members.each { |mem|
130
+ m += mem.to_a
131
+ }
132
+ res["members"] = m
133
+ end
134
+ res["const"] = true if const?
135
+ res["restrict"] = true if restrict?
136
+ res["volatile"] = true if volatile?
137
+ res
138
+ end
139
+ end
140
+
141
+ class Enum
142
+ def to_h
143
+ res = {}
144
+ res["kind"] = "enum"
145
+ if name
146
+ res["name"] = name
147
+ else
148
+ m = []
149
+ members.each { |mem|
150
+ m.push mem.to_h
151
+ }
152
+ res["members"] = m
153
+ end
154
+ res["const"] = true if const?
155
+ res["restrict"] = true if restrict?
156
+ res["volatile"] = true if volatile?
157
+ res
158
+ end
159
+ end
160
+
161
+ class Enumerator
162
+ def to_h
163
+ res = {}
164
+ res["name"] = name
165
+ if val
166
+ res["val"] = val.to_s
167
+ end
168
+ res
169
+ end
170
+ end
171
+
172
+ [
173
+ [CustomType, proc{name.dup }],
174
+ [Void , proc{'void' }],
175
+ [Int , proc do
176
+ longness_str = int_longnesses[longness+1].dup
177
+ "#{unsigned? ? 'unsigned ' : ''}#{longness_str}int"
178
+ end],
179
+ [Float , proc{float_longnesses[longness].dup}],
180
+ [Char , proc{"#{unsigned? ? 'unsigned ' : signed? ? 'signed ' : ''}char"}],
181
+ [Bool , proc{"_Bool" }],
182
+ [Complex , proc{"_Complex #{float_longnesses[longness]}"}],
183
+ [Imaginary , proc{"_Imaginary #{float_longnesses[longness]}"}]
184
+ ].each do |c, x|
185
+ c.send(:define_method, :to_h) do |_ = nil|
186
+ res = {}
187
+ if self.kind_of? CustomType
188
+ res["kind"] = "custom_type"
189
+ else
190
+ res["kind"] = "#{self.class.name.split('::').last}".downcase
191
+ end
192
+ res["name"] = instance_eval(&x)
193
+ res["const"] = true if const?
194
+ res["restrict"] = true if restrict?
195
+ res["volatile"] = true if volatile?
196
+ res
197
+ end
198
+ end
199
+
200
+ ## IndirectTypes
201
+ class Pointer
202
+ def to_h(declaration = nil)
203
+ res = {}
204
+ res["kind"] = "pointer"
205
+ res["const"] = true if const?
206
+ res["restrict"] = true if restrict?
207
+ res["volatile"] = true if volatile?
208
+ if type
209
+ if declaration
210
+ res["type"] = type.to_h(declaration)
211
+ else
212
+ res["type"] = type.to_h
213
+ end
214
+ else
215
+ res["type"] = declaration.type.to_h
216
+ end
217
+ res
218
+ end
219
+ end
220
+ class Array
221
+ def to_h(declaration = nil)
222
+ res = {}
223
+ res["kind"] = "array"
224
+ if type
225
+ if declaration
226
+ res["type"] = type.to_h(declaration)
227
+ else
228
+ res["type"] = type.to_h
229
+ end
230
+ else
231
+ res["type"] = declaration.type.to_h
232
+ end
233
+ if length
234
+ res["length"] = length.to_s
235
+ end
236
+ res
237
+ end
238
+ end
239
+ class Function
240
+ def to_h(declaration, no_types=false)
241
+ res = {}
242
+ res["kind"] = "function"
243
+ if type
244
+ res["type"] = type.to_h(declaration)
245
+ else
246
+ res["type"] = declaration.type.to_h
247
+ end
248
+ if !params.nil?
249
+ res["params"] = if no_types
250
+ params.collect{|p| p.name }
251
+ else
252
+ params.collect{|p| p.to_h }
253
+ end
254
+ end
255
+ res
256
+ end
257
+ end
258
+ class Parameter
259
+ def to_h
260
+ res = {}
261
+ res["name"] = name.to_s if name.to_s != ''
262
+ res["type"] = type.to_h
263
+ res["register"] = true if register?
264
+ res
265
+ end
266
+ end
267
+
268
+ end
metadata ADDED
@@ -0,0 +1,67 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cast-to-yaml
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Brice Videau
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-12-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: cast
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.3'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.3.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.3'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.3.0
33
+ description:
34
+ email: bvideau@anl.gov
35
+ executables: []
36
+ extensions: []
37
+ extra_rdoc_files: []
38
+ files:
39
+ - LICENSE
40
+ - cast-to-yaml.gemspec
41
+ - lib/cast-to-yaml.rb
42
+ - lib/cast-to-yaml/to_yaml.rb
43
+ homepage: https://github.com/alcf-perfengr/cast-to-yaml
44
+ licenses:
45
+ - MIT
46
+ metadata: {}
47
+ post_install_message:
48
+ rdoc_options: []
49
+ require_paths:
50
+ - lib
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: 2.3.0
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ requirements: []
62
+ rubyforge_project:
63
+ rubygems_version: 2.7.6.2
64
+ signing_key:
65
+ specification_version: 4
66
+ summary: Extract information fom a c ast
67
+ test_files: []