#!/usr/bin/env ruby -Ks # $Id: inspiration.rb,v 1.1 2002/01/10 03:11:01 sakamoto Exp $ class Inspiration attr_reader :nodes, :links class Node attr_reader :name, :link, :rlink, :filename def initialize(name, filename) @name = name @filename = filename @link = Array.new @rlink = Array.new end def add(link) if link.from == self @link.push link else @rlink.push link end end end class Link attr_reader :from, :to, :name, :filename def initialize(from, to, name, filename) @from = from @to = to @name = name @filename = filename @from.add(self) @to.add(self) end def set_name(name) @name = name end end def initialize @nodes = Array.new @links = Array.new end def add(insdata, filename = nil) @datas = Array.new before = nil d = Array.new insdata.each_byte do |byte| d.push byte if byte == 0xfe and before == 0xfe @datas.push d d = Array.new d.push 0xfe d.push 0xfe end before = byte end @datas.push d if $DEBUG @datas.each do |data| data.each do |d| printf "%02x ", d end puts end end @apple = (@datas[1][2] == 0x00) page = 0 nodesinpage = [@nodes.length] @datas.each do |data| page += 1 if data[@apple ? 3 : 2] == 0x15 next unless data[@apple ? 3 : 2] == 3 @nodes.push Node.new(get_string(data), filename) nodesinpage[page] ||= nodesinpage[page - 1] nodesinpage[page] += 1 end page = -1 @datas.each do |data| page += 1 if data[@apple ? 3 : 2] == 0x15 next unless data[@apple ? 3 : 2] == 5 and data[4] == 0x01 and data[5] == 0x00 if @apple from = (data[20] << 24) + (data[21] << 16) + (data[22] << 8) + (data[23] << 0) - 1 to = (data[28] << 24) + (data[29] << 16) + (data[30] << 8) + (data[31] << 0) - 1 else from = (data[23] << 24) + (data[22] << 16) + (data[21] << 8) + (data[20] << 0) - 1 to = (data[31] << 24) + (data[30] << 16) + (data[29] << 8) + (data[28] << 0) - 1 end fromnode = @nodes[from + nodesinpage[page]] if fromnode.nil? print "skip from: #{from} #{from + nodesinpage[page]}\n" next end tonode = @nodes[to + nodesinpage[page]] if tonode.nil? print "skip to: #{to} #{to + nodesinpage[page]}\n" next end @links.push Link.new(fromnode, tonode, get_string(data), filename) end end def get_string(data) flag = false string = "" before = nil data.each do |d| if d == 0xfe flag = false elsif flag and (d < 0x20 and d != 0x0d and d != 0x0a) string += "\n" if d == 0x16 or d == 0x00 flag = false end string += d.chr if flag if @apple if before == 0xfc and d == 0x19 flag = true end else if before == 0x19 and d == 0xfc flag = true end end before = d end return string end end if $0 == __FILE__ then data = Inspiration.new ARGV.each do |file| data.add File.open(file).read end data.nodes.each_index do |n| print n, ": ", data.nodes[n].name, "\n" end data.links.each do |link| print link.from.name, " -> ", link.to.name, " [", link.name, "]\n" end end