stm32f1/usb_cables.rb

65 lines
2.0 KiB
Ruby
Executable File

#!/usr/bin/env ruby
# encoding: utf-8
# ruby 2.6.5
=begin
generates USB cables definitions
in usb_cables.c define USB cable template as follows:
static const uint8_t usb__a_host__b__abpower_pins[][2] = {
{usb_a_host_pins[1], usb_b_device_pins[1]}, // VBUS
{usb_a_host_pins[4], usb_b_device_pins[4]}, // GND
};
any following variable declarations like
static const uint8_t usb__a_device__b__abpower_pins[][2]
will copy the array content from the first declaration and replace a_host with a_device and b with b
this modified C file will be written to the path provided as argument
=end
class String
# This method will return an array of MatchData's rather than the
# array of strings returned by the vanilla `scan`.
def match_all(regex)
match_str = self
match_datas = []
while match_str.length > 0 do
md = match_str.match(regex)
break unless md
match_datas << md
match_str = md.post_match
end
return match_datas
end
end
# variable to process regexp
cable_regex = /static const uint8_t (?<variable>usb__(?<connector1>\w+)__(?<connector2>\w+)__(?<name>\w+)_(?<type>pins|opts))\[\]\[2\] = (?<array>\{[^;]+\});/m
# read C definitions file
usb_cables_text = IO.read("usb_cables.c")
output_text = usb_cables_text.dup
# get all variables to process
cables = usb_cables_text.match_all(cable_regex)
# go through variables
cables.each_index do |i|
next if 0 == i
cable = cables[i]
# find if there was a previously matching definition
template = cables[0, i].filter {|c| c[:name] == cable[:name] and c[:type] == cable[:type]}.first
next unless template
puts "generate #{cable[:variable]} usng #{template[:variable]}"
array = template[:array]
array.gsub!(template[:connector1], cable[:connector1])
array.gsub!(template[:connector2], cable[:connector2])
generated = cable[0]
generated.gsub!(cable[:array], array)
puts generated
puts
output_text.gsub!(cable[0], generated)
end
if ARGV[0] then
puts "saving to #{ARGV[0]}"
File.open(ARGV[0], "w") {|f| f.write output_text}
end