/* do not edit automatically generated by mc from PushBackInput. */ /* PushBackInput.mod provides a method for pushing back and consuming input. Copyright (C) 2001-2021 Free Software Foundation, Inc. Contributed by Gaius Mulley . 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 . */ #include "config.h" #include "system.h" # if !defined (PROC_D) # define PROC_D typedef void (*PROC_t) (void); typedef struct { PROC_t proc; } PROC; # endif # if !defined (FALSE) # define FALSE (1==0) # endif #if defined(__cplusplus) # undef NULL # define NULL 0 #endif #define _PushBackInput_H #define _PushBackInput_C # include "GFIO.h" # include "GDynamicStrings.h" # include "GASCII.h" # include "GDebug.h" # include "GStrLib.h" # include "GNumberIO.h" # include "GStrIO.h" # include "GStdIO.h" # include "Glibc.h" # define MaxPushBackStack 8192 # define MaxFileName 4096 typedef struct PushBackInput__T2_a PushBackInput__T2; typedef struct PushBackInput__T3_a PushBackInput__T3; struct PushBackInput__T2_a { char array[MaxFileName+1]; }; struct PushBackInput__T3_a { char array[MaxPushBackStack+1]; }; static PushBackInput__T2 FileName; static PushBackInput__T3 CharStack; static unsigned int ExitStatus; static unsigned int Column; static unsigned int StackPtr; static unsigned int LineNo; static unsigned int Debugging; /* Open - opens a file for reading. */ extern "C" 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 "C" 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 "C" char PushBackInput_PutCh (char ch); /* PutString - pushes a string onto the push back stack. */ extern "C" 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 "C" void PushBackInput_PutStr (DynamicStrings_String s); /* Error - emits an error message with the appropriate file, line combination. */ extern "C" 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 "C" 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 "C" void PushBackInput_WarnString (DynamicStrings_String s); /* Close - closes the opened file. */ extern "C" void PushBackInput_Close (FIO_File f); /* GetExitStatus - returns the exit status which will be 1 if any warnings were issued. */ extern "C" unsigned int PushBackInput_GetExitStatus (void); /* SetDebug - sets the debug flag on or off. */ extern "C" void PushBackInput_SetDebug (unsigned int d); /* GetColumnPosition - returns the column position of the current character. */ extern "C" unsigned int PushBackInput_GetColumnPosition (void); /* GetCurrentLine - returns the current line number. */ extern "C" unsigned int PushBackInput_GetCurrentLine (void); /* ErrChar - writes a char, ch, to stderr. */ static void ErrChar (char ch); /* Init - initialize global variables. */ static void Init (void); /* ErrChar - writes a char, ch, to stderr. */ static void ErrChar (char ch) { FIO_WriteChar (FIO_StdErr, ch); } /* Init - initialize global variables. */ static void Init (void) { ExitStatus = 0; StackPtr = 0; LineNo = 1; Column = 0; } /* Open - opens a file for reading. */ extern "C" FIO_File PushBackInput_Open (const char *a_, unsigned int _a_high) { char a[_a_high+1]; /* make a local copy of each unbounded array. */ memcpy (a, a_, _a_high+1); Init (); StrLib_StrCopy ((const char *) a, _a_high, (char *) &FileName.array[0], MaxFileName); return FIO_OpenToRead ((const char *) a, _a_high); /* static analysis guarentees a RETURN statement will be used before here. */ __builtin_unreachable (); } /* GetCh - gets a character from either the push back stack or from file, f. */ extern "C" char PushBackInput_GetCh (FIO_File f) { char ch; if (StackPtr > 0) { StackPtr -= 1; if (Debugging) { StdIO_Write (CharStack.array[StackPtr]); } return CharStack.array[StackPtr]; } else { if ((FIO_EOF (f)) || (! (FIO_IsNoError (f)))) { ch = ASCII_nul; } else { do { ch = FIO_ReadChar (f); } while (! (((ch != ASCII_cr) || (FIO_EOF (f))) || (! (FIO_IsNoError (f))))); if (ch == ASCII_lf) { Column = 0; LineNo += 1; } else { Column += 1; } } if (Debugging) { StdIO_Write (ch); } return ch; } /* static analysis guarentees a RETURN statement will be used before here. */ __builtin_unreachable (); } /* PutCh - pushes a character onto the push back stack, it also returns the character which has been pushed. */ extern "C" char PushBackInput_PutCh (char ch) { if (StackPtr < MaxPushBackStack) { CharStack.array[StackPtr] = ch; StackPtr += 1; } else { Debug_Halt ((const char *) "max push back stack exceeded, increase MaxPushBackStack", 55, 150, (const char *) "../../gcc-git-devel-modula2/gcc/m2/gm2-libs/PushBackInput.mod", 61); } return ch; /* static analysis guarentees a RETURN statement will be used before here. */ __builtin_unreachable (); } /* PutString - pushes a string onto the push back stack. */ extern "C" void PushBackInput_PutString (const char *a_, unsigned int _a_high) { unsigned int l; char a[_a_high+1]; /* make a local copy of each unbounded array. */ memcpy (a, a_, _a_high+1); l = StrLib_StrLen ((const char *) a, _a_high); while (l > 0) { l -= 1; if ((PushBackInput_PutCh (a[l])) != a[l]) { Debug_Halt ((const char *) "assert failed", 13, 132, (const char *) "../../gcc-git-devel-modula2/gcc/m2/gm2-libs/PushBackInput.mod", 61); } } } /* PutStr - pushes a dynamic string onto the push back stack. The string, s, is not deallocated. */ extern "C" void PushBackInput_PutStr (DynamicStrings_String s) { unsigned int i; i = DynamicStrings_Length (s); while (i > 0) { i -= 1; if ((PushBackInput_PutCh (DynamicStrings_char (s, static_cast (i)))) != (DynamicStrings_char (s, static_cast (i)))) { Debug_Halt ((const char *) "assert failed", 13, 113, (const char *) "../../gcc-git-devel-modula2/gcc/m2/gm2-libs/PushBackInput.mod", 61); } } } /* Error - emits an error message with the appropriate file, line combination. */ extern "C" void PushBackInput_Error (const char *a_, unsigned int _a_high) { char a[_a_high+1]; /* make a local copy of each unbounded array. */ memcpy (a, a_, _a_high+1); StdIO_PushOutput ((StdIO_ProcWrite) {(StdIO_ProcWrite_t) ErrChar}); StrIO_WriteString ((const char *) &FileName.array[0], MaxFileName); StdIO_Write (':'); NumberIO_WriteCard (LineNo, 0); StdIO_Write (':'); StrIO_WriteString ((const char *) a, _a_high); StrIO_WriteLn (); StdIO_PopOutput (); FIO_Close (FIO_StdErr); libc_exit (1); } /* 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 "C" void PushBackInput_WarnError (const char *a_, unsigned int _a_high) { char a[_a_high+1]; /* make a local copy of each unbounded array. */ memcpy (a, a_, _a_high+1); StdIO_PushOutput ((StdIO_ProcWrite) {(StdIO_ProcWrite_t) ErrChar}); StrIO_WriteString ((const char *) &FileName.array[0], MaxFileName); StdIO_Write (':'); NumberIO_WriteCard (LineNo, 0); StdIO_Write (':'); StrIO_WriteString ((const char *) a, _a_high); StrIO_WriteLn (); StdIO_PopOutput (); ExitStatus = 1; } /* 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 "C" void PushBackInput_WarnString (DynamicStrings_String s) { typedef char *WarnString__T1; WarnString__T1 p; p = static_cast (DynamicStrings_string (s)); StrIO_WriteString ((const char *) &FileName.array[0], MaxFileName); StdIO_Write (':'); NumberIO_WriteCard (LineNo, 0); StdIO_Write (':'); do { if (p != NULL) { if ((*p) == ASCII_lf) { StrIO_WriteLn (); StrIO_WriteString ((const char *) &FileName.array[0], MaxFileName); StdIO_Write (':'); NumberIO_WriteCard (LineNo, 0); StdIO_Write (':'); } else { StdIO_Write ((*p)); } p += 1; } } while (! ((p == NULL) || ((*p) == ASCII_nul))); ExitStatus = 1; } /* Close - closes the opened file. */ extern "C" void PushBackInput_Close (FIO_File f) { FIO_Close (f); } /* GetExitStatus - returns the exit status which will be 1 if any warnings were issued. */ extern "C" unsigned int PushBackInput_GetExitStatus (void) { return ExitStatus; /* static analysis guarentees a RETURN statement will be used before here. */ __builtin_unreachable (); } /* SetDebug - sets the debug flag on or off. */ extern "C" void PushBackInput_SetDebug (unsigned int d) { Debugging = d; } /* GetColumnPosition - returns the column position of the current character. */ extern "C" unsigned int PushBackInput_GetColumnPosition (void) { if (StackPtr > Column) { return 0; } else { return Column-StackPtr; } /* static analysis guarentees a RETURN statement will be used before here. */ __builtin_unreachable (); } /* GetCurrentLine - returns the current line number. */ extern "C" unsigned int PushBackInput_GetCurrentLine (void) { return LineNo; /* static analysis guarentees a RETURN statement will be used before here. */ __builtin_unreachable (); } extern "C" void _M2_PushBackInput_init (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[]) { PushBackInput_SetDebug (FALSE); Init (); } extern "C" void _M2_PushBackInput_finish (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[]) { }