/*  This file is part of the program psim.

    Copyright (C) 1994-1997, Andrew Cagney <cagney@highland.com.au>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    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.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
    */


/* LF: Line Numbered Output Stream */

typedef struct _lf lf;

typedef enum {
  lf_is_h,
  lf_is_c,
  lf_is_text,
} lf_file_type;


typedef enum {
  lf_include_references,
  lf_omit_references,
} lf_file_references;


/* Open the file NAME for writing ("-" for stdout).  Use REAL_NAME
   when refering to the opened file.  Line number information (in the
   output) can be suppressed with FILE_REFERENCES ==
   LF_OMIT_REFERENCES.  TYPE is to determine the formatting of some of
   the print messages below. */

extern lf *lf_open
(char *name,
 char *real_name,
 lf_file_references file_references,
 lf_file_type type,
 const char *program);

extern void lf_close
(lf *file);


/* Basic output functions */

extern int lf_write
(lf *file,
 const char *string,
 int len);

extern int lf_putchr
(lf *file,
 const char ch);

extern int lf_putstr
(lf *file,
 const char *string);

extern int lf_putint
(lf *file,
 int decimal);

extern int lf_putbin
(lf *file,
 int decimal,
 int width);

extern int lf_printf
(lf *file,
 const char *fmt,
 ...) __attribute__((format(printf, 2, 3)));


/* Indentation control.

   lf_indent_suppress suppresses indentation on the next line (current
   line if that has not yet been started) */

extern void lf_indent_suppress
(lf *file);

extern void lf_indent
(lf *file,
 int delta);


/* Print generic text: */


extern int lf_print__gnu_copyleft
(lf *file);

extern int lf_print__file_start
(lf *file);

extern int lf_print__this_file_is_empty
(lf *file,
 const char *reason);

extern int lf_print__file_finish
(lf *file);

extern int lf_print__internal_ref
(lf *file);

extern int lf_print__external_ref
(lf *file,
 int line_nr,
 const char *file_name);

extern int lf_print__line_ref
(lf *file,
 line_ref *line);

extern int lf_print__ucase_filename
(lf *file);

extern int lf_print__function_type
(lf *file,
 const char *type,
 const char *prefix,
 const char *trailing_space);

typedef int print_function(lf *file);

extern int lf_print__function_type_function
(lf *file,
 print_function *print_type,
 const char *prefix,
 const char *trailing_space);

