# ohcount.rb written by Mitchell Foral. mitchell<att>caladbolg.net.
# See COPYING for license information.
# Ohcount module tweaked for use by Ohloh.

$: << File.expand_path(File.dirname(__FILE__))
$: << "#{File.expand_path(File.dirname(__FILE__))}/#{`#{File.dirname(__FILE__)}/print_arch`.strip}"

require 'ohcount.so'

module Ohcount
  class SourceFile
    def file_location=(value) set_diskpath(value) end
    def file_location() diskpath() end
    def filenames=(value) set_filenames(value) end
    def polyglot() get_language() end

    def contents
      data = get_contents()
      data.force_encoding(Encoding.default_external)
    end

    def language_breakdowns
      list = get_parsed_language_list()
      return array_from_list(list, :pl)
    end

    def language_breakdown(language)
      return language_breakdowns().find { |lb| lb.name == language.to_s }
    end

    def licenses
      list = get_license_list()
      array = array_from_list(list, :lic)
      return array.map! { |l| l.name }
    end

    def languages
      return language_breakdowns().collect { |lb| lb.name }
    end

    def loc_list
      list = get_loc_list()
      return array_from_list(list, :loc)
    end

    def diff(to)
      list = _diff(to)
      ret = array_from_list(list, :delta)
      class << ret
        def loc_deltas() self end
      end
      return ret
    end

    def each
      filenames.each { |f| yield f }
    end

    private

    def array_from_list(list, method)
      array = Array.new
      iter = list.head
      while (iter)
        array << iter.send(method)
        iter = iter.next
      end
      return array
    end
  end

  class SourceFileList
    def each_source_file
      iter = self.head
      while (iter)
        yield iter.sf if iter.sf.polyglot
        iter = iter.next
      end
    end

		# this should yield each filename, not an sf object
		def each
      iter = self.head
      while (iter)
        yield iter.sf.filename if iter.sf
        iter = iter.next
      end
		end

    def size
      count = 0
      iter = self.head
      while (iter)
        count += 1
        iter = iter.next
      end
      return count
    end
  end

  class Detector
    def self.binary_filename?(filename)
      return Ohcount.ohcount_is_binary_filename(filename) == 1
    end
  end
end
