diff options
Diffstat (limited to 'gcc/m2/mc-boot/GNumberIO.c')
-rw-r--r-- | gcc/m2/mc-boot/GNumberIO.c | 776 |
1 files changed, 776 insertions, 0 deletions
diff --git a/gcc/m2/mc-boot/GNumberIO.c b/gcc/m2/mc-boot/GNumberIO.c new file mode 100644 index 0000000..6b90074 --- /dev/null +++ b/gcc/m2/mc-boot/GNumberIO.c @@ -0,0 +1,776 @@ +/* do not edit automatically generated by mc from NumberIO. */ +/* NumberIO.mod provides conversion of ordinal numbers. + +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/>. */ + +#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 (TRUE) +# define TRUE (1==1) +# endif + +# if !defined (FALSE) +# define FALSE (1==0) +# endif + +#define _NumberIO_H +#define _NumberIO_C + +# include "GASCII.h" +# include "GStrIO.h" +# include "GStrLib.h" +# include "GM2RTS.h" + +# define MaxLineLength 79 +# define MaxDigits 20 +# define MaxHexDigits 20 +# define MaxOctDigits 40 +# define MaxBits 64 +extern "C" void NumberIO_ReadCard (unsigned int *x); +extern "C" void NumberIO_WriteCard (unsigned int x, unsigned int n); +extern "C" void NumberIO_ReadHex (unsigned int *x); +extern "C" void NumberIO_WriteHex (unsigned int x, unsigned int n); +extern "C" void NumberIO_ReadInt (int *x); +extern "C" void NumberIO_WriteInt (int x, unsigned int n); +extern "C" void NumberIO_CardToStr (unsigned int x, unsigned int n, char *a, unsigned int _a_high); +extern "C" void NumberIO_StrToCard (const char *a_, unsigned int _a_high, unsigned int *x); +extern "C" void NumberIO_HexToStr (unsigned int x, unsigned int n, char *a, unsigned int _a_high); +extern "C" void NumberIO_StrToHex (const char *a_, unsigned int _a_high, unsigned int *x); +extern "C" void NumberIO_IntToStr (int x, unsigned int n, char *a, unsigned int _a_high); +extern "C" void NumberIO_StrToInt (const char *a_, unsigned int _a_high, int *x); +extern "C" void NumberIO_ReadOct (unsigned int *x); +extern "C" void NumberIO_WriteOct (unsigned int x, unsigned int n); +extern "C" void NumberIO_OctToStr (unsigned int x, unsigned int n, char *a, unsigned int _a_high); +extern "C" void NumberIO_StrToOct (const char *a_, unsigned int _a_high, unsigned int *x); +extern "C" void NumberIO_ReadBin (unsigned int *x); +extern "C" void NumberIO_WriteBin (unsigned int x, unsigned int n); +extern "C" void NumberIO_BinToStr (unsigned int x, unsigned int n, char *a, unsigned int _a_high); +extern "C" void NumberIO_StrToBin (const char *a_, unsigned int _a_high, unsigned int *x); +extern "C" void NumberIO_StrToBinInt (const char *a_, unsigned int _a_high, int *x); +extern "C" void NumberIO_StrToHexInt (const char *a_, unsigned int _a_high, int *x); +extern "C" void NumberIO_StrToOctInt (const char *a_, unsigned int _a_high, int *x); + +extern "C" void NumberIO_ReadCard (unsigned int *x) +{ + typedef struct ReadCard__T1_a ReadCard__T1; + + struct ReadCard__T1_a { char array[MaxLineLength+1]; }; + ReadCard__T1 a; + + StrIO_ReadString ((char *) &a.array[0], MaxLineLength); + NumberIO_StrToCard ((const char *) &a.array[0], MaxLineLength, x); +} + +extern "C" void NumberIO_WriteCard (unsigned int x, unsigned int n) +{ + typedef struct WriteCard__T2_a WriteCard__T2; + + struct WriteCard__T2_a { char array[MaxLineLength+1]; }; + WriteCard__T2 a; + + NumberIO_CardToStr (x, n, (char *) &a.array[0], MaxLineLength); + StrIO_WriteString ((const char *) &a.array[0], MaxLineLength); +} + +extern "C" void NumberIO_ReadHex (unsigned int *x) +{ + typedef struct ReadHex__T3_a ReadHex__T3; + + struct ReadHex__T3_a { char array[MaxLineLength+1]; }; + ReadHex__T3 a; + + StrIO_ReadString ((char *) &a.array[0], MaxLineLength); + NumberIO_StrToHex ((const char *) &a.array[0], MaxLineLength, x); +} + +extern "C" void NumberIO_WriteHex (unsigned int x, unsigned int n) +{ + typedef struct WriteHex__T4_a WriteHex__T4; + + struct WriteHex__T4_a { char array[MaxLineLength+1]; }; + WriteHex__T4 a; + + NumberIO_HexToStr (x, n, (char *) &a.array[0], MaxLineLength); + StrIO_WriteString ((const char *) &a.array[0], MaxLineLength); +} + +extern "C" void NumberIO_ReadInt (int *x) +{ + typedef struct ReadInt__T5_a ReadInt__T5; + + struct ReadInt__T5_a { char array[MaxLineLength+1]; }; + ReadInt__T5 a; + + StrIO_ReadString ((char *) &a.array[0], MaxLineLength); + NumberIO_StrToInt ((const char *) &a.array[0], MaxLineLength, x); +} + +extern "C" void NumberIO_WriteInt (int x, unsigned int n) +{ + typedef struct WriteInt__T6_a WriteInt__T6; + + struct WriteInt__T6_a { char array[MaxLineLength+1]; }; + WriteInt__T6 a; + + NumberIO_IntToStr (x, n, (char *) &a.array[0], MaxLineLength); + StrIO_WriteString ((const char *) &a.array[0], MaxLineLength); +} + +extern "C" void NumberIO_CardToStr (unsigned int x, unsigned int n, char *a, unsigned int _a_high) +{ + typedef struct CardToStr__T7_a CardToStr__T7; + + struct CardToStr__T7_a { unsigned int array[MaxDigits-1+1]; }; + unsigned int i; + unsigned int j; + unsigned int Higha; + CardToStr__T7 buf; + + i = 0; + do { + i += 1; + if (i > MaxDigits) + { + StrIO_WriteString ((const char *) "NumberIO - increase MaxDigits", 29); + StrIO_WriteLn (); + M2RTS_HALT (-1); + __builtin_unreachable (); + } + buf.array[i-1] = x % 10; + x = x / 10; + } while (! (x == 0)); + j = 0; + Higha = _a_high; + while ((n > i) && (j <= Higha)) + { + a[j] = ' '; + j += 1; + n -= 1; + } + while ((i > 0) && (j <= Higha)) + { + a[j] = ((char) (buf.array[i-1]+ ((unsigned int) ('0')))); + j += 1; + i -= 1; + } + if (j <= Higha) + { + a[j] = ASCII_nul; + } +} + +extern "C" void NumberIO_StrToCard (const char *a_, unsigned int _a_high, unsigned int *x) +{ + unsigned int i; + unsigned int ok; + unsigned int higha; + char a[_a_high+1]; + + /* make a local copy of each unbounded array. */ + memcpy (a, a_, _a_high+1); + + StrLib_StrRemoveWhitePrefix ((const char *) a, _a_high, (char *) a, _a_high); + higha = StrLib_StrLen ((const char *) a, _a_high); + i = 0; + ok = TRUE; + while (ok) + { + if (i < higha) + { + if ((a[i] < '0') || (a[i] > '9')) + { + i += 1; + } + else + { + ok = FALSE; + } + } + else + { + ok = FALSE; + } + } + (*x) = 0; + if (i < higha) + { + ok = TRUE; + do { + (*x) = (10*(*x))+( ((unsigned int) (a[i]))- ((unsigned int) ('0'))); + if (i < higha) + { + /* avoid dangling else. */ + i += 1; + if ((a[i] < '0') || (a[i] > '9')) + { + ok = FALSE; + } + } + else + { + ok = FALSE; + } + } while (! (! ok)); + } +} + +extern "C" void NumberIO_HexToStr (unsigned int x, unsigned int n, char *a, unsigned int _a_high) +{ + typedef struct HexToStr__T8_a HexToStr__T8; + + struct HexToStr__T8_a { unsigned int array[MaxHexDigits-1+1]; }; + unsigned int i; + unsigned int j; + unsigned int Higha; + HexToStr__T8 buf; + + i = 0; + do { + i += 1; + if (i > MaxHexDigits) + { + StrIO_WriteString ((const char *) "NumberIO - increase MaxDigits", 29); + StrIO_WriteLn (); + M2RTS_HALT (-1); + __builtin_unreachable (); + } + buf.array[i-1] = x % 0x010; + x = x / 0x010; + } while (! (x == 0)); + j = 0; + Higha = _a_high; + while ((n > i) && (j <= Higha)) + { + a[j] = '0'; + j += 1; + n -= 1; + } + while ((i != 0) && (j <= Higha)) + { + if (buf.array[i-1] < 10) + { + a[j] = ((char) (buf.array[i-1]+ ((unsigned int) ('0')))); + } + else + { + a[j] = ((char) ((buf.array[i-1]+ ((unsigned int) ('A')))-10)); + } + j += 1; + i -= 1; + } + if (j <= Higha) + { + a[j] = ASCII_nul; + } +} + +extern "C" void NumberIO_StrToHex (const char *a_, unsigned int _a_high, unsigned int *x) +{ + int i; + char a[_a_high+1]; + + /* make a local copy of each unbounded array. */ + memcpy (a, a_, _a_high+1); + + NumberIO_StrToHexInt ((const char *) a, _a_high, &i); + (*x) = (unsigned int ) (i); +} + +extern "C" void NumberIO_IntToStr (int x, unsigned int n, char *a, unsigned int _a_high) +{ + typedef struct IntToStr__T9_a IntToStr__T9; + + struct IntToStr__T9_a { unsigned int array[MaxDigits-1+1]; }; + unsigned int i; + unsigned int j; + unsigned int c; + unsigned int Higha; + IntToStr__T9 buf; + unsigned int Negative; + + if (x < 0) + { + /* avoid dangling else. */ + Negative = TRUE; + c = ((unsigned int ) (abs (x+1)))+1; + if (n > 0) + { + n -= 1; + } + } + else + { + c = x; + Negative = FALSE; + } + i = 0; + do { + i += 1; + if (i > MaxDigits) + { + StrIO_WriteString ((const char *) "NumberIO - increase MaxDigits", 29); + StrIO_WriteLn (); + M2RTS_HALT (-1); + __builtin_unreachable (); + } + buf.array[i-1] = c % 10; + c = c / 10; + } while (! (c == 0)); + j = 0; + Higha = _a_high; + while ((n > i) && (j <= Higha)) + { + a[j] = ' '; + j += 1; + n -= 1; + } + if (Negative) + { + a[j] = '-'; + j += 1; + } + while ((i != 0) && (j <= Higha)) + { + a[j] = ((char) (buf.array[i-1]+ ((unsigned int) ('0')))); + j += 1; + i -= 1; + } + if (j <= Higha) + { + a[j] = ASCII_nul; + } +} + +extern "C" void NumberIO_StrToInt (const char *a_, unsigned int _a_high, int *x) +{ + unsigned int i; + unsigned int ok; + unsigned int Negative; + unsigned int higha; + char a[_a_high+1]; + + /* make a local copy of each unbounded array. */ + memcpy (a, a_, _a_high+1); + + StrLib_StrRemoveWhitePrefix ((const char *) a, _a_high, (char *) a, _a_high); + higha = StrLib_StrLen ((const char *) a, _a_high); + i = 0; + Negative = FALSE; + ok = TRUE; + while (ok) + { + if (i < higha) + { + if (a[i] == '-') + { + i += 1; + Negative = ! Negative; + } + else if ((a[i] < '0') || (a[i] > '9')) + { + /* avoid dangling else. */ + i += 1; + } + else + { + /* avoid dangling else. */ + ok = FALSE; + } + } + else + { + ok = FALSE; + } + } + (*x) = 0; + if (i < higha) + { + ok = TRUE; + do { + if (Negative) + { + (*x) = (10*(*x))-((int ) ( ((unsigned int) (a[i]))- ((unsigned int) ('0')))); + } + else + { + (*x) = (10*(*x))+((int ) ( ((unsigned int) (a[i]))- ((unsigned int) ('0')))); + } + if (i < higha) + { + /* avoid dangling else. */ + i += 1; + if ((a[i] < '0') || (a[i] > '9')) + { + ok = FALSE; + } + } + else + { + ok = FALSE; + } + } while (! (! ok)); + } +} + +extern "C" void NumberIO_ReadOct (unsigned int *x) +{ + typedef struct ReadOct__T10_a ReadOct__T10; + + struct ReadOct__T10_a { char array[MaxLineLength+1]; }; + ReadOct__T10 a; + + StrIO_ReadString ((char *) &a.array[0], MaxLineLength); + NumberIO_StrToOct ((const char *) &a.array[0], MaxLineLength, x); +} + +extern "C" void NumberIO_WriteOct (unsigned int x, unsigned int n) +{ + typedef struct WriteOct__T11_a WriteOct__T11; + + struct WriteOct__T11_a { char array[MaxLineLength+1]; }; + WriteOct__T11 a; + + NumberIO_OctToStr (x, n, (char *) &a.array[0], MaxLineLength); + StrIO_WriteString ((const char *) &a.array[0], MaxLineLength); +} + +extern "C" void NumberIO_OctToStr (unsigned int x, unsigned int n, char *a, unsigned int _a_high) +{ + typedef struct OctToStr__T12_a OctToStr__T12; + + struct OctToStr__T12_a { unsigned int array[MaxOctDigits-1+1]; }; + unsigned int i; + unsigned int j; + unsigned int Higha; + OctToStr__T12 buf; + + i = 0; + do { + i += 1; + if (i > MaxOctDigits) + { + StrIO_WriteString ((const char *) "NumberIO - increase MaxDigits", 29); + StrIO_WriteLn (); + M2RTS_HALT (-1); + __builtin_unreachable (); + } + buf.array[i-1] = x % 8; + x = x / 8; + } while (! (x == 0)); + j = 0; + Higha = _a_high; + while ((n > i) && (j <= Higha)) + { + a[j] = ' '; + j += 1; + n -= 1; + } + while ((i > 0) && (j <= Higha)) + { + a[j] = ((char) (buf.array[i-1]+ ((unsigned int) ('0')))); + j += 1; + i -= 1; + } + if (j <= Higha) + { + a[j] = ASCII_nul; + } +} + +extern "C" void NumberIO_StrToOct (const char *a_, unsigned int _a_high, unsigned int *x) +{ + int i; + char a[_a_high+1]; + + /* make a local copy of each unbounded array. */ + memcpy (a, a_, _a_high+1); + + NumberIO_StrToOctInt ((const char *) a, _a_high, &i); + (*x) = (unsigned int ) (i); +} + +extern "C" void NumberIO_ReadBin (unsigned int *x) +{ + typedef struct ReadBin__T13_a ReadBin__T13; + + struct ReadBin__T13_a { char array[MaxLineLength+1]; }; + ReadBin__T13 a; + + StrIO_ReadString ((char *) &a.array[0], MaxLineLength); + NumberIO_StrToBin ((const char *) &a.array[0], MaxLineLength, x); +} + +extern "C" void NumberIO_WriteBin (unsigned int x, unsigned int n) +{ + typedef struct WriteBin__T14_a WriteBin__T14; + + struct WriteBin__T14_a { char array[MaxLineLength+1]; }; + WriteBin__T14 a; + + NumberIO_BinToStr (x, n, (char *) &a.array[0], MaxLineLength); + StrIO_WriteString ((const char *) &a.array[0], MaxLineLength); +} + +extern "C" void NumberIO_BinToStr (unsigned int x, unsigned int n, char *a, unsigned int _a_high) +{ + typedef struct BinToStr__T15_a BinToStr__T15; + + struct BinToStr__T15_a { unsigned int array[MaxBits-1+1]; }; + unsigned int i; + unsigned int j; + unsigned int Higha; + BinToStr__T15 buf; + + i = 0; + do { + i += 1; + if (i > MaxBits) + { + StrIO_WriteString ((const char *) "NumberIO - increase MaxBits", 27); + StrIO_WriteLn (); + M2RTS_HALT (-1); + __builtin_unreachable (); + } + buf.array[i-1] = x % 2; + x = x / 2; + } while (! (x == 0)); + j = 0; + Higha = _a_high; + while ((n > i) && (j <= Higha)) + { + a[j] = ' '; + j += 1; + n -= 1; + } + while ((i > 0) && (j <= Higha)) + { + a[j] = ((char) (buf.array[i-1]+ ((unsigned int) ('0')))); + j += 1; + i -= 1; + } + if (j <= Higha) + { + a[j] = ASCII_nul; + } +} + +extern "C" void NumberIO_StrToBin (const char *a_, unsigned int _a_high, unsigned int *x) +{ + int i; + char a[_a_high+1]; + + /* make a local copy of each unbounded array. */ + memcpy (a, a_, _a_high+1); + + NumberIO_StrToBinInt ((const char *) a, _a_high, &i); + (*x) = (unsigned int ) (i); +} + +extern "C" void NumberIO_StrToBinInt (const char *a_, unsigned int _a_high, int *x) +{ + unsigned int i; + unsigned int ok; + unsigned int higha; + char a[_a_high+1]; + + /* make a local copy of each unbounded array. */ + memcpy (a, a_, _a_high+1); + + StrLib_StrRemoveWhitePrefix ((const char *) a, _a_high, (char *) a, _a_high); + higha = StrLib_StrLen ((const char *) a, _a_high); + i = 0; + ok = TRUE; + while (ok) + { + if (i < higha) + { + if ((a[i] < '0') || (a[i] > '1')) + { + i += 1; + } + else + { + ok = FALSE; + } + } + else + { + ok = FALSE; + } + } + (*x) = 0; + if (i < higha) + { + ok = TRUE; + do { + (*x) = (2*(*x))+((int ) ( ((unsigned int) (a[i]))- ((unsigned int) ('0')))); + if (i < higha) + { + /* avoid dangling else. */ + i += 1; + if ((a[i] < '0') || (a[i] > '1')) + { + ok = FALSE; + } + } + else + { + ok = FALSE; + } + } while (! (! ok)); + } +} + +extern "C" void NumberIO_StrToHexInt (const char *a_, unsigned int _a_high, int *x) +{ + unsigned int i; + unsigned int ok; + unsigned int higha; + char a[_a_high+1]; + + /* make a local copy of each unbounded array. */ + memcpy (a, a_, _a_high+1); + + StrLib_StrRemoveWhitePrefix ((const char *) a, _a_high, (char *) a, _a_high); + higha = StrLib_StrLen ((const char *) a, _a_high); + i = 0; + ok = TRUE; + while (ok) + { + if (i < higha) + { + if (((a[i] >= '0') && (a[i] <= '9')) || ((a[i] >= 'A') && (a[i] <= 'F'))) + { + ok = FALSE; + } + else + { + i += 1; + } + } + else + { + ok = FALSE; + } + } + (*x) = 0; + if (i < higha) + { + ok = TRUE; + do { + if ((a[i] >= '0') && (a[i] <= '9')) + { + (*x) = (0x010*(*x))+((int ) ( ((unsigned int) (a[i]))- ((unsigned int) ('0')))); + } + else if ((a[i] >= 'A') && (a[i] <= 'F')) + { + /* avoid dangling else. */ + (*x) = (0x010*(*x))+((int ) (( ((unsigned int) (a[i]))- ((unsigned int) ('A')))+10)); + } + if (i < higha) + { + /* avoid dangling else. */ + i += 1; + if (((a[i] < '0') || (a[i] > '9')) && ((a[i] < 'A') || (a[i] > 'F'))) + { + ok = FALSE; + } + } + else + { + ok = FALSE; + } + } while (! (! ok)); + } +} + +extern "C" void NumberIO_StrToOctInt (const char *a_, unsigned int _a_high, int *x) +{ + unsigned int i; + unsigned int ok; + unsigned int higha; + char a[_a_high+1]; + + /* make a local copy of each unbounded array. */ + memcpy (a, a_, _a_high+1); + + StrLib_StrRemoveWhitePrefix ((const char *) a, _a_high, (char *) a, _a_high); + higha = StrLib_StrLen ((const char *) a, _a_high); + i = 0; + ok = TRUE; + while (ok) + { + if (i < higha) + { + if ((a[i] < '0') || (a[i] > '7')) + { + i += 1; + } + else + { + ok = FALSE; + } + } + else + { + ok = FALSE; + } + } + (*x) = 0; + if (i < higha) + { + ok = TRUE; + do { + (*x) = (8*(*x))+((int ) ( ((unsigned int) (a[i]))- ((unsigned int) ('0')))); + if (i < higha) + { + /* avoid dangling else. */ + i += 1; + if ((a[i] < '0') || (a[i] > '7')) + { + ok = FALSE; + } + } + else + { + ok = FALSE; + } + } while (! (! ok)); + } +} + +extern "C" void _M2_NumberIO_init (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[]) +{ +} + +extern "C" void _M2_NumberIO_finish (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[]) +{ +} |