summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/test.rb4
-rw-r--r--src/backend/uctags.rb106
2 files changed, 35 insertions, 75 deletions
diff --git a/src/backend/test.rb b/src/backend/test.rb
new file mode 100644
index 0000000..956ccca
--- /dev/null
+++ b/src/backend/test.rb
@@ -0,0 +1,4 @@
+require_relative './uctags.rb'
+
+pp FelBind::Backends::UCTags.parse('test.h')
+#pp FelBind::Backends::UCTags.parse('raylib.h')
diff --git a/src/backend/uctags.rb b/src/backend/uctags.rb
index 0cfa3ee..010773e 100644
--- a/src/backend/uctags.rb
+++ b/src/backend/uctags.rb
@@ -11,20 +11,37 @@ module FelBind
self[:CStructs] = {}
end
- def add_function(name:, ruby_name: , ruby_class:, param_as_self: '')
- #TODO
+ def add_function(name:, params:)
+ func = {}
+ self[:CFunctions][name] = func
+ func[:RubyName] = name
+ func[:Params] = {}
+ params.each do |param|
+ temp = param.rpartition(' ')
+ func[:Params][temp.last] = [temp.last, temp.first]
+ end
end
- def add_struct
- #TODO
+ def add_struct(name:)
+ self[:CStructs][name] = {}
end
- def add_typedef
- #TODO
+ def add_struct_param(struct_name:, param_name:, type:)
+ struct = self[:CStructs][struct_name]
+ struct[:Accessors] = []
+ struct[:Accessors].push [
+ param_name,
+ {
+ RubyName: param_name,
+ Type: type,
+ GetterSkip: false,
+ SetterSkip: false,
+ },
+ ]
end
- def add_struct_param
- #TODO
+ def add_typedef(typedef:, c_type:)
+ self[:Typedefs][typedef] = c_type
end
end
@@ -55,91 +72,30 @@ module FelBind
if tag["kind"] == "prototype"
# its a function
puts 'its a function' #TODO remove
+ intermediate.add_function(name: tag["name"], params: tag["signature"][1...-1].split(','))
elsif tag["kind"] == "typedef"
if tag["typeref"].split(':').first == "typename"
# is a typedef
puts 'its an alias(typedef)' #TODO remove
+ intermediate.add_typedef(typedef: tag["name"], c_type: tag["typeref"].split(':').last)
elsif tag["typeref"].split(':').first == "struct"
# is a struct
puts 'its a struct' #TODO remove
+ intermediate.add_struct(name: tag["name"])
else
puts "warning: no match" #TODO better errors
end
elsif tag['kind'] == 'member'
# is struct param
- puts 'its a param' #TODO remove
+ puts 'its a struct param' #TODO remove
+ intermediate.add_struct_param(struct_name: tag["scope"], param_name: tag["name"], type: tag["typeref"].split(":").last)
else
puts "warning: no match" #TODO better errors
end
end
+ return intermediate
end
-
-=begin
-def param_strip(signature)
- signature[1...-1].split(',')
- end
-
- def parse_header(path)
- parse = `ctags --output-format=json --c-kinds=pm --fields=+S --language-force=c #{path}`
- structs = {}
- functions = {}
- failed = []
- parse.each_line do |line|
- json_line = JSON.parse line
- if json_line['kind'] == 'prototype'
- functions["#{json_line['typeref'].sub(/^[^ ][^ ]* /,'')} #{json_line['name']}"] = param_strip(json_line['signature'])
- elsif json_line['kind'] == 'member'
- if json_line['scopeKind'] == 'struct'
- structs[json_line['scope']] ||= []
- structs[json_line['scope']].push "#{json_line['typeref'].delete_prefix('typename:')} #{json_line['name']}"
- else
- failed.push json_line
- end
- elsif json_line['kind'] == 'struct'
- structs[json_line['name']] = json_line
- else
- failed.push json_line
- end
- end
- [functions, structs, failed]
- end
-
-
- def debug_show(type, hash)
- puts "#{type.upcase}:"
- puts '---'
- hash.each do |key, params|
- puts "#{type.capitalize}: #{key}"
- params.each do |param|
- puts param
- end
- puts '---'
- end
- puts
- end
-
- def scan(file, destination)
- functions, structs, failed = parse_header(file)
- debug_show('functions', functions)
- debug_show('structs', structs)
-
- if !failed.empty?
- puts "-- Failed: --"
- pp failed
- puts
- end
-
- puts "Functions: #{functions.size}"
- puts "Structs: #{structs.size}"
- puts "Failed: #{failed.size}"
- puts
-
- result = [functions, structs]
-
- File.write(destination, JSON.generate(result))
- end
-=end
end
end
end