diff options
Diffstat (limited to 'gcc/m2/pge-boot/GStrIO.c')
-rw-r--r-- | gcc/m2/pge-boot/GStrIO.c | 277 |
1 files changed, 277 insertions, 0 deletions
diff --git a/gcc/m2/pge-boot/GStrIO.c b/gcc/m2/pge-boot/GStrIO.c new file mode 100644 index 0000000..180bdb0 --- /dev/null +++ b/gcc/m2/pge-boot/GStrIO.c @@ -0,0 +1,277 @@ +/* do not edit automatically generated by mc from StrIO. */ +/* StrIO.mod provides simple string input output routines. + +Copyright (C) 2001-2021 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 (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 + +#include <string.h> +#include <limits.h> +#define _StrIO_H +#define _StrIO_C + +# include "GASCII.h" +# include "GStdIO.h" +# include "Glibc.h" + +static unsigned int IsATTY; + +/* + WriteLn - writes a carriage return and a newline + character. +*/ + +extern "C" void StrIO_WriteLn (void); + +/* + ReadString - reads a sequence of characters into a string. + Line editing accepts Del, Ctrl H, Ctrl W and + Ctrl U. +*/ + +extern "C" void StrIO_ReadString (char *a, unsigned int _a_high); + +/* + WriteString - writes a string to the default output. +*/ + +extern "C" void StrIO_WriteString (const char *a_, unsigned int _a_high); + +/* + Erase - writes a backspace, space and backspace to remove the + last character displayed. +*/ + +static void Erase (void); + +/* + Echo - echos the character, ch, onto the output channel if IsATTY + is true. +*/ + +static void Echo (char ch); + +/* + AlphaNum- returns true if character, ch, is an alphanumeric character. +*/ + +static unsigned int AlphaNum (char ch); + + +/* + Erase - writes a backspace, space and backspace to remove the + last character displayed. +*/ + +static void Erase (void) +{ + Echo (ASCII_bs); + Echo (' '); + Echo (ASCII_bs); +} + + +/* + Echo - echos the character, ch, onto the output channel if IsATTY + is true. +*/ + +static void Echo (char ch) +{ + if (IsATTY) + { + StdIO_Write (ch); + } +} + + +/* + AlphaNum- returns true if character, ch, is an alphanumeric character. +*/ + +static unsigned int AlphaNum (char ch) +{ + return (((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z'))) || ((ch >= '0') && (ch <= '9')); + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + +/* + WriteLn - writes a carriage return and a newline + character. +*/ + +extern "C" void StrIO_WriteLn (void) +{ + Echo (ASCII_cr); + StdIO_Write (ASCII_lf); +} + + +/* + ReadString - reads a sequence of characters into a string. + Line editing accepts Del, Ctrl H, Ctrl W and + Ctrl U. +*/ + +extern "C" void StrIO_ReadString (char *a, unsigned int _a_high) +{ + unsigned int n; + unsigned int high; + char ch; + + high = _a_high; + n = 0; + do { + StdIO_Read (&ch); + if ((ch == ASCII_del) || (ch == ASCII_bs)) + { + if (n == 0) + { + StdIO_Write (ASCII_bel); + } + else + { + Erase (); + n -= 1; + } + } + else if (ch == ASCII_nak) + { + /* avoid dangling else. */ + while (n > 0) + { + Erase (); + n -= 1; + } + } + else if (ch == ASCII_etb) + { + /* avoid dangling else. */ + if (n == 0) + { + Echo (ASCII_bel); + } + else if (AlphaNum (a[n-1])) + { + /* avoid dangling else. */ + do { + Erase (); + n -= 1; + } while (! ((n == 0) || (! (AlphaNum (a[n-1]))))); + } + else + { + /* avoid dangling else. */ + Erase (); + n -= 1; + } + } + else if (n <= high) + { + /* avoid dangling else. */ + if ((ch == ASCII_cr) || (ch == ASCII_lf)) + { + a[n] = ASCII_nul; + n += 1; + } + else if (ch == ASCII_ff) + { + /* avoid dangling else. */ + a[0] = ch; + if (high > 0) + { + a[1] = ASCII_nul; + } + ch = ASCII_cr; + } + else if (ch >= ' ') + { + /* avoid dangling else. */ + Echo (ch); + a[n] = ch; + n += 1; + } + else if (ch == ASCII_eof) + { + /* avoid dangling else. */ + a[n] = ch; + n += 1; + ch = ASCII_cr; + if (n <= high) + { + a[n] = ASCII_nul; + } + } + } + else if (ch != ASCII_cr) + { + /* avoid dangling else. */ + Echo (ASCII_bel); + } + } while (! ((ch == ASCII_cr) || (ch == ASCII_lf))); +} + + +/* + WriteString - writes a string to the default output. +*/ + +extern "C" void StrIO_WriteString (const char *a_, unsigned int _a_high) +{ + unsigned int n; + unsigned int high; + char a[_a_high+1]; + + /* make a local copy of each unbounded array. */ + memcpy (a, a_, _a_high+1); + + high = _a_high; + n = 0; + while ((n <= high) && (a[n] != ASCII_nul)) + { + StdIO_Write (a[n]); + n += 1; + } +} + +extern "C" void _M2_StrIO_init (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[]) +{ + /* IsATTY := isatty() */ + IsATTY = FALSE; +} + +extern "C" void _M2_StrIO_finish (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[]) +{ +} |