/* do not edit automatically generated by mc from PushBackInput.  */
/* PushBackInput.def provides a method for pushing back and consuming input.

Copyright (C) 2001-2026 Free Software Foundation, Inc.
Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.

This file is part of GNU Modula-2.

GNU Modula-2 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, or (at your option)
any later version.

GNU Modula-2 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.

Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.

You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
<http://www.gnu.org/licenses/>.  */


#if !defined (_PushBackInput_H)
#   define _PushBackInput_H

#include "config.h"
#include "system.h"
#   ifdef __cplusplus
extern "C" {
#   endif
#include <stdbool.h>
#   if !defined (PROC_D)
#      define PROC_D
       typedef void (*PROC_t) (void);
       typedef struct { PROC_t proc; } PROC;
#   endif

#   include "GFIO.h"
#   include "GDynamicStrings.h"

#   if defined (_PushBackInput_C)
#      define EXTERN
#   else
#      define EXTERN extern
#   endif


/*
   Open - opens a file for reading.
*/

EXTERN FIO_File PushBackInput_Open (const char *a_, unsigned int _a_high);

/*
   GetCh - gets a character from either the push back stack or
           from file, f.
*/

EXTERN char PushBackInput_GetCh (FIO_File f);

/*
   PutCh - pushes a character onto the push back stack, it also
           returns the character which has been pushed.
*/

EXTERN char PushBackInput_PutCh (char ch);

/*
   PutString - pushes a string onto the push back stack.
*/

EXTERN void PushBackInput_PutString (const char *a_, unsigned int _a_high);

/*
   PutStr - pushes a dynamic string onto the push back stack.
            The string, s, is not deallocated.
*/

EXTERN void PushBackInput_PutStr (DynamicStrings_String s);

/*
   Error - emits an error message with the appropriate file, line combination.
*/

EXTERN void PushBackInput_Error (const char *a_, unsigned int _a_high);

/*
   WarnError - emits an error message with the appropriate file, line combination.
               It does not terminate but when the program finishes an exit status of
               1 will be issued.
*/

EXTERN void PushBackInput_WarnError (const char *a_, unsigned int _a_high);

/*
   WarnString - emits an error message with the appropriate file, line combination.
                It does not terminate but when the program finishes an exit status of
                1 will be issued.
*/

EXTERN void PushBackInput_WarnString (DynamicStrings_String s);

/*
   Close - closes the opened file.
*/

EXTERN void PushBackInput_Close (FIO_File f);

/*
   GetExitStatus - returns the exit status which will be 1 if any warnings were issued.
*/

EXTERN unsigned int PushBackInput_GetExitStatus (void);

/*
   SetDebug - sets the debug flag on or off.
*/

EXTERN void PushBackInput_SetDebug (bool d);

/*
   GetColumnPosition - returns the column position of the current character.
*/

EXTERN unsigned int PushBackInput_GetColumnPosition (void);

/*
   GetCurrentLine - returns the current line number.
*/

EXTERN unsigned int PushBackInput_GetCurrentLine (void);
#   ifdef __cplusplus
}
#   endif

#   undef EXTERN
#endif
