(********************************************************************)
(*                                                                  *)
(*  logfile.s7i   Interface type describing log files.              *)
(*  Copyright (C) 1989 - 2018  Thomas Mertes                        *)
(*                                                                  *)
(*  This file is part of the Seed7 Runtime Library.                 *)
(*                                                                  *)
(*  The Seed7 Runtime Library is free software; you can             *)
(*  redistribute it and/or modify it under the terms of the GNU     *)
(*  Lesser General Public License as published by the Free Software *)
(*  Foundation; either version 2.1 of the License, or (at your      *)
(*  option) any later version.                                      *)
(*                                                                  *)
(*  The Seed7 Runtime Library 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.  See the GNU Lesser General Public License for more    *)
(*  details.                                                        *)
(*                                                                  *)
(*  You should have received a copy of the GNU Lesser General       *)
(*  Public License along with this program; if not, write to the    *)
(*  Free Software Foundation, Inc., 51 Franklin Street,             *)
(*  Fifth Floor, Boston, MA  02110-1301, USA.                       *)
(*                                                                  *)
(********************************************************************)


(**
 *  Interface type for log files.
 *  When [[string]] expressions are written to a ''logFile'' the
 *  evaluation of the string takes only place if the logFile is not
 *  STD_NULL. The logFile interface is implemented with [[null_file]],
 *  [[external_file]], [[utf8|utf8File]], [[utf16|utf16File]],
 *  [[socket]], [[echo|echoFile]], [[line|lineFile]],
 *  [[dir|dirFile]] and many other types.
 *)
const type: logFile is sub file interface;


(**
 *  Write an evaluated [[string]] expression to a logFile.
 *  The evaluation of the string takes only place if the logFile
 *  is not STD_NULL.
 *)
const proc: write (inout logFile: log, ref func string: stri) is func
  local
    var file: aFile is STD_NULL;
  begin
    if log <> STD_NULL then
      aFile := log;
      write(aFile, stri);
    end if;
  end func;


(**
 *  Write an evaluated [[string]] expression followed by end-of-line to a logFile.
 *  The evaluation of the string takes only place if the logFile
 *  is not STD_NULL. The implementation function decides how writing
 *  end-of-line is done. It can be done by writing '\n', but other
 *  solutions are also possible.
 *)
const proc: writeln (inout logFile: log, ref func string: stri) is func
  local
    var file: aFile is STD_NULL;
  begin
    if log <> STD_NULL then
      aFile := log;
      writeln(aFile, stri);
    end if;
  end func;