#!/usr/bin/env ruby def die(msg) STDERR.puts(msg) exit(1) end def parse_key(key) return key.to_i(16) if key[/^0x[0-9a-f]+/] key.to_i end die('Usage: ducky2bin [layout]') unless [2, 3].include?(ARGV.length) infile, outfile, layout = ARGV layout ||= 'us' code = `sparkling-ducky --compact -l "#{layout}" -i "#{infile}" | cpp -I.` line = code.split("\n")[-1] array = line.split(' = ')[1].tr('{};', '') keys = array.split(', ').map(&:strip) File.open(outfile, 'wb') do |f| keys.each { |k| f.putc(k.split('|').map { |s| parse_key(s) }.reduce(&:|)) } end