/*  This file is part of the program psim.

    Copyright (C) 1994-1995, 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 3 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, see <http://www.gnu.org/licenses/>.
 
    */


/* LF: Line Numbered Output Stream */

#include "ansidecl.h"

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.  REAL_NAME is to be included in any
   line number outputs.  The output of line number information can be
   suppressed with LINE_NUMBERS */

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_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_PRINTF_2;


/* 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);

extern int lf_print__file_finish
(lf *file);

extern int lf_print__internal_reference
(lf *file);

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

extern int lf_print__ucase_filename
(lf *file);

/* Tab prefix is suppressed */

extern int lf_print__c_code
(lf *file,
 const char *code);


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