#!/usr/pkg/bin/ruby33
# frozen_string_literal: true

#
# Copyright (c) 2007-2017 Minero Aoki, Kenshi Muto
#               1999-2007 Minero Aoki
#
# This program is free software.
# You can distribute or modify this program under the terms of
# the GNU LGPL, Lesser General Public License version 2.1.
# For details of the GNU LGPL, see the file "COPYING".
#

$LOAD_PATH.unshift(File.realpath('../lib', __dir__))

PREDEF_FILE = 'PREDEF'

def main
  @provided = parse_predefined
  @unprovided = {}
  ARGF.each do |line|
    case line
    when /\A\#@require\((.*)\)/
      kw = $1
      unless @provided.key?(kw)
        puts "#{location}: not provided: #{kw}"
        @unprovided[kw] = location
      end
    when /\A\#@provide\((.*)\)/
      provide($1)
    else
      line.scan(/@<kw>\{(.*?)[,}]/) { provide($1) }
    end
  end
end

def provide(kw)
  @provided[kw] ||= location
  if @unprovided[kw]
    reqpos = @unprovided.delete(kw)
    puts "#{location}: provided now: #{kw} (#{reqpos})"
  end
end

def parse_predefined
  result = {}
  File.foreach(PREDEF_FILE) { |line| result[line.strip] = '(predefined)' }
  result
rescue Errno::ENOENT
  return {}
end

def location
  "#{ARGF.filename}:#{ARGF.file.lineno}"
end

main
