if __FILE__ == $0
  # invoked as an exectuable
  ARGV.each do |file|
    source = File.read(file)
    
    # save the shebang (if there is one)
    shebang = nil
    source.sub /^(\#!.*?)\n/ do |m| shebang = m; "" end

    # convert the remaining text to whitespace; a given line will
    # contain n spaces, where n is the ASCII code of the character
    # that line represents tabs (\t) are used to represent 16 spaces
    
    result = source.split(//).collect do |char|
      ascii = char[0]

      "\t" * (ascii / 16) + " " * (ascii % 16)
    end.join "\n"

    result = "require 'whiteout'\n" + result
    File.open file, "w" do |f| f.write result end
  end
else
  # required as a library
  
  source = File.read $PROGRAM_NAME

  source.sub! /^.*?require 'whiteout'\n/, ""

  result = source.split(/\n/).collect do |line|
    ascii = 0
    line.each_byte do |c|
      if c.chr == "\t"
        ascii += 16
      elsif c.chr == " "
        ascii += 1
      else
        raise "invalid input: #{c.chr}"
      end
    end

    ascii.chr
  end.join ""

  eval result
end


On 6/5/05, Dave Burt <dave / burt.id.au> wrote:
> "Robin Stocker" <robin-lists-ruby-talk / nibor.org> solved:
> > Here's my solution for Ruby Quiz #34. It's my first one :)
> 
> Welcome to Ruby Quiz, Robin!
> 
> Here's my solution, which is basically the same as Robin's. I must cite
> NegaPosi by SASADA Koichi for inspiration.
> 
> http://www.dave.burt.id.au/ruby/whiteout.rb
> 
> Known bug: "__END__" doesn't work in an eval'd string. No solution
> anticipated. NegaPosi has this problem too.
> 
> Also, my Whiteout doesn't try and detect whether the given file is a valid
> whiteout file or not, so you'll get a syntax error if you "require
> 'whiteout'" with anything else other that a shebang and whitespace in the
> file.
> 
> There's an interesting hack at the eval end of my script to make "if $0 ==
> __FILE__" blocks work:
>   eval "$0 = __FILE__; #{ Whiteout.decode(File.read($0)) }"
> 
> Cheers,
> Dave
> 
> 
> 
> 


-- 
Bill Atkins