#
# $Id: defaulterrorhandler.icn,v 1.1 2003/08/04 17:35:05 jeffery Exp $
#
# This file is in the public domain.
#
# Author: Robert Parlett (parlett@dial.pipex.com)
#

package xml

#
# The default error handler prints errors to the given output file.
#
class DefaultErrorHandler : ErrorHandler(out_file, level)
   #
   # Set the output file
   #
   method set_out_file(x)
      return self.out_file := x
   end

   #
   # Set the level to use :-
   #
   # 0 - no output
   # 1 - fatal only
   # 2 - fatal + validity
   # 3 - fatal + validity + warning
   #
   # The default is 3
   #
   method set_level(n)
      self.level := n
   end

   method fatal_error(msg, stack)
      msg_impl(msg, stack, 1, "Fatal error")
   end

   method validity_error(msg, stack)
      msg_impl(msg, stack, 2, "Validity error")
   end

   method warning(msg, stack)
      msg_impl(msg, stack, 3, "Warning")
   end

   #
   # @p
   method msg_impl(msg, stack, n, pre)
      if level < n then
         return
      writes(out_file, pre , ": ", msg)
      if \stack then {
         write(out_file, " at:")
         show_stack(stack)
      }
   end

   method show_stack(stack)
      local x, i, t
      every x := !stack do {
         if \x.id then {
            t := x.subject[1:x.pos]
            i := 1
            every find("\n", t) do
               i +:= 1
            write(out_file, x.id || ": " || i)
         }
      }
   end

   initially()
      out_file := &output
      level := 3
end