#!/usr/bin/ruby class UUdecoder attr_accessor :skip_header def initialize @outfile = nil @finished = nil @skip_header = false end # returns true if you should pass the next line here def parse_line(l) l = l.chomp if not @outfile if l =~ /^begin \d\d\d (.*)/ puts "uudec: decoding #{$1.inspect}" file = $1.gsub(/[^a-zA-Z0-9_.+\-\[\]\(\)#'" ]/, '_') @outfile = File.open(file, 'w') @finished = false true end elsif @finished puts "uudec: should have found 'end' keyword" if l != 'end' puts "uudec: finished" if $VERBOSE @outfile.close @outfile = nil @finished = false false elsif @outfile unless l.empty? l = uudecode_line l @outfile.write l @finished = l.empty? end true end end def process_line(line) if line.empty? @skip_header = false elsif @skip_header # nop elsif not @outfile if line =~ /^begin \d\d\d (.*)/ file = $1.gsub(/[^a-zA-Z0-9_.+\-\[\]\(\)#'" ]/, '_') @outfile = File.open(file, 'w') @finished = false end elsif @finished puts "Should have found 'end' keyword" if line != 'end' @outfile.close @outfile = nil @finished = false else l = uudecode_line line @outfile.write l @finished = l.empty? end end def process_files(filelist) filelist.each { |f| @skip_header = true IO.foreach(f) { |l| process_line l.chomp } } end def uudec(c) (c - 32) & 0x3F end # this is horrible def uudecode_line(line) len = uudec line[0] a, b, c, d = nil line[1..-1].scan(/(.)(.)(.)(.)/).map { |a, b, c, d| [(uudec(a[0]) << 26) + (uudec(b[0]) << 20) + (uudec(c[0]) << 14) + (uudec(d[0]) << 8)].pack('N').chop! }.join[0, len] end end if $0 == __FILE__ uudec = UUdecoder.new if ARGV.empty? ARGF.each_line { |l| uudec.process_files(l.chomp.split(/\s+/)) } else uudec.process_files ARGV end end