#!/usr/bin/env ruby require "common.rb" # Generate string -> offset lookup tables for each executable. def load_string_lookups(exe_files) string_lookups = [] CONFIGS.each_with_index do |config, i| strings = find_strings(exe_files[i], config) string_lookups.push(strings) end string_lookups end # Load list of "good" strings. def load_good_strings(filename) File.readlines(filename).map do |string| JSON::load("["+ string.chomp + "]")[0] end end # Look up a string's offset, removing it from the specified lookup table. # This is done because a string can appear multiple times at different offsets. def lookup_string(lookup_table, string) lookup_table.each_with_index do |entry, i| if entry[1] == string lookup_table.delete_at(i) return entry[0] end end nil end # Find offsets for the specified string. def get_string_offsets(string, string_lookups) string_lookups.map do |lookup| offset = lookup_string(lookup, string) if offset != nil offset else 0 end end end def format_offsets(offsets) formatted_offsets = offsets.map do |offset| sprintf("%5i", offset) end "{ " + formatted_offsets.join(", ") + " }" end # Print strings left over in the specified lookup table # that were not in the good strings list. def print_unused_strings(name, strings) unused_offsets = strings.map do |entry| entry[0] end puts "static int #{name} = {" numbers = 0 for offset in unused_offsets.sort print " " if numbers == 0 printf "%5i, ", offset numbers += 1 if numbers >= 8 print "\n" numbers = 0 end end if numbers > 0 print "\n" end puts "};" puts end string_lookups = load_string_lookups(ARGV) good_strings = load_good_strings("good-strings.txt") # Output list of supported strings with their offset for each version puts "static HHEString strings[] = {" for string in good_strings offsets = get_string_offsets(string, string_lookups) print " { " + format_offsets(offsets) + ", " # print "\n " print string.to_json + " },\n" end puts "};" puts # Output strings that appear in HHE but are not supported (ie. in good_strings) CONFIGS.each_with_index do |config, i| name = "unused_strings_#{config::SUFFIX}" print_unused_strings(name, string_lookups[i]) end