# Original Copyright (C) Rubikichi # Modified by TAKEUCHI Hitoshi # You can redistribute it and/or modify it under the terms of # the Ruby's licence.

module TMarshal

module_function
def dump(obj, port = nil)
  dumped = dump_text(obj)
  if port
    port.write dumped
  end
  dumped
end

def load(port)

# p port

  case port
  when String
    eval port.untaint
  when IO, StringIO
    eval port.read.untaint
  else
    raise 'Wrong type!'
  end
end

def restore(port)
  load(port)
end

def dump_text(obj)
  case obj
  when String
    obj.dump
  when Array
    "[\n"+obj.collect{|x| dump_text(x)+",\n"}.join+"]"
  when Hash
    "{\n"+obj.sort_by{|e| e[0].inspect}.collect{|k,v| "#{dump_text(k)} => #{dump_text(v)},\n"}.join+"}"
  when Numeric, Module, Regexp, Symbol, TrueClass, FalseClass, NilClass, Range
    obj.inspect
  when Time
    "Time.at(#{obj.to_i})"
  else
    raise 'Wrong type!'
  end
end

end

if __FILE__ == $0

puts TMarshal.dump({:age => 22, :lang => 'Ruby', :man => true, :day => Time.now})

end