class Labels def initialize argv @savefile = '/dev/stdout' @files = [] for arg in argv case arg when /^-o:?/ then @savefile = $' when /^-/ then $stderr.puts "unknown option #{arg}" else @files.push arg end end raise "usage: #{$0} input output" if @files.empty? @nfstack = [] @labels = {} end def marksec level if level > @nfstack.size raise "heading out of sequence" end if @nfstack.size > level @nfstack = @nfstack[0, level + 1] end @nfstack[level] = 0 unless @nfstack[level] @nfstack[level] += 1 $stderr.puts "section #{sec_name}" if $VERBOSE end def sec_name @nfstack.join('.') end def setlabel label @labels[label] = sec_name end def so file File.open(file, 'r') {|fp| for line in fp case line when /^\.\s*NH\s+(\d+)/ then marksec($1.to_i - 1) when /^\.\s*LB\s+(\w+)/ then setlabel $1 when /^\.\s*so\s+(\S+)/ then so $1 end end } rescue Errno::ENOENT $stderr.puts "file #{file} not found" end def save File.open(@savefile, 'w') {|fp| for label in @labels.keys.sort fp.puts ".ds S#{label} #{@labels[label]}" end } end def run @files.each {|file| so file} save end end Labels.new(ARGV).run