# = system.rb
#
# == Copyright (c) 2005 Thomas Sawyer, Minero Aoki
#
#   Ruby License
#
#   This module is free software. You may use, modify, and/or redistribute this
#   software under the same terms as Ruby.
#
#   This program is distributed in the hope that it will be useful, but WITHOUT
#   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
#   FOR A PARTICULAR PURPOSE.
#
# == Special Thanks
#
# Adapted from RubyParams module by Minero Aoki
# Copyright (c) 1999-2002 Minero Aoki <aamine@loveruby.net>
#
# == Author(s)
#
# * Thomas Sawyer
# * Minero Aoki

# Author::    Thomas Sawyer, Minero Aoki
# Copyright:: Copyright (c) 2005 Thomas Sawyer, Minero Aoki
# License::   Ruby License

require 'rbconfig'

# = System
#
# The System module provides Platform and Ruby system information.
# The module should also be able to stand in for rbconfig.
# It is intended for use as a service module although it
# can be mixed-in too.

module System

  extend self

  # Execution Environment -------------------------------------

  def program_name; $0 ; end
  def program_name=(x); $0=x ; end

  def argv; $* ; end
  alias options argv

  # these won't work here
  #def file; __FILE__ ; end
  #def filepath; File.expand_path(__FILE__) ; end
  #def lineno; __LINE__ ; end

  def process_id; $$ ; end
  alias_method :pid, :process_id

  def child_status; $? ; end
  alias exit_status child_status

  def error_info; $! ; end
  def error_position; $@ ; end 

  def debug; $DEBUG; end

  def safe; $SAFE; end

  def verbose; $VERBOSE; end
  def verbose=(x); $VERBOSE=x; end

  def coding; $-K ; end
  def coding=(x); $-K=x ; end

  def line_end_processing; $-l ; end

  def program_loop; $-p ; end

  def environment; ENV ; end
  def env; ENV ; end

  # Input/Ouput Variables -------------------------------------

  def stdin; $stdin ; end
  def stdin=(x); $stdin=x ; end

  def stdout ; $stdout ; end
  def stdout=(x); $stdout=x ; end

  def stderr ; $stderr ; end
  def stderr=(x); $stderr=x ; end

  def default_input ; $< ; end
  alias_method :defin, :default_input
  alias_method :argf, :default_input

  def default_output ; $> ; end
  def default_output=(x); $defout=x ; end
  alias_method :defout, :default_output
  alias_method :defout=, :default_output=

  def output_record_separator ; $\ ; end
  def output_record_separator=(x) ; $\=x ; end
  alias_method :ors, :output_record_separator
  alias_method :ors=, :output_record_separator=

  def output_field_separator ; $-F ; end
  def output_field_separator=(x) ; $-F=x ; end
  alias_method :ofs, :output_field_separator
  alias_method :ofs=, :output_field_separator=

  def input_record_separator ; $/ ; end
  def input_record_separator=(x) ; $/=x ; end
  alias_method :rs, :input_record_separator
  alias_method :rs=, :input_record_separator=

  def input_field_separator ; $/ ; end
  def input_field_separator=(x) ; $/=x ; end
  alias_method :fs, :input_field_separator
  alias_method :fs=, :input_field_separator=

  def input_line_number ; $. ; end
  alias_method :input_lineno, :input_line_number

  # Miscellaneous ---------------------------------------------

  def data; DATA ; end

  # Ruby Config -----------------------------------------------

  ::Config::CONFIG.each do |k,v|
    define_method( k.downcase ) { v }
  end

  alias_method :ruby, :ruby_install_name

  def rubypath
    File.join( bindir, ruby_install_name )
  end

  def platform
    RUBY_PLATFORM
  end

  def version
    RUBY_VERSION
  end

  def release
    RUBY_RELEASE_DATE
  end

  def extentions
    [ 'rb', DLEXT ]
  end

  def rubylibdir
    File.join( libdir, 'ruby'  )
  end

  #def sitelibdir
  #  File.join( rubylibdir, 'site_ruby', version )
  #end
  #
  #STDLIBDIR  = File.join( LIBDIR, VERSION )
  #RBDIR      = File.join( STDLIBDIR )
  #SODIR      = File.join( STDLIBDIR, ARCH )
  #
  #SITE_RB    = File.join( SITELIBDIR )
  #SITE_SO    = File.join( SITELIBDIR, ARCH )

  # load path ----------------------------------------------------

  def load_path; $: ; end

  def loaded_features; $" ; end
  alias_method :required, :loaded_features

end
