public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/modula-2] Introduce target independent copies of document chapters.
@ 2022-12-13 22:08 Gaius Mulley
  0 siblings, 0 replies; only message in thread
From: Gaius Mulley @ 2022-12-13 22:08 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:0ce58b3761bc79606ae6d17f1a1ebd937f6f8509

commit 0ce58b3761bc79606ae6d17f1a1ebd937f6f8509
Author: Gaius Mulley <gaiusmod2@gmail.com>
Date:   Tue Dec 13 22:07:26 2022 +0000

    Introduce target independent copies of document chapters.
    
    This patch introduces target independent copies of document chapters
    which will be used if HAVE_PYTHON is no, thus providing a fall back
    for documentation production.
    
    gcc/m2/ChangeLog:
    
            * doc/gm2.texi: Tidy up mailing testsuite results
            (formatting).
            * Make-lang.in (gm2-libs-texi-check): Copy
            target-dependent copy
            if HAVE_PYTHON is no.  (gm2-libs-rst-check) Copy
            target-dependent copy
            if HAVE_PYTHON is no.  (SYSTEM-pim-texi-check) Copy
            target-dependent copy
            if HAVE_PYTHON is no.  (SYSTEM-pim-rst-check) Copy
            target-dependent copy
            if HAVE_PYTHON is no.  (SYSTEM-iso-texi-check) Copy
            target-dependent copy
            if HAVE_PYTHON is no.  (SYSTEM-iso-rst-check) Copy
            target-dependent copy
            if HAVE_PYTHON is no.  (Builtins.texi-check) Copy
            target-dependent copy if HAVE_PYTHON is no.
            (Builtins.rst-check) Copy target-dependent copy if
            HAVE_PYTHON is no.
            * Make-maintainer.in (m2-target-independent-doc): New rule.
            (m2-target-independent-doc-texi) New rule.
            (m2-target-independent-doc-rst) New rule.
            * gm2-libs-coroutines/SYSTEM.def: Tidied up comments.
            * gm2-libs-iso/README.texi: Corrected dates.
            * gm2-libs-iso/SYSTEM.def: Tidied up comments.
            * gm2-libs/README.texi: Corrected dates.
            * tools-src/def2doc.py (emit_texinfo_content): Do not change state
            in texinfo files.  Replace @SYSTEM_DATATYPES@ with 'Target
            specific data types.'.  Replace @SYSTEM_TYPES@ with '(* Target
            specific data types.  *)'
            * target-independent/Builtins.rst: New file.
            * target-independent/Builtins.texi: New file.
            * target-independent/gm2-libs.rst: New file.
            * target-independent/gm2-libs.texi: New file.
            * target-independent/readme.txt: New file.
            * target-independent/SYSTEM-iso.rst: New file.
            * target-independent/SYSTEM-iso.texi: New file.
            * target-independent/SYSTEM-pim.rst: New file.
            * target-independent/SYSTEM-pim.texi: New file.
    
    Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>

Diff:
---
 gcc/doc/gm2.texi                          |     4 +-
 gcc/m2/Make-lang.in                       |    41 +-
 gcc/m2/Make-maintainer.in                 |    25 +
 gcc/m2/gm2-libs-coroutines/SYSTEM.def     |    43 +-
 gcc/m2/gm2-libs-iso/README.texi           |     2 +-
 gcc/m2/gm2-libs-iso/SYSTEM.def            |     5 +-
 gcc/m2/gm2-libs/README.texi               |     2 +-
 gcc/m2/gm2-libs/SYSTEM.def                |     8 +-
 gcc/m2/target-independent/Builtins.rst    |   587 +
 gcc/m2/target-independent/Builtins.texi   |   340 +
 gcc/m2/target-independent/SYSTEM-iso.rst  |   281 +
 gcc/m2/target-independent/SYSTEM-iso.texi |   237 +
 gcc/m2/target-independent/SYSTEM-pim.rst  |   204 +
 gcc/m2/target-independent/SYSTEM-pim.texi |   176 +
 gcc/m2/target-independent/gm2-libs.rst    | 18269 ++++++++++++++++++++++++++++
 gcc/m2/target-independent/gm2-libs.texi   | 14924 +++++++++++++++++++++++
 gcc/m2/target-independent/readme.txt      |     3 +
 gcc/m2/tools-src/def2doc.py               |     8 +-
 18 files changed, 35101 insertions(+), 58 deletions(-)

diff --git a/gcc/doc/gm2.texi b/gcc/doc/gm2.texi
index aa02a772eb1..513fdd3ec7f 100644
--- a/gcc/doc/gm2.texi
+++ b/gcc/doc/gm2.texi
@@ -259,10 +259,10 @@ $ make check-m2 -j 24
 
 Finally the results of the testsuite can be emailed to the
 @url{https://gcc.gnu.org/lists.html, gcc-testresults} list using the
-script:
+@file{test_summary} script found in the gcc source tree:
 
 @example
-$ @file{gccsrcdir/contrib/test_summary}
+$ @samp{directory to the sources}/contrib/test_summary
 @end example
 
 @node Limitations, Objectives, Regression tests, Using
diff --git a/gcc/m2/Make-lang.in b/gcc/m2/Make-lang.in
index 433d1f2916b..a8bd7fe4d19 100644
--- a/gcc/m2/Make-lang.in
+++ b/gcc/m2/Make-lang.in
@@ -164,12 +164,11 @@ ifeq ($(HAVE_PYTHON),yes)
 gm2-libs.texi-check: m2/SYSTEM-pim.texi m2/SYSTEM-iso.texi m2/Builtins.texi \
                      $(objdir)/m2/gm2-libs-coroutines/SYSTEM.def
 	$(PYTHON) $(srcdir)/m2/tools-src/def2doc.py -t -uLibraries -s$(srcdir)/m2 -b$(objdir)/m2 -o $(objdir)/m2/gm2-libs.texi
-	$(STAMP) gm2-libs.texi-check
 else
 gm2-libs.texi-check:
-	echo "not building gm2-libs.texi as python3 has not been found"
-	touch $(objdir)/m2/gm2-libs.texi
+	cp $(srcdir)/m2/target-independent/gm2-libs.texi $(objdir)/m2/gm2-libs.texi
 endif
+	$(STAMP) gm2-libs.texi-check
 
 # gm2-libs.rst
 
@@ -179,12 +178,11 @@ ifeq ($(HAVE_PYTHON),yes)
 gm2-libs.rst-check: m2/SYSTEM-pim.texi m2/SYSTEM-iso.texi m2/Builtins.texi \
                      $(objdir)/m2/gm2-libs-coroutines/SYSTEM.def
 	$(PYTHON) $(srcdir)/m2/tools-src/def2doc.py -x -uLibraries -s$(srcdir)/m2 -b$(objdir)/m2 -o $(objdir)/m2/gm2-libs.rst
-	$(STAMP) gm2-libs.rst-check
 else
 gm2-libs.rst-check:
-	echo "not building gm2-libs.rst as python3 has not been found"
-	touch $(objdir)/m2/gm2-libs.rst
+	cp $(srcdir)/m2/target-independent/gm2-libs.rst $(objdir)/m2/gm2-libs.rst
 endif
+	$(STAMP) gm2-libs.rst-check
 
 # gm2-ebnf.texi
 
@@ -209,12 +207,11 @@ m2/SYSTEM-pim.texi: SYSTEM-pim-texi-check; @true
 ifeq ($(HAVE_PYTHON),yes)
 SYSTEM-pim-texi-check: $(objdir)/m2/gm2-libs/SYSTEM.def
 	$(PYTHON) $(srcdir)/m2/tools-src/def2doc.py -t -b$(objdir)/m2 -f$(objdir)/m2/gm2-libs/SYSTEM.def -o $(objdir)/m2/SYSTEM-pim.texi
-	$(STAMP) SYSTEM-pim-texi-check
 else
 SYSTEM-pim-texi-check: $(objdir)/m2/gm2-libs/SYSTEM.def
-	echo "not building SYSTEM-pim.texi as python3 has not been found"
-	touch $(objdir)/m2/SYSTEM-pim.texi
+	cp $(srcdir)/m2/target-independent/SYSTEM-pim.texi $(objdir)/m2/SYSTEM-pim.texi
 endif
+	$(STAMP) SYSTEM-pim-texi-check
 
 # SYSTEM-pim.rst
 
@@ -223,12 +220,11 @@ m2/SYSTEM-pim.rst: SYSTEM-pim-rst-check; @true
 ifeq ($(HAVE_PYTHON),yes)
 SYSTEM-pim-rst-check: $(objdir)/m2/gm2-libs/SYSTEM.def
 	$(PYTHON) $(srcdir)/m2/tools-src/def2doc.py -x -b$(objdir)/m2 -f$(objdir)/m2/gm2-libs/SYSTEM.def -o $(objdir)/m2/SYSTEM-pim.rst
-	$(STAMP) SYSTEM-pim-rst-check
 else
 SYSTEM-pim-rst-check: $(objdir)/m2/gm2-libs/SYSTEM.def
-	echo "not building SYSTEM-pim.rst as python3 has not been found"
-	touch $(objdir)/m2/SYSTEM-pim.rst
+	cp $(srcdir)/m2/target-independent/SYSTEM-pim.rst $(objdir)/m2/SYSTEM-pim.rst
 endif
+	$(STAMP) SYSTEM-pim-rst-check
 
 # SYSTEM-pim.texi
 
@@ -237,12 +233,11 @@ m2/SYSTEM-iso.texi:  SYSTEM-iso.texi-check; @true
 ifeq ($(HAVE_PYTHON),yes)
 SYSTEM-iso.texi-check:  $(objdir)/m2/gm2-libs-iso/SYSTEM.def
 	$(PYTHON) $(srcdir)/m2/tools-src/def2doc.py -t -b$(objdir)/m2 -f$(objdir)/m2/gm2-libs-iso/SYSTEM.def -o $(objdir)/m2/SYSTEM-iso.texi
-	$(STAMP) SYSTEM-iso.texi-check
 else
 SYSTEM-iso.texi-check:  $(objdir)/m2/gm2-libs-iso/SYSTEM.def
-	echo "not building SYSTEM-iso.texi as python3 has not been found"
-	touch $(objdir)/m2/SYSTEM-iso.texi
+	cp $(srcdir)/m2/target-independent/SYSTEM-iso.texi $(objdir)/m2/SYSTEM-iso.texi
 endif
+	$(STAMP) SYSTEM-iso.texi-check
 
 # SYSTEM-pim.rst
 
@@ -251,12 +246,12 @@ m2/SYSTEM-iso.rst:  SYSTEM-iso.rst-check; @true
 ifeq ($(HAVE_PYTHON),yes)
 SYSTEM-iso.rst-check:  $(objdir)/m2/gm2-libs-iso/SYSTEM.def
 	$(PYTHON) $(srcdir)/m2/tools-src/def2doc.py -x -b$(objdir)/m2 -f$(objdir)/m2/gm2-libs-iso/SYSTEM.def -o $(objdir)/m2/SYSTEM-iso.rst
-	$(STAMP) SYSTEM-iso.rst-check
 else
 SYSTEM-iso.rst-check:  $(objdir)/m2/gm2-libs-iso/SYSTEM.def
-	echo "not building SYSTEM-iso.rst as python3 has not been found"
-	touch $(objdir)/m2/SYSTEM-iso.rst
+	cp $(srcdir)/m2/target-independent/SYSTEM-iso.rst $(objdir)/m2/SYSTEM-iso.rst
 endif
+	$(STAMP) SYSTEM-iso.rst-check
+
 
 # m2/Builtins.texi
 
@@ -265,12 +260,11 @@ m2/Builtins.texi:  Builtins.texi-check; @true
 ifeq ($(HAVE_PYTHON),yes)
 Builtins.texi-check:  m2/gm2-libs/Builtins.def
 	$(PYTHON) $(srcdir)/m2/tools-src/def2doc.py -t -b./ -f$(srcdir)/m2/gm2-libs/Builtins.def -o $(objdir)/m2/Builtins.texi
-	$(STAMP) Builtins.texi-check
 else
 Builtins.texi-check:  m2/gm2-libs/Builtins.def
-	echo "not building SYSTEM-iso.texi as python3 has not been found"
-	touch $(objdir)/m2/Builtins.texi
+	cp $(srcdir)/m2/target-independent/Builtins.texi $(objdir)/m2/Builtins.texi
 endif
+	$(STAMP) Builtins.texi-check
 
 # m2/Builtins.rst
 
@@ -279,12 +273,11 @@ m2/Builtins.rst:  Builtins.rst-check; @true
 ifeq ($(HAVE_PYTHON),yes)
 Builtins.rst-check:  m2/gm2-libs/Builtins.def
 	$(PYTHON) $(srcdir)/m2/tools-src/def2doc.py -x -b./ -f$(srcdir)/m2/gm2-libs/Builtins.def -o $(objdir)/m2/Builtins.rst
-	$(STAMP) Builtins.rst-check
 else
 Builtins.rst-check:  m2/gm2-libs/Builtins.def
-	echo "not building SYSTEM-iso.rst as python3 has not been found"
-	touch $(objdir)/m2/Builtins.rst
+	cp $(srcdir)/m2/target-independent/Builtins.rst $(objdir)/m2/Builtins.rst
 endif
+	$(STAMP) Builtins.rst-check
 
 $(objdir)/m2/gm2-compiler-boot:
 	test -d $@ || mkdir $@
diff --git a/gcc/m2/Make-maintainer.in b/gcc/m2/Make-maintainer.in
index 881876f952f..bdeda8c1c9b 100644
--- a/gcc/m2/Make-maintainer.in
+++ b/gcc/m2/Make-maintainer.in
@@ -825,3 +825,28 @@ m2/gm2-compiler-paranoid/M2Version.o: m2/gm2-compiler-paranoid/M2Version.mod
 
 m2/gm2-compiler-paranoid/%.mod: $(srcdir)/m2/gm2-compiler/%.bnf $(PGE)
 	$(PGE) -k -l $< -o $@
+
+# Recreate the target independent copies of the documentation
+# which is used during the build if Python3 is unavailable.
+
+m2-target-independent-doc: m2-target-independent-doc-texi m2-target-independent-doc-rst
+
+m2-target-independent-doc-texi: force
+ifeq ($(HAVE_PYTHON),yes)
+	python3 $(srcdir)/m2/tools-src/def2doc.py -t -b$(srcdir)/m2 -f$(srcdir)/m2/gm2-libs-iso/SYSTEM.def -o $(srcdir)/m2/target-independent/SYSTEM-iso.texi
+	python3 $(srcdir)/m2/tools-src/def2doc.py -t -b$(srcdir)/m2 -f$(srcdir)/m2/gm2-libs/SYSTEM.def -o $(srcdir)/m2/target-independent/SYSTEM-pim.texi
+	python3 $(srcdir)/m2/tools-src/def2doc.py -t -b$(srcdir)/m2 -f$(srcdir)/m2/gm2-libs/Builtins.def -o $(srcdir)/m2/target-independent/Builtins.texi
+	python3 $(srcdir)/m2/tools-src/def2doc.py -t -uLibraries -s$(srcdir)/m2 -b$(srcdir)/m2 -o $(srcdir)/m2/target-independent/gm2-libs.texi
+else
+	echo "m2-target-independent-doc-texi will only work if Python3 was detected during configure"
+endif
+
+m2-target-independent-doc-rst: force
+ifeq ($(HAVE_PYTHON),yes)
+	python3 $(srcdir)/m2/tools-src/def2doc.py -x -b$(srcdir)/m2 -f$(srcdir)/m2/gm2-libs-iso/SYSTEM.def -o $(srcdir)/m2/target-independent/SYSTEM-iso.rst
+	python3 $(srcdir)/m2/tools-src/def2doc.py -x -b$(srcdir)/m2 -f$(srcdir)/m2/gm2-libs/SYSTEM.def -o $(srcdir)/m2/target-independent/SYSTEM-pim.rst
+	python3 $(srcdir)/m2/tools-src/def2doc.py -x -b$(srcdir)/m2 -f$(srcdir)/m2/gm2-libs/Builtins.def -o $(srcdir)/m2/target-independent/Builtins.rst
+	python3 $(srcdir)/m2/tools-src/def2doc.py -x -uLibraries -s$(srcdir)/m2 -b$(srcdir)/m2 -o $(srcdir)/m2/target-independent/gm2-libs.rst
+else
+	echo "m2-target-independent-doc-rst will only work if Python3 was detected during configure"
+endif
diff --git a/gcc/m2/gm2-libs-coroutines/SYSTEM.def b/gcc/m2/gm2-libs-coroutines/SYSTEM.def
index c962be9e4a0..4ceb284569b 100644
--- a/gcc/m2/gm2-libs-coroutines/SYSTEM.def
+++ b/gcc/m2/gm2-libs-coroutines/SYSTEM.def
@@ -37,12 +37,12 @@ EXPORT QUALIFIED (* the following are built into the compiler: *)
                  ADDRESS, WORD, BYTE, CSIZE_T, CSSIZE_T, (* @SYSTEM_DATATYPES@ *)
                  ADR, TSIZE, ROTATE, SHIFT, THROW, TBITSIZE,
                  (* SIZE is exported depending upon -fpim2 and
-                    -fpedantic *)
-                 (* and the rest are implemented in SYSTEM.mod *)
+                    -fpedantic.  *)
+                 (* The rest are implemented in SYSTEM.mod.  *)
                  PROCESS, TRANSFER, NEWPROCESS, IOTRANSFER,
                  LISTEN,
                  ListenLoop, TurnInterrupts,
-                 (* Internal GM2 compiler functions *)
+                 (* Internal GM2 compiler functions.  *)
                  ShiftVal, ShiftLeft, ShiftRight,
                  RotateVal, RotateLeft, RotateRight ;
 
@@ -79,7 +79,7 @@ PROCEDURE NEWPROCESS (p: PROC; a: ADDRESS; StackSize: CARDINAL; VAR new: PROCESS
    IOTRANSFER - saves the current volatile environment into, First,
                 and restores volatile environment, Second.
                 When an interrupt, InterruptNo, is encountered then
-                the reverse takes place. (The then current volatile
+                the reverse takes place.  (The then current volatile
                 environment is shelved onto Second and First is resumed).
 
                 NOTE: that upon interrupt the Second might not be the
@@ -109,8 +109,8 @@ PROCEDURE LISTEN ;
                 via a call to pth_select.
                 It also checks for deadlock.
                 This function returns when an interrupt occurs ie
-                a file descriptor becomes ready or a time event expires.
-                See the module RTint.
+                a file descriptor becomes ready or a time event
+                expires.  See the module RTint.
 *)
 
 PROCEDURE ListenLoop ;
@@ -178,9 +178,9 @@ PROCEDURE TBITSIZE (<type>) : CARDINAL ;
 *)
 
 (* The following procedures are invoked by GNU Modula-2 to
-   shift non word sized set types. They are not strictly part
-   of the core PIM Modula-2, however they are used by
-   GNU Modula-2 to implement the SHIFT procedure defined above,
+   shift non word sized set types.  They are not strictly part
+   of the core PIM Modula-2, however they are used
+   to implement the SHIFT procedure defined above,
    which are in turn used by the Logitech compatible libraries.
 
    Users will access these procedures by using the procedure
@@ -191,8 +191,8 @@ PROCEDURE TBITSIZE (<type>) : CARDINAL ;
 (*
    ShiftVal - is a runtime procedure whose job is to implement
               the SHIFT procedure of ISO SYSTEM. GNU Modula-2 will
-              inline a SHIFT of a single WORD sized set and will only
-              call this routine for larger sets.
+              inline a SHIFT of a single WORD sized set and will
+              only call this routine for larger sets.
 *)
 
 PROCEDURE ShiftVal (VAR s, d: ARRAY OF BITSET;
@@ -203,8 +203,8 @@ PROCEDURE ShiftVal (VAR s, d: ARRAY OF BITSET;
 (*
    ShiftLeft - performs the shift left for a multi word set.
                This procedure might be called by the back end of
-               GNU Modula-2 depending whether amount is known at compile
-               time.
+               GNU Modula-2 depending whether amount is known at
+               compile time.
 *)
 
 PROCEDURE ShiftLeft (VAR s, d: ARRAY OF BITSET;
@@ -214,8 +214,8 @@ PROCEDURE ShiftLeft (VAR s, d: ARRAY OF BITSET;
 (*
    ShiftRight - performs the shift left for a multi word set.
                 This procedure might be called by the back end of
-                GNU Modula-2 depending whether amount is known at compile
-                time.
+                GNU Modula-2 depending whether amount is known at
+                compile time.
 *)
 
 PROCEDURE ShiftRight (VAR s, d: ARRAY OF BITSET;
@@ -225,9 +225,10 @@ PROCEDURE ShiftRight (VAR s, d: ARRAY OF BITSET;
 
 (*
    RotateVal - is a runtime procedure whose job is to implement
-               the ROTATE procedure of ISO SYSTEM. GNU Modula-2 will
+               the ROTATE procedure of ISO SYSTEM.  GNU Modula-2 will
                inline a ROTATE of a single WORD (or less)
-               sized set and will only call this routine for larger sets.
+               sized set and will only call this routine for
+               larger sets.
 *)
 
 PROCEDURE RotateVal (VAR s, d: ARRAY OF BITSET;
@@ -238,8 +239,8 @@ PROCEDURE RotateVal (VAR s, d: ARRAY OF BITSET;
 (*
    RotateLeft - performs the rotate left for a multi word set.
                 This procedure might be called by the back end of
-                GNU Modula-2 depending whether amount is known at compile
-                time.
+                GNU Modula-2 depending whether amount is known
+                at compile time.
 *)
 
 PROCEDURE RotateLeft (VAR s, d: ARRAY OF BITSET;
@@ -250,8 +251,8 @@ PROCEDURE RotateLeft (VAR s, d: ARRAY OF BITSET;
 (*
    RotateRight - performs the rotate right for a multi word set.
                  This procedure might be called by the back end of
-                 GNU Modula-2 depending whether amount is known at compile
-                 time.
+                 GNU Modula-2 depending whether amount is known at
+                 compile time.
 *)
 
 PROCEDURE RotateRight (VAR s, d: ARRAY OF BITSET;
diff --git a/gcc/m2/gm2-libs-iso/README.texi b/gcc/m2/gm2-libs-iso/README.texi
index 4f523e4d253..99bb758f056 100644
--- a/gcc/m2/gm2-libs-iso/README.texi
+++ b/gcc/m2/gm2-libs-iso/README.texi
@@ -1,5 +1,5 @@
 @c README.texi describes the ISO libraries.
-@c Copyright @copyright{} 2000-2020 Free Software Foundation, Inc.
+@c Copyright @copyright{} 2000-2022 Free Software Foundation, Inc.
 @c
 @c This is part of the GM2 manual.
 @c For copying conditions, see the file gcc/doc/include/fdl.texi.
diff --git a/gcc/m2/gm2-libs-iso/SYSTEM.def b/gcc/m2/gm2-libs-iso/SYSTEM.def
index 21ef07184dc..638b50b3c8d 100644
--- a/gcc/m2/gm2-libs-iso/SYSTEM.def
+++ b/gcc/m2/gm2-libs-iso/SYSTEM.def
@@ -17,7 +17,7 @@ DEFINITION MODULE SYSTEM;
   (* The constants and types define underlying properties of storage *)
 
 EXPORT QUALIFIED BITSPERLOC, LOCSPERWORD,
-                 LOC, BYTE, WORD, ADDRESS, CSIZE_T, CSSIZE_T, (* @SYSTEM_DATATYPES@ *)
+                 LOC, BYTE, WORD, ADDRESS, CSIZE_T, CSSIZE_T, (* @SYSTEM_DATATYPES@  *)
                  ADDADR, SUBADR, DIFADR, MAKEADR, ADR, ROTATE,
                  SHIFT, CAST, TSIZE,
 
@@ -144,8 +144,7 @@ PROCEDURE TBITSIZE (<type>) : CARDINAL ;
 
 (* The following procedures are invoked by GNU Modula-2 to
    shift non word set types. They are not part of ISO Modula-2
-   but are used by GNU Modula-2 to implement the SHIFT procedure
-   defined above. *)
+   but are used to implement the SHIFT procedure defined above. *)
 
 (*
    ShiftVal - is a runtime procedure whose job is to implement
diff --git a/gcc/m2/gm2-libs/README.texi b/gcc/m2/gm2-libs/README.texi
index bde93ba0fd8..0de04ff8436 100644
--- a/gcc/m2/gm2-libs/README.texi
+++ b/gcc/m2/gm2-libs/README.texi
@@ -1,5 +1,5 @@
 @c README.texi describes the pim libraries.
-@c Copyright @copyright{} 2000-2020 Free Software Foundation, Inc.
+@c Copyright @copyright{} 2000-2022 Free Software Foundation, Inc.
 @c
 @c This is part of the GM2 manual.
 @c For copying conditions, see the file gcc/doc/include/fdl.texi.
diff --git a/gcc/m2/gm2-libs/SYSTEM.def b/gcc/m2/gm2-libs/SYSTEM.def
index 938b6bf8d20..8b32c54f898 100644
--- a/gcc/m2/gm2-libs/SYSTEM.def
+++ b/gcc/m2/gm2-libs/SYSTEM.def
@@ -27,9 +27,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 DEFINITION MODULE SYSTEM ;
 
 EXPORT QUALIFIED BITSPERBYTE, BYTESPERWORD,
-                 ADDRESS, WORD, BYTE, CSIZE_T, CSSIZE_T, (* @SYSTEM_DATATYPES@ *)
+                 ADDRESS, WORD, BYTE, CSIZE_T, CSSIZE_T, (* @SYSTEM_DATATYPES@  *)
                  ADR, TSIZE, ROTATE, SHIFT, THROW, TBITSIZE ;
-                 (* SIZE is also exported if -fpim2 is used *)
+                 (* SIZE is also exported if -fpim2 is used,  *)
 
 CONST
   BITSPERBYTE   = __ATTRIBUTE__ __BUILTIN__ ((BITS_PER_UNIT)) ;
@@ -99,8 +99,8 @@ PROCEDURE TBITSIZE (<type>) : CARDINAL ;
 
 (* The following procedures are invoked by GNU Modula-2 to
    shift non word sized set types. They are not strictly part
-   of the core PIM Modula-2, however they are used by
-   GNU Modula-2 to implement the SHIFT procedure defined above,
+   of the core PIM Modula-2, however they are used
+   to implement the SHIFT procedure defined above,
    which are in turn used by the Logitech compatible libraries.
 
    Users will access these procedures by using the procedure
diff --git a/gcc/m2/target-independent/Builtins.rst b/gcc/m2/target-independent/Builtins.rst
new file mode 100644
index 00000000000..7a507590a2c
--- /dev/null
+++ b/gcc/m2/target-independent/Builtins.rst
@@ -0,0 +1,587 @@
+
+.. code-block:: modula2
+    DEFINITION MODULE Builtins ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    
+    (* floating point intrinsic procedure functions *)
+    
+.. index::
+   isfinitef
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ isfinitef (x: SHORTREAL) : BOOLEAN ;
+.. index::
+   isfinite
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ isfinite (x: REAL) : BOOLEAN ;
+.. index::
+   isfinitel
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ isfinitel (x: LONGREAL) : BOOLEAN ;
+    
+.. index::
+   sinf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sinf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   sin
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sin (x: REAL) : REAL ;
+.. index::
+   sinl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sinl (x: LONGREAL) : LONGREAL ;
+    
+.. index::
+   cosf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cosf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   cos
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cos (x: REAL) : REAL ;
+.. index::
+   cosl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cosl (x: LONGREAL) : LONGREAL ;
+    
+.. index::
+   sqrtf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sqrtf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   sqrt
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sqrt (x: REAL) : REAL ;
+.. index::
+   sqrtl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sqrtl (x: LONGREAL) : LONGREAL ;
+    
+.. index::
+   atan2f
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ atan2f (x, y: SHORTREAL) : SHORTREAL ;
+.. index::
+   atan2
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ atan2 (x, y: REAL) : REAL ;
+.. index::
+   atan2l
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ atan2l (x, y: LONGREAL) : LONGREAL ;
+    
+.. index::
+   fabsf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ fabsf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   fabs
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ fabs (x: REAL) : REAL ;
+.. index::
+   fabsl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ fabsl (x: LONGREAL) : LONGREAL ;
+    
+.. index::
+   logf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ logf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   log
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ log (x: REAL) : REAL ;
+.. index::
+   logl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ logl (x: LONGREAL) : LONGREAL ;
+    
+.. index::
+   expf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ expf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   exp
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ exp (x: REAL) : REAL ;
+.. index::
+   expl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ expl (x: LONGREAL) : LONGREAL ;
+    
+.. index::
+   log10f
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ log10f (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   log10
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ log10 (x: REAL) : REAL ;
+.. index::
+   log10l
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ log10l (x: LONGREAL) : LONGREAL ;
+    
+.. index::
+   exp10f
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ exp10f (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   exp10
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ exp10 (x: REAL) : REAL ;
+.. index::
+   exp10l
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ exp10l (x: LONGREAL) : LONGREAL ;
+    
+.. index::
+   ilogbf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ilogbf (x: SHORTREAL) : INTEGER ;
+.. index::
+   ilogb
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ilogb (x: REAL) : INTEGER ;
+.. index::
+   ilogbl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ilogbl (x: LONGREAL) : INTEGER ;
+    
+.. index::
+   huge_val
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ huge_val () : REAL ;
+.. index::
+   huge_valf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ huge_valf () : SHORTREAL ;
+.. index::
+   huge_vall
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ huge_vall () : LONGREAL ;
+    
+.. index::
+   significand
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ significand (r: REAL) : REAL ;
+.. index::
+   significandf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ significandf (s: SHORTREAL) : SHORTREAL ;
+.. index::
+   significandl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ significandl (l: LONGREAL) : LONGREAL ;
+    
+.. index::
+   modf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ modf (x: REAL; VAR y: REAL) : REAL ;
+.. index::
+   modff
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ modff (x: SHORTREAL;
+                                 VAR y: SHORTREAL) : SHORTREAL ;
+.. index::
+   modfl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ modfl (x: LONGREAL; VAR y: LONGREAL) : LONGREAL ;
+    
+.. index::
+   signbit
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ signbit (r: REAL) : INTEGER ;
+.. index::
+   signbitf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ signbitf (s: SHORTREAL) : INTEGER ;
+.. index::
+   signbitl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ signbitl (l: LONGREAL) : INTEGER ;
+    
+.. index::
+   nextafter
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ nextafter (x, y: REAL) : REAL ;
+.. index::
+   nextafterf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ nextafterf (x, y: SHORTREAL) : SHORTREAL ;
+.. index::
+   nextafterl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ nextafterl (x, y: LONGREAL) : LONGREAL ;
+    
+.. index::
+   nexttoward
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ nexttoward (x, y: REAL) : LONGREAL ;
+.. index::
+   nexttowardf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ nexttowardf (x, y: SHORTREAL) : LONGREAL ;
+.. index::
+   nexttowardl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ nexttowardl (x, y: LONGREAL) : LONGREAL ;
+    
+.. index::
+   scalb
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ scalb (x, n: REAL) : REAL ;
+.. index::
+   scalbf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ scalbf (x, n: SHORTREAL) : SHORTREAL ;
+.. index::
+   scalbl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ scalbl (x, n: LONGREAL) : LONGREAL ;
+    
+.. index::
+   scalbln
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ scalbln (x: REAL; n: LONGINT) : REAL ;
+.. index::
+   scalblnf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ scalblnf (x: SHORTREAL; n: LONGINT) : SHORTREAL ;
+.. index::
+   scalblnl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ scalblnl (x: LONGREAL; n: LONGINT) : LONGREAL ;
+    
+.. index::
+   scalbn
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ scalbn (x: REAL; n: INTEGER) : REAL ;
+.. index::
+   scalbnf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ scalbnf (x: SHORTREAL; n: INTEGER) : SHORTREAL ;
+.. index::
+   scalbnl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ scalbnl (x: LONGREAL; n: INTEGER) : LONGREAL ;
+    
+    (* complex arithmetic intrincic procedure functions *)
+    
+.. index::
+   cabsf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cabsf (z: SHORTCOMPLEX) : SHORTREAL ;
+.. index::
+   cabs
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cabs (z: COMPLEX) : REAL ;
+.. index::
+   cabsl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cabsl (z: LONGCOMPLEX) : LONGREAL ;
+    
+.. index::
+   cargf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cargf (z: SHORTCOMPLEX) : SHORTREAL ;
+.. index::
+   carg
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carg (z: COMPLEX) : REAL ;
+.. index::
+   cargl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cargl (z: LONGCOMPLEX) : LONGREAL ;
+    
+.. index::
+   conjf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ conjf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   conj
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ conj (z: COMPLEX) : COMPLEX ;
+.. index::
+   conjl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ conjl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   cpowerf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cpowerf (base: SHORTCOMPLEX;
+                                   exp: SHORTREAL) : SHORTCOMPLEX ;
+.. index::
+   cpower
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cpower (base: COMPLEX; exp: REAL) : COMPLEX ;
+.. index::
+   cpowerl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cpowerl (base: LONGCOMPLEX;
+                                   exp: LONGREAL) : LONGCOMPLEX ;
+    
+.. index::
+   csqrtf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ csqrtf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   csqrt
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ csqrt (z: COMPLEX) : COMPLEX ;
+.. index::
+   csqrtl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ csqrtl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   cexpf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cexpf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   cexp
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cexp (z: COMPLEX) : COMPLEX ;
+.. index::
+   cexpl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cexpl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   clnf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ clnf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   cln
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cln (z: COMPLEX) : COMPLEX ;
+.. index::
+   clnl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ clnl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   csinf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ csinf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   csin
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ csin (z: COMPLEX) : COMPLEX ;
+.. index::
+   csinl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ csinl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   ccosf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ccosf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   ccos
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ccos (z: COMPLEX) : COMPLEX ;
+.. index::
+   ccosl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ccosl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   ctanf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ctanf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   ctan
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ctan (z: COMPLEX) : COMPLEX ;
+.. index::
+   ctanl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ctanl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   carcsinf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carcsinf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   carcsin
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carcsin (z: COMPLEX) : COMPLEX ;
+.. index::
+   carcsinl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carcsinl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   carccosf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carccosf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   carccos
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carccos (z: COMPLEX) : COMPLEX ;
+.. index::
+   carccosl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carccosl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   carctanf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carctanf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   carctan
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carctan (z: COMPLEX) : COMPLEX ;
+.. index::
+   carctanl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carctanl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+    (* memory and string intrincic procedure functions *)
+    
+.. index::
+   alloca
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ alloca (i: CARDINAL) : ADDRESS ;
+.. index::
+   memcpy
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ memcpy (dest, src: ADDRESS;
+                                  nbytes: CARDINAL) : ADDRESS ;
+.. index::
+   index
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ index (s: ADDRESS; c: INTEGER) : ADDRESS ;
+.. index::
+   rindex
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ rindex (s: ADDRESS; c: INTEGER) : ADDRESS ;
+.. index::
+   memcmp
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ memcmp (s1, s2: ADDRESS;
+                                  nbytes: CARDINAL) : INTEGER ;
+.. index::
+   memset
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ memset (s: ADDRESS; c: INTEGER;
+                                  nbytes: CARDINAL) : ADDRESS ;
+.. index::
+   memmove
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ memmove (s1, s2: ADDRESS;
+                                   nbytes: CARDINAL) : ADDRESS ;
+.. index::
+   strcat
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strcat (dest, src: ADDRESS) : ADDRESS ;
+.. index::
+   strncat
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strncat (dest, src: ADDRESS;
+                                   nbytes: CARDINAL) : ADDRESS ;
+.. index::
+   strcpy
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strcpy (dest, src: ADDRESS) : ADDRESS ;
+.. index::
+   strncpy
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strncpy (dest, src: ADDRESS;
+                                   nbytes: CARDINAL) : ADDRESS ;
+.. index::
+   strcmp
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strcmp (s1, s2: ADDRESS) : INTEGER ;
+.. index::
+   strncmp
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strncmp (s1, s2: ADDRESS;
+                                   nbytes: CARDINAL) : INTEGER ;
+.. index::
+   strlen
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strlen (s: ADDRESS) : INTEGER ;
+.. index::
+   strstr
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strstr (haystack, needle: ADDRESS) : ADDRESS ;
+.. index::
+   strpbrk
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strpbrk (s, accept: ADDRESS) : ADDRESS ;
+.. index::
+   strspn
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strspn (s, accept: ADDRESS) : CARDINAL ;
+.. index::
+   strcspn
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strcspn (s, accept: ADDRESS) : CARDINAL ;
+.. index::
+   strchr
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strchr (s: ADDRESS; c: INTEGER) : ADDRESS ;
+.. index::
+   strrchr
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strrchr (s: ADDRESS; c: INTEGER) : ADDRESS ;
+    
+    (*
+       longjmp - this GCC builtin restricts the val to always 1.
+    *)
+    (* do not use these two builtins, as gcc, only really
+       anticipates that the Ada front end should use them
+       and it only uses them in its runtime exception handling.
+       We leave them here in the hope that someday they will
+       behave more like their libc counterparts.  *)
+    
+.. index::
+   longjmp
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ longjmp (env: ADDRESS; val: INTEGER) ;
+.. index::
+   setjmp
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ setjmp (env: ADDRESS) : INTEGER ;
+    
+    
+    (*
+       frame_address - returns the address of the frame.
+                       The current frame is obtained if level is 0,
+                       the next level up if level is 1 etc.
+    *)
+    
+.. index::
+   frame_address
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ frame_address (level: CARDINAL) : ADDRESS ;
+    
+    
+    (*
+       return_address - returns the return address of function.
+                        The current function return address is
+                        obtained if level is 0,
+                        the next level up if level is 1 etc.
+    *)
+    
+.. index::
+   return_address
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ return_address (level: CARDINAL) : ADDRESS ;
+    
+    
+    (*
+       alloca_trace - this is a no-op which is used for internal debugging.
+    *)
+    
+.. index::
+   alloca_trace
+.. code-block:: modula2
+    PROCEDURE alloca_trace (returned: ADDRESS; nBytes: CARDINAL) : ADDRESS ;
+    
+    
+    END Builtins.
diff --git a/gcc/m2/target-independent/Builtins.texi b/gcc/m2/target-independent/Builtins.texi
new file mode 100644
index 00000000000..6ab1f2b32e0
--- /dev/null
+++ b/gcc/m2/target-independent/Builtins.texi
@@ -0,0 +1,340 @@
+
+@example
+DEFINITION MODULE Builtins ;
+
+FROM SYSTEM IMPORT ADDRESS ;
+
+(* floating point intrinsic procedure functions *)
+
+@findex isfinitef
+PROCEDURE __BUILTIN__ isfinitef (x: SHORTREAL) : BOOLEAN ;
+@findex isfinite
+PROCEDURE __BUILTIN__ isfinite (x: REAL) : BOOLEAN ;
+@findex isfinitel
+PROCEDURE __BUILTIN__ isfinitel (x: LONGREAL) : BOOLEAN ;
+
+@findex sinf
+PROCEDURE __BUILTIN__ sinf (x: SHORTREAL) : SHORTREAL ;
+@findex sin
+PROCEDURE __BUILTIN__ sin (x: REAL) : REAL ;
+@findex sinl
+PROCEDURE __BUILTIN__ sinl (x: LONGREAL) : LONGREAL ;
+
+@findex cosf
+PROCEDURE __BUILTIN__ cosf (x: SHORTREAL) : SHORTREAL ;
+@findex cos
+PROCEDURE __BUILTIN__ cos (x: REAL) : REAL ;
+@findex cosl
+PROCEDURE __BUILTIN__ cosl (x: LONGREAL) : LONGREAL ;
+
+@findex sqrtf
+PROCEDURE __BUILTIN__ sqrtf (x: SHORTREAL) : SHORTREAL ;
+@findex sqrt
+PROCEDURE __BUILTIN__ sqrt (x: REAL) : REAL ;
+@findex sqrtl
+PROCEDURE __BUILTIN__ sqrtl (x: LONGREAL) : LONGREAL ;
+
+@findex atan2f
+PROCEDURE __BUILTIN__ atan2f (x, y: SHORTREAL) : SHORTREAL ;
+@findex atan2
+PROCEDURE __BUILTIN__ atan2 (x, y: REAL) : REAL ;
+@findex atan2l
+PROCEDURE __BUILTIN__ atan2l (x, y: LONGREAL) : LONGREAL ;
+
+@findex fabsf
+PROCEDURE __BUILTIN__ fabsf (x: SHORTREAL) : SHORTREAL ;
+@findex fabs
+PROCEDURE __BUILTIN__ fabs (x: REAL) : REAL ;
+@findex fabsl
+PROCEDURE __BUILTIN__ fabsl (x: LONGREAL) : LONGREAL ;
+
+@findex logf
+PROCEDURE __BUILTIN__ logf (x: SHORTREAL) : SHORTREAL ;
+@findex log
+PROCEDURE __BUILTIN__ log (x: REAL) : REAL ;
+@findex logl
+PROCEDURE __BUILTIN__ logl (x: LONGREAL) : LONGREAL ;
+
+@findex expf
+PROCEDURE __BUILTIN__ expf (x: SHORTREAL) : SHORTREAL ;
+@findex exp
+PROCEDURE __BUILTIN__ exp (x: REAL) : REAL ;
+@findex expl
+PROCEDURE __BUILTIN__ expl (x: LONGREAL) : LONGREAL ;
+
+@findex log10f
+PROCEDURE __BUILTIN__ log10f (x: SHORTREAL) : SHORTREAL ;
+@findex log10
+PROCEDURE __BUILTIN__ log10 (x: REAL) : REAL ;
+@findex log10l
+PROCEDURE __BUILTIN__ log10l (x: LONGREAL) : LONGREAL ;
+
+@findex exp10f
+PROCEDURE __BUILTIN__ exp10f (x: SHORTREAL) : SHORTREAL ;
+@findex exp10
+PROCEDURE __BUILTIN__ exp10 (x: REAL) : REAL ;
+@findex exp10l
+PROCEDURE __BUILTIN__ exp10l (x: LONGREAL) : LONGREAL ;
+
+@findex ilogbf
+PROCEDURE __BUILTIN__ ilogbf (x: SHORTREAL) : INTEGER ;
+@findex ilogb
+PROCEDURE __BUILTIN__ ilogb (x: REAL) : INTEGER ;
+@findex ilogbl
+PROCEDURE __BUILTIN__ ilogbl (x: LONGREAL) : INTEGER ;
+
+@findex huge_val
+PROCEDURE __BUILTIN__ huge_val () : REAL ;
+@findex huge_valf
+PROCEDURE __BUILTIN__ huge_valf () : SHORTREAL ;
+@findex huge_vall
+PROCEDURE __BUILTIN__ huge_vall () : LONGREAL ;
+
+@findex significand
+PROCEDURE __BUILTIN__ significand (r: REAL) : REAL ;
+@findex significandf
+PROCEDURE __BUILTIN__ significandf (s: SHORTREAL) : SHORTREAL ;
+@findex significandl
+PROCEDURE __BUILTIN__ significandl (l: LONGREAL) : LONGREAL ;
+
+@findex modf
+PROCEDURE __BUILTIN__ modf (x: REAL; VAR y: REAL) : REAL ;
+@findex modff
+PROCEDURE __BUILTIN__ modff (x: SHORTREAL;
+                             VAR y: SHORTREAL) : SHORTREAL ;
+@findex modfl
+PROCEDURE __BUILTIN__ modfl (x: LONGREAL; VAR y: LONGREAL) : LONGREAL ;
+
+@findex signbit
+PROCEDURE __BUILTIN__ signbit (r: REAL) : INTEGER ;
+@findex signbitf
+PROCEDURE __BUILTIN__ signbitf (s: SHORTREAL) : INTEGER ;
+@findex signbitl
+PROCEDURE __BUILTIN__ signbitl (l: LONGREAL) : INTEGER ;
+
+@findex nextafter
+PROCEDURE __BUILTIN__ nextafter (x, y: REAL) : REAL ;
+@findex nextafterf
+PROCEDURE __BUILTIN__ nextafterf (x, y: SHORTREAL) : SHORTREAL ;
+@findex nextafterl
+PROCEDURE __BUILTIN__ nextafterl (x, y: LONGREAL) : LONGREAL ;
+
+@findex nexttoward
+PROCEDURE __BUILTIN__ nexttoward (x, y: REAL) : LONGREAL ;
+@findex nexttowardf
+PROCEDURE __BUILTIN__ nexttowardf (x, y: SHORTREAL) : LONGREAL ;
+@findex nexttowardl
+PROCEDURE __BUILTIN__ nexttowardl (x, y: LONGREAL) : LONGREAL ;
+
+@findex scalb
+PROCEDURE __BUILTIN__ scalb (x, n: REAL) : REAL ;
+@findex scalbf
+PROCEDURE __BUILTIN__ scalbf (x, n: SHORTREAL) : SHORTREAL ;
+@findex scalbl
+PROCEDURE __BUILTIN__ scalbl (x, n: LONGREAL) : LONGREAL ;
+
+@findex scalbln
+PROCEDURE __BUILTIN__ scalbln (x: REAL; n: LONGINT) : REAL ;
+@findex scalblnf
+PROCEDURE __BUILTIN__ scalblnf (x: SHORTREAL; n: LONGINT) : SHORTREAL ;
+@findex scalblnl
+PROCEDURE __BUILTIN__ scalblnl (x: LONGREAL; n: LONGINT) : LONGREAL ;
+
+@findex scalbn
+PROCEDURE __BUILTIN__ scalbn (x: REAL; n: INTEGER) : REAL ;
+@findex scalbnf
+PROCEDURE __BUILTIN__ scalbnf (x: SHORTREAL; n: INTEGER) : SHORTREAL ;
+@findex scalbnl
+PROCEDURE __BUILTIN__ scalbnl (x: LONGREAL; n: INTEGER) : LONGREAL ;
+
+(* complex arithmetic intrincic procedure functions *)
+
+@findex cabsf
+PROCEDURE __BUILTIN__ cabsf (z: SHORTCOMPLEX) : SHORTREAL ;
+@findex cabs
+PROCEDURE __BUILTIN__ cabs (z: COMPLEX) : REAL ;
+@findex cabsl
+PROCEDURE __BUILTIN__ cabsl (z: LONGCOMPLEX) : LONGREAL ;
+
+@findex cargf
+PROCEDURE __BUILTIN__ cargf (z: SHORTCOMPLEX) : SHORTREAL ;
+@findex carg
+PROCEDURE __BUILTIN__ carg (z: COMPLEX) : REAL ;
+@findex cargl
+PROCEDURE __BUILTIN__ cargl (z: LONGCOMPLEX) : LONGREAL ;
+
+@findex conjf
+PROCEDURE __BUILTIN__ conjf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+@findex conj
+PROCEDURE __BUILTIN__ conj (z: COMPLEX) : COMPLEX ;
+@findex conjl
+PROCEDURE __BUILTIN__ conjl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+
+@findex cpowerf
+PROCEDURE __BUILTIN__ cpowerf (base: SHORTCOMPLEX;
+                               exp: SHORTREAL) : SHORTCOMPLEX ;
+@findex cpower
+PROCEDURE __BUILTIN__ cpower (base: COMPLEX; exp: REAL) : COMPLEX ;
+@findex cpowerl
+PROCEDURE __BUILTIN__ cpowerl (base: LONGCOMPLEX;
+                               exp: LONGREAL) : LONGCOMPLEX ;
+
+@findex csqrtf
+PROCEDURE __BUILTIN__ csqrtf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+@findex csqrt
+PROCEDURE __BUILTIN__ csqrt (z: COMPLEX) : COMPLEX ;
+@findex csqrtl
+PROCEDURE __BUILTIN__ csqrtl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+
+@findex cexpf
+PROCEDURE __BUILTIN__ cexpf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+@findex cexp
+PROCEDURE __BUILTIN__ cexp (z: COMPLEX) : COMPLEX ;
+@findex cexpl
+PROCEDURE __BUILTIN__ cexpl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+
+@findex clnf
+PROCEDURE __BUILTIN__ clnf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+@findex cln
+PROCEDURE __BUILTIN__ cln (z: COMPLEX) : COMPLEX ;
+@findex clnl
+PROCEDURE __BUILTIN__ clnl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+
+@findex csinf
+PROCEDURE __BUILTIN__ csinf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+@findex csin
+PROCEDURE __BUILTIN__ csin (z: COMPLEX) : COMPLEX ;
+@findex csinl
+PROCEDURE __BUILTIN__ csinl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+
+@findex ccosf
+PROCEDURE __BUILTIN__ ccosf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+@findex ccos
+PROCEDURE __BUILTIN__ ccos (z: COMPLEX) : COMPLEX ;
+@findex ccosl
+PROCEDURE __BUILTIN__ ccosl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+
+@findex ctanf
+PROCEDURE __BUILTIN__ ctanf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+@findex ctan
+PROCEDURE __BUILTIN__ ctan (z: COMPLEX) : COMPLEX ;
+@findex ctanl
+PROCEDURE __BUILTIN__ ctanl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+
+@findex carcsinf
+PROCEDURE __BUILTIN__ carcsinf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+@findex carcsin
+PROCEDURE __BUILTIN__ carcsin (z: COMPLEX) : COMPLEX ;
+@findex carcsinl
+PROCEDURE __BUILTIN__ carcsinl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+
+@findex carccosf
+PROCEDURE __BUILTIN__ carccosf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+@findex carccos
+PROCEDURE __BUILTIN__ carccos (z: COMPLEX) : COMPLEX ;
+@findex carccosl
+PROCEDURE __BUILTIN__ carccosl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+
+@findex carctanf
+PROCEDURE __BUILTIN__ carctanf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+@findex carctan
+PROCEDURE __BUILTIN__ carctan (z: COMPLEX) : COMPLEX ;
+@findex carctanl
+PROCEDURE __BUILTIN__ carctanl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+
+(* memory and string intrincic procedure functions *)
+
+@findex alloca
+PROCEDURE __BUILTIN__ alloca (i: CARDINAL) : ADDRESS ;
+@findex memcpy
+PROCEDURE __BUILTIN__ memcpy (dest, src: ADDRESS;
+                              nbytes: CARDINAL) : ADDRESS ;
+@findex index
+PROCEDURE __BUILTIN__ index (s: ADDRESS; c: INTEGER) : ADDRESS ;
+@findex rindex
+PROCEDURE __BUILTIN__ rindex (s: ADDRESS; c: INTEGER) : ADDRESS ;
+@findex memcmp
+PROCEDURE __BUILTIN__ memcmp (s1, s2: ADDRESS;
+                              nbytes: CARDINAL) : INTEGER ;
+@findex memset
+PROCEDURE __BUILTIN__ memset (s: ADDRESS; c: INTEGER;
+                              nbytes: CARDINAL) : ADDRESS ;
+@findex memmove
+PROCEDURE __BUILTIN__ memmove (s1, s2: ADDRESS;
+                               nbytes: CARDINAL) : ADDRESS ;
+@findex strcat
+PROCEDURE __BUILTIN__ strcat (dest, src: ADDRESS) : ADDRESS ;
+@findex strncat
+PROCEDURE __BUILTIN__ strncat (dest, src: ADDRESS;
+                               nbytes: CARDINAL) : ADDRESS ;
+@findex strcpy
+PROCEDURE __BUILTIN__ strcpy (dest, src: ADDRESS) : ADDRESS ;
+@findex strncpy
+PROCEDURE __BUILTIN__ strncpy (dest, src: ADDRESS;
+                               nbytes: CARDINAL) : ADDRESS ;
+@findex strcmp
+PROCEDURE __BUILTIN__ strcmp (s1, s2: ADDRESS) : INTEGER ;
+@findex strncmp
+PROCEDURE __BUILTIN__ strncmp (s1, s2: ADDRESS;
+                               nbytes: CARDINAL) : INTEGER ;
+@findex strlen
+PROCEDURE __BUILTIN__ strlen (s: ADDRESS) : INTEGER ;
+@findex strstr
+PROCEDURE __BUILTIN__ strstr (haystack, needle: ADDRESS) : ADDRESS ;
+@findex strpbrk
+PROCEDURE __BUILTIN__ strpbrk (s, accept: ADDRESS) : ADDRESS ;
+@findex strspn
+PROCEDURE __BUILTIN__ strspn (s, accept: ADDRESS) : CARDINAL ;
+@findex strcspn
+PROCEDURE __BUILTIN__ strcspn (s, accept: ADDRESS) : CARDINAL ;
+@findex strchr
+PROCEDURE __BUILTIN__ strchr (s: ADDRESS; c: INTEGER) : ADDRESS ;
+@findex strrchr
+PROCEDURE __BUILTIN__ strrchr (s: ADDRESS; c: INTEGER) : ADDRESS ;
+
+(*
+   longjmp - this GCC builtin restricts the val to always 1.
+*)
+(* do not use these two builtins, as gcc, only really
+   anticipates that the Ada front end should use them
+   and it only uses them in its runtime exception handling.
+   We leave them here in the hope that someday they will
+   behave more like their libc counterparts.  *)
+
+@findex longjmp
+PROCEDURE __BUILTIN__ longjmp (env: ADDRESS; val: INTEGER) ;
+@findex setjmp
+PROCEDURE __BUILTIN__ setjmp (env: ADDRESS) : INTEGER ;
+
+
+(*
+   frame_address - returns the address of the frame.
+                   The current frame is obtained if level is 0,
+                   the next level up if level is 1 etc.
+*)
+
+@findex frame_address
+PROCEDURE __BUILTIN__ frame_address (level: CARDINAL) : ADDRESS ;
+
+
+(*
+   return_address - returns the return address of function.
+                    The current function return address is
+                    obtained if level is 0,
+                    the next level up if level is 1 etc.
+*)
+
+@findex return_address
+PROCEDURE __BUILTIN__ return_address (level: CARDINAL) : ADDRESS ;
+
+
+(*
+   alloca_trace - this is a no-op which is used for internal debugging.
+*)
+
+@findex alloca_trace
+PROCEDURE alloca_trace (returned: ADDRESS; nBytes: CARDINAL) : ADDRESS ;
+
+
+END Builtins.
+@end example
diff --git a/gcc/m2/target-independent/SYSTEM-iso.rst b/gcc/m2/target-independent/SYSTEM-iso.rst
new file mode 100644
index 00000000000..f5422ab9032
--- /dev/null
+++ b/gcc/m2/target-independent/SYSTEM-iso.rst
@@ -0,0 +1,281 @@
+
+.. code-block:: modula2
+    DEFINITION MODULE SYSTEM;
+
+  (* Gives access to system programming facilities that are probably
+     non portable. *)
+    
+      (* The constants and types define underlying properties of storage *)
+    
+    EXPORT QUALIFIED BITSPERLOC, LOCSPERWORD,
+                     LOC, BYTE, WORD, ADDRESS, CSIZE_T, CSSIZE_T, (* @SYSTEM_DATATYPES@  *)
+                     ADDADR, SUBADR, DIFADR, MAKEADR, ADR, ROTATE,
+                     SHIFT, CAST, TSIZE,
+    
+                     (* Internal GM2 compiler functions *)
+                     ShiftVal, ShiftLeft, ShiftRight,
+                     RotateVal, RotateLeft, RotateRight,
+                     THROW, TBITSIZE ;
+    
+    CONST
+                      (* <implementation-defined constant> ; *)
+.. index::
+   pair: BITSPERLOC; (const)
+.. code-block:: modula2
+      BITSPERLOC    = __ATTRIBUTE__ __BUILTIN__ ((BITS_PER_UNIT)) ;
+                      (* <implementation-defined constant> ; *)
+.. index::
+   pair: LOCSPERWORD; (const)
+.. code-block:: modula2
+      LOCSPERWORD   = __ATTRIBUTE__ __BUILTIN__ ((UNITS_PER_WORD)) ;
+                      (* <implementation-defined constant> ; *)
+.. index::
+   pair: LOCSPERBYTE; (const)
+.. code-block:: modula2
+      LOCSPERBYTE = 8 DIV BITSPERLOC ;
+    
+    (*
+       all the objects below are declared internally to gm2
+       ====================================================
+    
+    TYPE
+       @SYSTEM_TYPES@
+    
+    TYPE
+      LOC; (* A system basic type. Values are the uninterpreted
+              contents of the smallest addressable unit of storage *)
+.. index::
+   pair: ADDRESS; (type)
+.. code-block:: modula2
+      ADDRESS = POINTER TO LOC;
+.. index::
+   pair: WORD; (type)
+.. code-block:: modula2
+      WORD = ARRAY [0 .. LOCSPERWORD-1] OF LOC;
+    
+      (* BYTE and LOCSPERBYTE are provided if appropriate for machine *)
+    
+    TYPE
+.. index::
+   pair: BYTE; (type)
+.. code-block:: modula2
+      BYTE = ARRAY [0 .. LOCSPERBYTE-1] OF LOC;
+    
+.. index::
+   ADDADR
+.. code-block:: modula2
+    PROCEDURE ADDADR (addr: ADDRESS; offset: CARDINAL): ADDRESS;
+      (* Returns address given by (addr + offset), or may raise
+         an exception if this address is not valid.
+      *)
+    
+.. index::
+   SUBADR
+.. code-block:: modula2
+    PROCEDURE SUBADR (addr: ADDRESS; offset: CARDINAL): ADDRESS;
+      (* Returns address given by (addr - offset), or may raise an
+         exception if this address is not valid.
+      *)
+    
+.. index::
+   DIFADR
+.. code-block:: modula2
+    PROCEDURE DIFADR (addr1, addr2: ADDRESS): INTEGER;
+      (* Returns the difference between addresses (addr1 - addr2),
+         or may raise an exception if the arguments are invalid
+         or address space is non-contiguous.
+      *)
+    
+.. index::
+   MAKEADR
+.. code-block:: modula2
+    PROCEDURE MAKEADR (high: <some type>; ...): ADDRESS;
+      (* Returns an address constructed from a list of values whose
+         types are implementation-defined, or may raise an
+         exception if this address is not valid.
+    
+         In GNU Modula-2, MAKEADR can take any number of arguments
+         which are mapped onto the type ADDRESS. The first parameter
+         maps onto the high address bits and subsequent parameters map
+         onto lower address bits. For example:
+    
+         a := MAKEADR(BYTE(0FEH), BYTE(0DCH), BYTE(0BAH), BYTE(098H),
+                      BYTE(076H), BYTE(054H), BYTE(032H), BYTE(010H)) ;
+    
+         then the value of, a, on a 64 bit machine is: 0FEDCBA9876543210H
+    
+         The parameters do not have to be the same type, but constants
+         _must_ be typed.
+      *)
+    
+.. index::
+   ADR
+.. code-block:: modula2
+    PROCEDURE ADR (VAR v: <anytype>): ADDRESS;
+      (* Returns the address of variable v. *)
+    
+.. index::
+   ROTATE
+.. code-block:: modula2
+    PROCEDURE ROTATE (val: <a packedset type>;
+                      num: INTEGER): <type of first parameter>;
+      (* Returns a bit sequence obtained from val by rotating up/right
+         or down/right by the absolute value of num.  The direction is
+         down/right if the sign of num is negative, otherwise the direction
+         is up/left.
+      *)
+    
+.. index::
+   SHIFT
+.. code-block:: modula2
+    PROCEDURE SHIFT (val: <a packedset type>;
+                     num: INTEGER): <type of first parameter>;
+      (* Returns a bit sequence obtained from val by shifting up/left
+         or down/right by the absolute value of num, introducing
+         zeros as necessary.  The direction is down/right if the sign of
+         num is negative, otherwise the direction is up/left.
+      *)
+    
+.. index::
+   CAST
+.. code-block:: modula2
+    PROCEDURE CAST (<targettype>; val: <anytype>): <targettype>;
+      (* CAST is a type transfer function.  Given the expression
+         denoted by val, it returns a value of the type <targettype>.
+         An invalid value for the target value or a
+         physical address alignment problem may raise an exception.
+      *)
+    
+.. index::
+   TSIZE
+.. code-block:: modula2
+    PROCEDURE TSIZE (<type>; ... ): CARDINAL;
+      (* Returns the number of LOCS used to store a value of the
+         specified <type>.   The extra parameters, if present,
+         are used to distinguish variants in a variant record.
+      *)
+    
+.. index::
+   THROW
+.. code-block:: modula2
+    PROCEDURE THROW (i: INTEGER) ;
+      (*
+         THROW is a GNU extension and was not part of the PIM or ISO
+         standards.  It throws an exception which will be caught by the
+         EXCEPT block (assuming it exists).  This is a compiler builtin
+         function which interfaces to the GCC exception handling runtime
+         system.
+         GCC uses the term throw, hence the naming distinction between
+         the GCC builtin and the Modula-2 runtime library procedure Raise.
+         The later library procedure Raise will call SYSTEM.THROW after
+         performing various housekeeping activities.
+      *)
+    
+.. index::
+   TBITSIZE
+.. code-block:: modula2
+    PROCEDURE TBITSIZE (<type>) : CARDINAL ;
+      (* Returns the minimum number of bits necessary to represent
+         <type>.  This procedure function is only useful for determining
+         the number of bits used for any type field within a packed RECORD.
+         It is not particularly useful elsewhere since <type> might be
+         optimized for speed, for example a BOOLEAN could occupy a WORD.
+      *)
+    *)
+    
+    
+    (* The following procedures are invoked by GNU Modula-2 to
+       shift non word set types. They are not part of ISO Modula-2
+       but are used to implement the SHIFT procedure defined above. *)
+    
+    (*
+       ShiftVal - is a runtime procedure whose job is to implement
+                  the SHIFT procedure of ISO SYSTEM. GNU Modula-2 will
+                  inline a SHIFT of a single WORD sized set and will only
+                  call this routine for larger sets.
+    *)
+    
+.. index::
+   ShiftVal
+.. code-block:: modula2
+    PROCEDURE ShiftVal (VAR s, d: ARRAY OF BITSET;
+                        SetSizeInBits: CARDINAL;
+                        ShiftCount: INTEGER) ;
+    
+    
+    (*
+       ShiftLeft - performs the shift left for a multi word set.
+                   This procedure might be called by the back end of
+                   GNU Modula-2 depending whether amount is known at
+                   compile time.
+    *)
+    
+.. index::
+   ShiftLeft
+.. code-block:: modula2
+    PROCEDURE ShiftLeft (VAR s, d: ARRAY OF BITSET;
+                         SetSizeInBits: CARDINAL;
+                         ShiftCount: CARDINAL) ;
+    
+    (*
+       ShiftRight - performs the shift left for a multi word set.
+                    This procedure might be called by the back end of
+                    GNU Modula-2 depending whether amount is known at
+                    compile time.
+    *)
+    
+.. index::
+   ShiftRight
+.. code-block:: modula2
+    PROCEDURE ShiftRight (VAR s, d: ARRAY OF BITSET;
+                         SetSizeInBits: CARDINAL;
+                         ShiftCount: CARDINAL) ;
+    
+    
+    (*
+       RotateVal - is a runtime procedure whose job is to implement
+                   the ROTATE procedure of ISO SYSTEM. GNU Modula-2 will
+                   inline a ROTATE of a single WORD (or less)
+                   sized set and will only call this routine for larger
+                   sets.
+    *)
+    
+.. index::
+   RotateVal
+.. code-block:: modula2
+    PROCEDURE RotateVal (VAR s, d: ARRAY OF BITSET;
+                         SetSizeInBits: CARDINAL;
+                         RotateCount: INTEGER) ;
+    
+    
+    (*
+       RotateLeft - performs the rotate left for a multi word set.
+                    This procedure might be called by the back end of
+                    GNU Modula-2 depending whether amount is known at
+                    compile time.
+    *)
+    
+.. index::
+   RotateLeft
+.. code-block:: modula2
+    PROCEDURE RotateLeft (VAR s, d: ARRAY OF BITSET;
+                          SetSizeInBits: CARDINAL;
+                          RotateCount: CARDINAL) ;
+    
+    
+    (*
+       RotateRight - performs the rotate right for a multi word set.
+                     This procedure might be called by the back end of
+                     GNU Modula-2 depending whether amount is known at
+                     compile time.
+    *)
+    
+.. index::
+   RotateRight
+.. code-block:: modula2
+    PROCEDURE RotateRight (VAR s, d: ARRAY OF BITSET;
+                           SetSizeInBits: CARDINAL;
+                           RotateCount: CARDINAL) ;
+    
+    
+    END SYSTEM.
diff --git a/gcc/m2/target-independent/SYSTEM-iso.texi b/gcc/m2/target-independent/SYSTEM-iso.texi
new file mode 100644
index 00000000000..052c1ce2218
--- /dev/null
+++ b/gcc/m2/target-independent/SYSTEM-iso.texi
@@ -0,0 +1,237 @@
+
+@example
+DEFINITION MODULE SYSTEM;
+
+  (* Gives access to system programming facilities that are probably
+     non portable. *)
+
+  (* The constants and types define underlying properties of storage *)
+
+EXPORT QUALIFIED BITSPERLOC, LOCSPERWORD,
+                 LOC, BYTE, WORD, ADDRESS, CSIZE_T, CSSIZE_T, (* 
+                 Target specific data types.  *)
+                 ADDADR, SUBADR, DIFADR, MAKEADR, ADR, ROTATE,
+                 SHIFT, CAST, TSIZE,
+
+                 (* Internal GM2 compiler functions *)
+                 ShiftVal, ShiftLeft, ShiftRight,
+                 RotateVal, RotateLeft, RotateRight,
+                 THROW, TBITSIZE ;
+
+CONST
+                  (* <implementation-defined constant> ; *)
+@findex BITSPERLOC (const)
+  BITSPERLOC    = __ATTRIBUTE__ __BUILTIN__ ((BITS_PER_UNIT)) ;
+                  (* <implementation-defined constant> ; *)
+@findex LOCSPERWORD (const)
+  LOCSPERWORD   = __ATTRIBUTE__ __BUILTIN__ ((UNITS_PER_WORD)) ;
+                  (* <implementation-defined constant> ; *)
+@findex LOCSPERBYTE (const)
+  LOCSPERBYTE = 8 DIV BITSPERLOC ;
+
+(*
+   all the objects below are declared internally to gm2
+   ====================================================
+
+TYPE
+   (* Target specific data types.  *)
+
+TYPE
+  LOC; (* A system basic type. Values are the uninterpreted
+          contents of the smallest addressable unit of storage *)
+@findex ADDRESS (type)
+  ADDRESS = POINTER TO LOC;
+@findex WORD (type)
+  WORD = ARRAY [0 .. LOCSPERWORD-1] OF LOC;
+
+  (* BYTE and LOCSPERBYTE are provided if appropriate for machine *)
+
+TYPE
+@findex BYTE (type)
+  BYTE = ARRAY [0 .. LOCSPERBYTE-1] OF LOC;
+
+@findex ADDADR
+PROCEDURE ADDADR (addr: ADDRESS; offset: CARDINAL): ADDRESS;
+  (* Returns address given by (addr + offset), or may raise
+     an exception if this address is not valid.
+  *)
+
+@findex SUBADR
+PROCEDURE SUBADR (addr: ADDRESS; offset: CARDINAL): ADDRESS;
+  (* Returns address given by (addr - offset), or may raise an
+     exception if this address is not valid.
+  *)
+
+@findex DIFADR
+PROCEDURE DIFADR (addr1, addr2: ADDRESS): INTEGER;
+  (* Returns the difference between addresses (addr1 - addr2),
+     or may raise an exception if the arguments are invalid
+     or address space is non-contiguous.
+  *)
+
+@findex MAKEADR
+PROCEDURE MAKEADR (high: <some type>; ...): ADDRESS;
+  (* Returns an address constructed from a list of values whose
+     types are implementation-defined, or may raise an
+     exception if this address is not valid.
+
+     In GNU Modula-2, MAKEADR can take any number of arguments
+     which are mapped onto the type ADDRESS. The first parameter
+     maps onto the high address bits and subsequent parameters map
+     onto lower address bits. For example:
+
+     a := MAKEADR(BYTE(0FEH), BYTE(0DCH), BYTE(0BAH), BYTE(098H),
+                  BYTE(076H), BYTE(054H), BYTE(032H), BYTE(010H)) ;
+
+     then the value of, a, on a 64 bit machine is: 0FEDCBA9876543210H
+
+     The parameters do not have to be the same type, but constants
+     _must_ be typed.
+  *)
+
+@findex ADR
+PROCEDURE ADR (VAR v: <anytype>): ADDRESS;
+  (* Returns the address of variable v. *)
+
+@findex ROTATE
+PROCEDURE ROTATE (val: <a packedset type>;
+                  num: INTEGER): <type of first parameter>;
+  (* Returns a bit sequence obtained from val by rotating up/right
+     or down/right by the absolute value of num.  The direction is
+     down/right if the sign of num is negative, otherwise the direction
+     is up/left.
+  *)
+
+@findex SHIFT
+PROCEDURE SHIFT (val: <a packedset type>;
+                 num: INTEGER): <type of first parameter>;
+  (* Returns a bit sequence obtained from val by shifting up/left
+     or down/right by the absolute value of num, introducing
+     zeros as necessary.  The direction is down/right if the sign of
+     num is negative, otherwise the direction is up/left.
+  *)
+
+@findex CAST
+PROCEDURE CAST (<targettype>; val: <anytype>): <targettype>;
+  (* CAST is a type transfer function.  Given the expression
+     denoted by val, it returns a value of the type <targettype>.
+     An invalid value for the target value or a
+     physical address alignment problem may raise an exception.
+  *)
+
+@findex TSIZE
+PROCEDURE TSIZE (<type>; ... ): CARDINAL;
+  (* Returns the number of LOCS used to store a value of the
+     specified <type>.   The extra parameters, if present,
+     are used to distinguish variants in a variant record.
+  *)
+
+@findex THROW
+PROCEDURE THROW (i: INTEGER) ;
+  (*
+     THROW is a GNU extension and was not part of the PIM or ISO
+     standards.  It throws an exception which will be caught by the
+     EXCEPT block (assuming it exists).  This is a compiler builtin
+     function which interfaces to the GCC exception handling runtime
+     system.
+     GCC uses the term throw, hence the naming distinction between
+     the GCC builtin and the Modula-2 runtime library procedure Raise.
+     The later library procedure Raise will call SYSTEM.THROW after
+     performing various housekeeping activities.
+  *)
+
+@findex TBITSIZE
+PROCEDURE TBITSIZE (<type>) : CARDINAL ;
+  (* Returns the minimum number of bits necessary to represent
+     <type>.  This procedure function is only useful for determining
+     the number of bits used for any type field within a packed RECORD.
+     It is not particularly useful elsewhere since <type> might be
+     optimized for speed, for example a BOOLEAN could occupy a WORD.
+  *)
+*)
+
+
+(* The following procedures are invoked by GNU Modula-2 to
+   shift non word set types. They are not part of ISO Modula-2
+   but are used to implement the SHIFT procedure defined above. *)
+
+(*
+   ShiftVal - is a runtime procedure whose job is to implement
+              the SHIFT procedure of ISO SYSTEM. GNU Modula-2 will
+              inline a SHIFT of a single WORD sized set and will only
+              call this routine for larger sets.
+*)
+
+@findex ShiftVal
+PROCEDURE ShiftVal (VAR s, d: ARRAY OF BITSET;
+                    SetSizeInBits: CARDINAL;
+                    ShiftCount: INTEGER) ;
+
+
+(*
+   ShiftLeft - performs the shift left for a multi word set.
+               This procedure might be called by the back end of
+               GNU Modula-2 depending whether amount is known at
+               compile time.
+*)
+
+@findex ShiftLeft
+PROCEDURE ShiftLeft (VAR s, d: ARRAY OF BITSET;
+                     SetSizeInBits: CARDINAL;
+                     ShiftCount: CARDINAL) ;
+
+(*
+   ShiftRight - performs the shift left for a multi word set.
+                This procedure might be called by the back end of
+                GNU Modula-2 depending whether amount is known at
+                compile time.
+*)
+
+@findex ShiftRight
+PROCEDURE ShiftRight (VAR s, d: ARRAY OF BITSET;
+                     SetSizeInBits: CARDINAL;
+                     ShiftCount: CARDINAL) ;
+
+
+(*
+   RotateVal - is a runtime procedure whose job is to implement
+               the ROTATE procedure of ISO SYSTEM. GNU Modula-2 will
+               inline a ROTATE of a single WORD (or less)
+               sized set and will only call this routine for larger
+               sets.
+*)
+
+@findex RotateVal
+PROCEDURE RotateVal (VAR s, d: ARRAY OF BITSET;
+                     SetSizeInBits: CARDINAL;
+                     RotateCount: INTEGER) ;
+
+
+(*
+   RotateLeft - performs the rotate left for a multi word set.
+                This procedure might be called by the back end of
+                GNU Modula-2 depending whether amount is known at
+                compile time.
+*)
+
+@findex RotateLeft
+PROCEDURE RotateLeft (VAR s, d: ARRAY OF BITSET;
+                      SetSizeInBits: CARDINAL;
+                      RotateCount: CARDINAL) ;
+
+
+(*
+   RotateRight - performs the rotate right for a multi word set.
+                 This procedure might be called by the back end of
+                 GNU Modula-2 depending whether amount is known at
+                 compile time.
+*)
+
+@findex RotateRight
+PROCEDURE RotateRight (VAR s, d: ARRAY OF BITSET;
+                       SetSizeInBits: CARDINAL;
+                       RotateCount: CARDINAL) ;
+
+
+END SYSTEM.
+@end example
diff --git a/gcc/m2/target-independent/SYSTEM-pim.rst b/gcc/m2/target-independent/SYSTEM-pim.rst
new file mode 100644
index 00000000000..1df5e473989
--- /dev/null
+++ b/gcc/m2/target-independent/SYSTEM-pim.rst
@@ -0,0 +1,204 @@
+
+.. code-block:: modula2
+    DEFINITION MODULE SYSTEM ;
+
+    EXPORT QUALIFIED BITSPERBYTE, BYTESPERWORD,
+                     ADDRESS, WORD, BYTE, CSIZE_T, CSSIZE_T, (* @SYSTEM_DATATYPES@  *)
+                     ADR, TSIZE, ROTATE, SHIFT, THROW, TBITSIZE ;
+                     (* SIZE is also exported if -fpim2 is used,  *)
+    
+    CONST
+.. index::
+   pair: BITSPERBYTE; (const)
+.. code-block:: modula2
+      BITSPERBYTE   = __ATTRIBUTE__ __BUILTIN__ ((BITS_PER_UNIT)) ;
+.. index::
+   pair: BYTESPERWORD; (const)
+.. code-block:: modula2
+      BYTESPERWORD  = __ATTRIBUTE__ __BUILTIN__ ((UNITS_PER_WORD)) ;
+    
+    
+    (* all the following types are declared internally to gm2
+    TYPE
+       @SYSTEM_TYPES@
+    *)
+    
+    
+    (*
+       all the functions below are declared internally to gm2
+       ====================================================
+    
+.. index::
+   ADR
+.. code-block:: modula2
+    PROCEDURE ADR (VAR v: <anytype>): ADDRESS;
+      (* Returns the address of variable v. *)
+    
+.. index::
+   SIZE
+.. code-block:: modula2
+    PROCEDURE SIZE (v: <type>) : ZType;
+      (* Returns the number of BYTES used to store a v of
+         any specified <type>.  Only available if -fpim2 is used.
+      *)
+    
+.. index::
+   TSIZE
+.. code-block:: modula2
+    PROCEDURE TSIZE (<type>) : CARDINAL;
+      (* Returns the number of BYTES used to store a value of the
+         specified <type>.
+      *)
+    
+.. index::
+   ROTATE
+.. code-block:: modula2
+    PROCEDURE ROTATE (val: <a set type>;
+                      num: INTEGER): <type of first parameter>;
+      (* Returns a bit sequence obtained from val by rotating up/right
+         or down/right by the absolute value of num.  The direction is
+         down/right if the sign of num is negative, otherwise the direction
+         is up/left.
+      *)
+    
+.. index::
+   SHIFT
+.. code-block:: modula2
+    PROCEDURE SHIFT (val: <a set type>;
+                     num: INTEGER): <type of first parameter>;
+      (* Returns a bit sequence obtained from val by shifting up/left
+         or down/right by the absolute value of num, introducing
+         zeros as necessary.  The direction is down/right if the sign of
+         num is negative, otherwise the direction is up/left.
+      *)
+    
+.. index::
+   THROW
+.. code-block:: modula2
+    PROCEDURE THROW (i: INTEGER) ;
+      (*
+         THROW is a GNU extension and was not part of the PIM or ISO
+         standards.  It throws an exception which will be caught by the
+         EXCEPT block (assuming it exists).  This is a compiler builtin
+         function which interfaces to the GCC exception handling runtime
+         system.
+         GCC uses the term throw, hence the naming distinction between
+         the GCC builtin and the Modula-2 runtime library procedure Raise.
+         The later library procedure Raise will call SYSTEM.THROW after
+         performing various housekeeping activities.
+      *)
+    
+.. index::
+   TBITSIZE
+.. code-block:: modula2
+    PROCEDURE TBITSIZE (<type>) : CARDINAL ;
+      (* Returns the minimum number of bits necessary to represent
+         <type>.  This procedure function is only useful for determining
+         the number of bits used for any type field within a packed RECORD.
+         It is not particularly useful elsewhere since <type> might be
+         optimized for speed, for example a BOOLEAN could occupy a WORD.
+      *)
+    *)
+    
+    (* The following procedures are invoked by GNU Modula-2 to
+       shift non word sized set types. They are not strictly part
+       of the core PIM Modula-2, however they are used
+       to implement the SHIFT procedure defined above,
+       which are in turn used by the Logitech compatible libraries.
+    
+       Users will access these procedures by using the procedure
+       SHIFT above and GNU Modula-2 will map SHIFT onto one of
+       the following procedures.
+    *)
+    
+    (*
+       ShiftVal - is a runtime procedure whose job is to implement
+                  the SHIFT procedure of ISO SYSTEM. GNU Modula-2 will
+                  inline a SHIFT of a single WORD sized set and will only
+                  call this routine for larger sets.
+    *)
+    
+.. index::
+   ShiftVal
+.. code-block:: modula2
+    PROCEDURE ShiftVal (VAR s, d: ARRAY OF BITSET;
+                        SetSizeInBits: CARDINAL;
+                        ShiftCount: INTEGER) ;
+    
+    
+    (*
+       ShiftLeft - performs the shift left for a multi word set.
+                   This procedure might be called by the back end of
+                   GNU Modula-2 depending whether amount is known at
+                   compile time.
+    *)
+    
+.. index::
+   ShiftLeft
+.. code-block:: modula2
+    PROCEDURE ShiftLeft (VAR s, d: ARRAY OF BITSET;
+                         SetSizeInBits: CARDINAL;
+                         ShiftCount: CARDINAL) ;
+    
+    (*
+       ShiftRight - performs the shift left for a multi word set.
+                    This procedure might be called by the back end of
+                    GNU Modula-2 depending whether amount is known at
+                    compile time.
+    *)
+    
+.. index::
+   ShiftRight
+.. code-block:: modula2
+    PROCEDURE ShiftRight (VAR s, d: ARRAY OF BITSET;
+                          SetSizeInBits: CARDINAL;
+                          ShiftCount: CARDINAL) ;
+    
+    
+    (*
+       RotateVal - is a runtime procedure whose job is to implement
+                   the ROTATE procedure of ISO SYSTEM. GNU Modula-2 will
+                   inline a ROTATE of a single WORD (or less)
+                   sized set and will only call this routine for larger
+                   sets.
+    *)
+    
+.. index::
+   RotateVal
+.. code-block:: modula2
+    PROCEDURE RotateVal (VAR s, d: ARRAY OF BITSET;
+                         SetSizeInBits: CARDINAL;
+                         RotateCount: INTEGER) ;
+    
+    
+    (*
+       RotateLeft - performs the rotate left for a multi word set.
+                    This procedure might be called by the back end of
+                    GNU Modula-2 depending whether amount is known at
+                    compile time.
+    *)
+    
+.. index::
+   RotateLeft
+.. code-block:: modula2
+    PROCEDURE RotateLeft (VAR s, d: ARRAY OF BITSET;
+                          SetSizeInBits: CARDINAL;
+                          RotateCount: CARDINAL) ;
+    
+    
+    (*
+       RotateRight - performs the rotate right for a multi word set.
+                     This procedure might be called by the back end of
+                     GNU Modula-2 depending whether amount is known at
+                     compile time.
+    *)
+    
+.. index::
+   RotateRight
+.. code-block:: modula2
+    PROCEDURE RotateRight (VAR s, d: ARRAY OF BITSET;
+                           SetSizeInBits: CARDINAL;
+                           RotateCount: CARDINAL) ;
+    
+    
+    END SYSTEM.
diff --git a/gcc/m2/target-independent/SYSTEM-pim.texi b/gcc/m2/target-independent/SYSTEM-pim.texi
new file mode 100644
index 00000000000..13144d365f1
--- /dev/null
+++ b/gcc/m2/target-independent/SYSTEM-pim.texi
@@ -0,0 +1,176 @@
+
+@example
+DEFINITION MODULE SYSTEM ;
+
+EXPORT QUALIFIED BITSPERBYTE, BYTESPERWORD,
+                 ADDRESS, WORD, BYTE, CSIZE_T, CSSIZE_T, (* 
+                 Target specific data types.  *)
+                 ADR, TSIZE, ROTATE, SHIFT, THROW, TBITSIZE ;
+                 (* SIZE is also exported if -fpim2 is used,  *)
+
+CONST
+@findex BITSPERBYTE (const)
+  BITSPERBYTE   = __ATTRIBUTE__ __BUILTIN__ ((BITS_PER_UNIT)) ;
+@findex BYTESPERWORD (const)
+  BYTESPERWORD  = __ATTRIBUTE__ __BUILTIN__ ((UNITS_PER_WORD)) ;
+
+
+(* all the following types are declared internally to gm2
+TYPE
+   (* Target specific data types.  *)
+*)
+
+
+(*
+   all the functions below are declared internally to gm2
+   ====================================================
+
+@findex ADR
+PROCEDURE ADR (VAR v: <anytype>): ADDRESS;
+  (* Returns the address of variable v. *)
+
+@findex SIZE
+PROCEDURE SIZE (v: <type>) : ZType;
+  (* Returns the number of BYTES used to store a v of
+     any specified <type>.  Only available if -fpim2 is used.
+  *)
+
+@findex TSIZE
+PROCEDURE TSIZE (<type>) : CARDINAL;
+  (* Returns the number of BYTES used to store a value of the
+     specified <type>.
+  *)
+
+@findex ROTATE
+PROCEDURE ROTATE (val: <a set type>;
+                  num: INTEGER): <type of first parameter>;
+  (* Returns a bit sequence obtained from val by rotating up/right
+     or down/right by the absolute value of num.  The direction is
+     down/right if the sign of num is negative, otherwise the direction
+     is up/left.
+  *)
+
+@findex SHIFT
+PROCEDURE SHIFT (val: <a set type>;
+                 num: INTEGER): <type of first parameter>;
+  (* Returns a bit sequence obtained from val by shifting up/left
+     or down/right by the absolute value of num, introducing
+     zeros as necessary.  The direction is down/right if the sign of
+     num is negative, otherwise the direction is up/left.
+  *)
+
+@findex THROW
+PROCEDURE THROW (i: INTEGER) ;
+  (*
+     THROW is a GNU extension and was not part of the PIM or ISO
+     standards.  It throws an exception which will be caught by the
+     EXCEPT block (assuming it exists).  This is a compiler builtin
+     function which interfaces to the GCC exception handling runtime
+     system.
+     GCC uses the term throw, hence the naming distinction between
+     the GCC builtin and the Modula-2 runtime library procedure Raise.
+     The later library procedure Raise will call SYSTEM.THROW after
+     performing various housekeeping activities.
+  *)
+
+@findex TBITSIZE
+PROCEDURE TBITSIZE (<type>) : CARDINAL ;
+  (* Returns the minimum number of bits necessary to represent
+     <type>.  This procedure function is only useful for determining
+     the number of bits used for any type field within a packed RECORD.
+     It is not particularly useful elsewhere since <type> might be
+     optimized for speed, for example a BOOLEAN could occupy a WORD.
+  *)
+*)
+
+(* The following procedures are invoked by GNU Modula-2 to
+   shift non word sized set types. They are not strictly part
+   of the core PIM Modula-2, however they are used
+   to implement the SHIFT procedure defined above,
+   which are in turn used by the Logitech compatible libraries.
+
+   Users will access these procedures by using the procedure
+   SHIFT above and GNU Modula-2 will map SHIFT onto one of
+   the following procedures.
+*)
+
+(*
+   ShiftVal - is a runtime procedure whose job is to implement
+              the SHIFT procedure of ISO SYSTEM. GNU Modula-2 will
+              inline a SHIFT of a single WORD sized set and will only
+              call this routine for larger sets.
+*)
+
+@findex ShiftVal
+PROCEDURE ShiftVal (VAR s, d: ARRAY OF BITSET;
+                    SetSizeInBits: CARDINAL;
+                    ShiftCount: INTEGER) ;
+
+
+(*
+   ShiftLeft - performs the shift left for a multi word set.
+               This procedure might be called by the back end of
+               GNU Modula-2 depending whether amount is known at
+               compile time.
+*)
+
+@findex ShiftLeft
+PROCEDURE ShiftLeft (VAR s, d: ARRAY OF BITSET;
+                     SetSizeInBits: CARDINAL;
+                     ShiftCount: CARDINAL) ;
+
+(*
+   ShiftRight - performs the shift left for a multi word set.
+                This procedure might be called by the back end of
+                GNU Modula-2 depending whether amount is known at
+                compile time.
+*)
+
+@findex ShiftRight
+PROCEDURE ShiftRight (VAR s, d: ARRAY OF BITSET;
+                      SetSizeInBits: CARDINAL;
+                      ShiftCount: CARDINAL) ;
+
+
+(*
+   RotateVal - is a runtime procedure whose job is to implement
+               the ROTATE procedure of ISO SYSTEM. GNU Modula-2 will
+               inline a ROTATE of a single WORD (or less)
+               sized set and will only call this routine for larger
+               sets.
+*)
+
+@findex RotateVal
+PROCEDURE RotateVal (VAR s, d: ARRAY OF BITSET;
+                     SetSizeInBits: CARDINAL;
+                     RotateCount: INTEGER) ;
+
+
+(*
+   RotateLeft - performs the rotate left for a multi word set.
+                This procedure might be called by the back end of
+                GNU Modula-2 depending whether amount is known at
+                compile time.
+*)
+
+@findex RotateLeft
+PROCEDURE RotateLeft (VAR s, d: ARRAY OF BITSET;
+                      SetSizeInBits: CARDINAL;
+                      RotateCount: CARDINAL) ;
+
+
+(*
+   RotateRight - performs the rotate right for a multi word set.
+                 This procedure might be called by the back end of
+                 GNU Modula-2 depending whether amount is known at
+                 compile time.
+*)
+
+@findex RotateRight
+PROCEDURE RotateRight (VAR s, d: ARRAY OF BITSET;
+                       SetSizeInBits: CARDINAL;
+                       RotateCount: CARDINAL) ;
+
+
+END SYSTEM.
+@end example
diff --git a/gcc/m2/target-independent/gm2-libs.rst b/gcc/m2/target-independent/gm2-libs.rst
new file mode 100644
index 00000000000..c24e866ab9a
--- /dev/null
+++ b/gcc/m2/target-independent/gm2-libs.rst
@@ -0,0 +1,18269 @@
+@c Copyright (C) 2000-2022 Free Software Foundation, Inc.
+@c This file is part of GNU Modula-2.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.2 or
+@c any later version published by the Free Software Foundation.
+@menu
+* Base libraries::Basic M2F compatible libraries
+* PIM and Logitech 3.0 Compatible::PIM and Logitech 3.0 compatible libraries
+* PIM coroutine support::PIM compatible process support
+* M2 ISO Libraries::ISO defined libraries
+@end menu
+
+@c ============================================================
+
+@c @node Base libraries, PIM and Logitech 3.0 Compatible, , Libraries
+Base libraries
+==============
+
+@menu
+* gm2-libs/ASCII::ASCII.def
+* gm2-libs/Args::Args.def
+* gm2-libs/Assertion::Assertion.def
+* gm2-libs/Break::Break.def
+* gm2-libs/Builtins::Builtins.def
+* gm2-libs/COROUTINES::COROUTINES.def
+* gm2-libs/CmdArgs::CmdArgs.def
+* gm2-libs/Debug::Debug.def
+* gm2-libs/DynamicStrings::DynamicStrings.def
+* gm2-libs/Environment::Environment.def
+* gm2-libs/FIO::FIO.def
+* gm2-libs/FormatStrings::FormatStrings.def
+* gm2-libs/FpuIO::FpuIO.def
+* gm2-libs/GetOpt::GetOpt.def
+* gm2-libs/IO::IO.def
+* gm2-libs/Indexing::Indexing.def
+* gm2-libs/LMathLib0::LMathLib0.def
+* gm2-libs/LegacyReal::LegacyReal.def
+* gm2-libs/M2Dependent::M2Dependent.def
+* gm2-libs/M2EXCEPTION::M2EXCEPTION.def
+* gm2-libs/M2LINK::M2LINK.def
+* gm2-libs/M2RTS::M2RTS.def
+* gm2-libs/MathLib0::MathLib0.def
+* gm2-libs/MemUtils::MemUtils.def
+* gm2-libs/NumberIO::NumberIO.def
+* gm2-libs/OptLib::OptLib.def
+* gm2-libs/PushBackInput::PushBackInput.def
+* gm2-libs/RTExceptions::RTExceptions.def
+* gm2-libs/RTint::RTint.def
+* gm2-libs/SArgs::SArgs.def
+* gm2-libs/SCmdArgs::SCmdArgs.def
+* gm2-libs/SEnvironment::SEnvironment.def
+* gm2-libs/SFIO::SFIO.def
+* gm2-libs/SMathLib0::SMathLib0.def
+* gm2-libs/SYSTEM::SYSTEM.def
+* gm2-libs/Scan::Scan.def
+* gm2-libs/Selective::Selective.def
+* gm2-libs/StdIO::StdIO.def
+* gm2-libs/Storage::Storage.def
+* gm2-libs/StrCase::StrCase.def
+* gm2-libs/StrIO::StrIO.def
+* gm2-libs/StrLib::StrLib.def
+* gm2-libs/StringConvert::StringConvert.def
+* gm2-libs/SysExceptions::SysExceptions.def
+* gm2-libs/SysStorage::SysStorage.def
+* gm2-libs/TimeString::TimeString.def
+* gm2-libs/UnixArgs::UnixArgs.def
+* gm2-libs/cbuiltin::cbuiltin.def
+* gm2-libs/cgetopt::cgetopt.def
+* gm2-libs/cxxabi::cxxabi.def
+* gm2-libs/dtoa::dtoa.def
+* gm2-libs/errno::errno.def
+* gm2-libs/gdbif::gdbif.def
+* gm2-libs/ldtoa::ldtoa.def
+* gm2-libs/libc::libc.def
+* gm2-libs/libm::libm.def
+* gm2-libs/sckt::sckt.def
+* gm2-libs/termios::termios.def
+* gm2-libs/wrapc::wrapc.def
+@end menu
+
+@c @node gm2-libs/ASCII, gm2-libs/Args, , Base libraries
+gm2-libs/ASCII
+--------------
+
+.. code-block:: modula2
+    DEFINITION MODULE ASCII ;
+
+    EXPORT QUALIFIED
+         nul, soh, stx, etx, eot, enq, ack, bel,
+         bs , ht , nl , vt , np , cr , so , si ,
+         dle, dc1, dc2, dc3, dc4, nak, syn, etb,
+         can, em , sub, esc, fs , gs , rs , us ,
+         sp ,  (* All the above are in order *)
+         lf, ff, eof, del, tab, EOL ;
+    
+    (*
+       Note that lf, eof and EOL are added.
+    *)
+    
+    CONST
+.. index::
+   pair: nul; (const)
+   pair: soh; (const)
+   pair: stx; (const)
+   pair: etx; (const)
+.. code-block:: modula2
+         nul=000C; soh=001C; stx=002C; etx=003C;
+.. index::
+   pair: eot; (const)
+   pair: enq; (const)
+   pair: ack; (const)
+   pair: bel; (const)
+.. code-block:: modula2
+         eot=004C; enq=005C; ack=006C; bel=007C;
+.. index::
+   pair: bs; (const)
+   pair: ht; (const)
+   pair: nl; (const)
+   pair: vt; (const)
+.. code-block:: modula2
+         bs =010C; ht =011C; nl =012C; vt =013C;
+.. index::
+   pair: np; (const)
+   pair: cr; (const)
+   pair: so; (const)
+   pair: si; (const)
+.. code-block:: modula2
+         np =014C; cr =015C; so =016C; si =017C;
+.. index::
+   pair: dle; (const)
+   pair: dc1; (const)
+   pair: dc2; (const)
+   pair: dc3; (const)
+.. code-block:: modula2
+         dle=020C; dc1=021C; dc2=022C; dc3=023C;
+.. index::
+   pair: dc4; (const)
+   pair: nak; (const)
+   pair: syn; (const)
+   pair: etb; (const)
+.. code-block:: modula2
+         dc4=024C; nak=025C; syn=026C; etb=027C;
+.. index::
+   pair: can; (const)
+   pair: em; (const)
+   pair: sub; (const)
+   pair: esc; (const)
+.. code-block:: modula2
+         can=030C; em =031C; sub=032C; esc=033C;
+.. index::
+   pair: fs; (const)
+   pair: gs; (const)
+   pair: rs; (const)
+   pair: us; (const)
+.. code-block:: modula2
+         fs =034C; gs =035C; rs =036C; us =037C;
+.. index::
+   pair: sp; (const)
+.. code-block:: modula2
+         sp =040C; (* All the above are in order *)
+.. index::
+   pair: lf; (const)
+   pair: ff; (const)
+   pair: eof; (const)
+   pair: tab; (const)
+.. code-block:: modula2
+         lf =nl  ; ff =np  ; eof=eot ; tab=ht  ;
+.. index::
+   pair: del; (const)
+   pair: EOL; (const)
+.. code-block:: modula2
+         del=177C; EOL=nl  ;
+    
+    END ASCII.
+
+@c @node gm2-libs/Args, gm2-libs/Assertion, gm2-libs/ASCII, Base libraries
+gm2-libs/Args
+-------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Args ;
+
+    EXPORT QUALIFIED GetArg, Narg ;
+    
+    
+    (*
+       GetArg - returns the nth argument from the command line.
+                The success of the operation is returned.
+    *)
+    
+.. index::
+   GetArg
+.. code-block:: modula2
+    PROCEDURE GetArg (VAR a: ARRAY OF CHAR; n: CARDINAL) : BOOLEAN ;
+    
+    
+    (*
+       Narg - returns the number of arguments available from
+              command line.
+    *)
+    
+.. index::
+   Narg
+.. code-block:: modula2
+    PROCEDURE Narg () : CARDINAL ;
+    
+    
+    END Args.
+
+@c @node gm2-libs/Assertion, gm2-libs/Break, gm2-libs/Args, Base libraries
+gm2-libs/Assertion
+------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Assertion ;
+
+    EXPORT QUALIFIED Assert ;
+    
+    
+    (*
+       Assert - tests the boolean Condition, if it fails then HALT
+                is called.
+    *)
+    
+.. index::
+   Assert
+.. code-block:: modula2
+    PROCEDURE Assert (Condition: BOOLEAN) ;
+    
+    
+    END Assertion.
+
+@c @node gm2-libs/Break, gm2-libs/Builtins, gm2-libs/Assertion, Base libraries
+gm2-libs/Break
+--------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Break ;
+
+    END Break.
+
+@c @node gm2-libs/Builtins, gm2-libs/COROUTINES, gm2-libs/Break, Base libraries
+gm2-libs/Builtins
+-----------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Builtins ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    
+    (* floating point intrinsic procedure functions *)
+    
+.. index::
+   isfinitef
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ isfinitef (x: SHORTREAL) : BOOLEAN ;
+.. index::
+   isfinite
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ isfinite (x: REAL) : BOOLEAN ;
+.. index::
+   isfinitel
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ isfinitel (x: LONGREAL) : BOOLEAN ;
+    
+.. index::
+   sinf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sinf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   sin
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sin (x: REAL) : REAL ;
+.. index::
+   sinl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sinl (x: LONGREAL) : LONGREAL ;
+    
+.. index::
+   cosf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cosf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   cos
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cos (x: REAL) : REAL ;
+.. index::
+   cosl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cosl (x: LONGREAL) : LONGREAL ;
+    
+.. index::
+   sqrtf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sqrtf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   sqrt
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sqrt (x: REAL) : REAL ;
+.. index::
+   sqrtl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sqrtl (x: LONGREAL) : LONGREAL ;
+    
+.. index::
+   atan2f
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ atan2f (x, y: SHORTREAL) : SHORTREAL ;
+.. index::
+   atan2
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ atan2 (x, y: REAL) : REAL ;
+.. index::
+   atan2l
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ atan2l (x, y: LONGREAL) : LONGREAL ;
+    
+.. index::
+   fabsf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ fabsf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   fabs
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ fabs (x: REAL) : REAL ;
+.. index::
+   fabsl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ fabsl (x: LONGREAL) : LONGREAL ;
+    
+.. index::
+   logf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ logf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   log
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ log (x: REAL) : REAL ;
+.. index::
+   logl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ logl (x: LONGREAL) : LONGREAL ;
+    
+.. index::
+   expf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ expf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   exp
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ exp (x: REAL) : REAL ;
+.. index::
+   expl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ expl (x: LONGREAL) : LONGREAL ;
+    
+.. index::
+   log10f
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ log10f (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   log10
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ log10 (x: REAL) : REAL ;
+.. index::
+   log10l
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ log10l (x: LONGREAL) : LONGREAL ;
+    
+.. index::
+   exp10f
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ exp10f (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   exp10
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ exp10 (x: REAL) : REAL ;
+.. index::
+   exp10l
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ exp10l (x: LONGREAL) : LONGREAL ;
+    
+.. index::
+   ilogbf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ilogbf (x: SHORTREAL) : INTEGER ;
+.. index::
+   ilogb
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ilogb (x: REAL) : INTEGER ;
+.. index::
+   ilogbl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ilogbl (x: LONGREAL) : INTEGER ;
+    
+.. index::
+   huge_val
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ huge_val () : REAL ;
+.. index::
+   huge_valf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ huge_valf () : SHORTREAL ;
+.. index::
+   huge_vall
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ huge_vall () : LONGREAL ;
+    
+.. index::
+   significand
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ significand (r: REAL) : REAL ;
+.. index::
+   significandf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ significandf (s: SHORTREAL) : SHORTREAL ;
+.. index::
+   significandl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ significandl (l: LONGREAL) : LONGREAL ;
+    
+.. index::
+   modf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ modf (x: REAL; VAR y: REAL) : REAL ;
+.. index::
+   modff
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ modff (x: SHORTREAL;
+                                 VAR y: SHORTREAL) : SHORTREAL ;
+.. index::
+   modfl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ modfl (x: LONGREAL; VAR y: LONGREAL) : LONGREAL ;
+    
+.. index::
+   signbit
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ signbit (r: REAL) : INTEGER ;
+.. index::
+   signbitf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ signbitf (s: SHORTREAL) : INTEGER ;
+.. index::
+   signbitl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ signbitl (l: LONGREAL) : INTEGER ;
+    
+.. index::
+   nextafter
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ nextafter (x, y: REAL) : REAL ;
+.. index::
+   nextafterf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ nextafterf (x, y: SHORTREAL) : SHORTREAL ;
+.. index::
+   nextafterl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ nextafterl (x, y: LONGREAL) : LONGREAL ;
+    
+.. index::
+   nexttoward
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ nexttoward (x, y: REAL) : LONGREAL ;
+.. index::
+   nexttowardf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ nexttowardf (x, y: SHORTREAL) : LONGREAL ;
+.. index::
+   nexttowardl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ nexttowardl (x, y: LONGREAL) : LONGREAL ;
+    
+.. index::
+   scalb
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ scalb (x, n: REAL) : REAL ;
+.. index::
+   scalbf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ scalbf (x, n: SHORTREAL) : SHORTREAL ;
+.. index::
+   scalbl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ scalbl (x, n: LONGREAL) : LONGREAL ;
+    
+.. index::
+   scalbln
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ scalbln (x: REAL; n: LONGINT) : REAL ;
+.. index::
+   scalblnf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ scalblnf (x: SHORTREAL; n: LONGINT) : SHORTREAL ;
+.. index::
+   scalblnl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ scalblnl (x: LONGREAL; n: LONGINT) : LONGREAL ;
+    
+.. index::
+   scalbn
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ scalbn (x: REAL; n: INTEGER) : REAL ;
+.. index::
+   scalbnf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ scalbnf (x: SHORTREAL; n: INTEGER) : SHORTREAL ;
+.. index::
+   scalbnl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ scalbnl (x: LONGREAL; n: INTEGER) : LONGREAL ;
+    
+    (* complex arithmetic intrincic procedure functions *)
+    
+.. index::
+   cabsf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cabsf (z: SHORTCOMPLEX) : SHORTREAL ;
+.. index::
+   cabs
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cabs (z: COMPLEX) : REAL ;
+.. index::
+   cabsl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cabsl (z: LONGCOMPLEX) : LONGREAL ;
+    
+.. index::
+   cargf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cargf (z: SHORTCOMPLEX) : SHORTREAL ;
+.. index::
+   carg
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carg (z: COMPLEX) : REAL ;
+.. index::
+   cargl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cargl (z: LONGCOMPLEX) : LONGREAL ;
+    
+.. index::
+   conjf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ conjf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   conj
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ conj (z: COMPLEX) : COMPLEX ;
+.. index::
+   conjl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ conjl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   cpowerf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cpowerf (base: SHORTCOMPLEX;
+                                   exp: SHORTREAL) : SHORTCOMPLEX ;
+.. index::
+   cpower
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cpower (base: COMPLEX; exp: REAL) : COMPLEX ;
+.. index::
+   cpowerl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cpowerl (base: LONGCOMPLEX;
+                                   exp: LONGREAL) : LONGCOMPLEX ;
+    
+.. index::
+   csqrtf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ csqrtf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   csqrt
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ csqrt (z: COMPLEX) : COMPLEX ;
+.. index::
+   csqrtl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ csqrtl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   cexpf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cexpf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   cexp
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cexp (z: COMPLEX) : COMPLEX ;
+.. index::
+   cexpl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cexpl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   clnf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ clnf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   cln
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cln (z: COMPLEX) : COMPLEX ;
+.. index::
+   clnl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ clnl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   csinf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ csinf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   csin
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ csin (z: COMPLEX) : COMPLEX ;
+.. index::
+   csinl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ csinl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   ccosf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ccosf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   ccos
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ccos (z: COMPLEX) : COMPLEX ;
+.. index::
+   ccosl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ccosl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   ctanf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ctanf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   ctan
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ctan (z: COMPLEX) : COMPLEX ;
+.. index::
+   ctanl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ctanl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   carcsinf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carcsinf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   carcsin
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carcsin (z: COMPLEX) : COMPLEX ;
+.. index::
+   carcsinl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carcsinl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   carccosf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carccosf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   carccos
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carccos (z: COMPLEX) : COMPLEX ;
+.. index::
+   carccosl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carccosl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   carctanf
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carctanf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   carctan
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carctan (z: COMPLEX) : COMPLEX ;
+.. index::
+   carctanl
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ carctanl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+    (* memory and string intrincic procedure functions *)
+    
+.. index::
+   alloca
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ alloca (i: CARDINAL) : ADDRESS ;
+.. index::
+   memcpy
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ memcpy (dest, src: ADDRESS;
+                                  nbytes: CARDINAL) : ADDRESS ;
+.. index::
+   index
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ index (s: ADDRESS; c: INTEGER) : ADDRESS ;
+.. index::
+   rindex
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ rindex (s: ADDRESS; c: INTEGER) : ADDRESS ;
+.. index::
+   memcmp
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ memcmp (s1, s2: ADDRESS;
+                                  nbytes: CARDINAL) : INTEGER ;
+.. index::
+   memset
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ memset (s: ADDRESS; c: INTEGER;
+                                  nbytes: CARDINAL) : ADDRESS ;
+.. index::
+   memmove
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ memmove (s1, s2: ADDRESS;
+                                   nbytes: CARDINAL) : ADDRESS ;
+.. index::
+   strcat
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strcat (dest, src: ADDRESS) : ADDRESS ;
+.. index::
+   strncat
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strncat (dest, src: ADDRESS;
+                                   nbytes: CARDINAL) : ADDRESS ;
+.. index::
+   strcpy
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strcpy (dest, src: ADDRESS) : ADDRESS ;
+.. index::
+   strncpy
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strncpy (dest, src: ADDRESS;
+                                   nbytes: CARDINAL) : ADDRESS ;
+.. index::
+   strcmp
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strcmp (s1, s2: ADDRESS) : INTEGER ;
+.. index::
+   strncmp
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strncmp (s1, s2: ADDRESS;
+                                   nbytes: CARDINAL) : INTEGER ;
+.. index::
+   strlen
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strlen (s: ADDRESS) : INTEGER ;
+.. index::
+   strstr
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strstr (haystack, needle: ADDRESS) : ADDRESS ;
+.. index::
+   strpbrk
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strpbrk (s, accept: ADDRESS) : ADDRESS ;
+.. index::
+   strspn
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strspn (s, accept: ADDRESS) : CARDINAL ;
+.. index::
+   strcspn
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strcspn (s, accept: ADDRESS) : CARDINAL ;
+.. index::
+   strchr
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strchr (s: ADDRESS; c: INTEGER) : ADDRESS ;
+.. index::
+   strrchr
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ strrchr (s: ADDRESS; c: INTEGER) : ADDRESS ;
+    
+    (*
+       longjmp - this GCC builtin restricts the val to always 1.
+    *)
+    (* do not use these two builtins, as gcc, only really
+       anticipates that the Ada front end should use them
+       and it only uses them in its runtime exception handling.
+       We leave them here in the hope that someday they will
+       behave more like their libc counterparts.  *)
+    
+.. index::
+   longjmp
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ longjmp (env: ADDRESS; val: INTEGER) ;
+.. index::
+   setjmp
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ setjmp (env: ADDRESS) : INTEGER ;
+    
+    
+    (*
+       frame_address - returns the address of the frame.
+                       The current frame is obtained if level is 0,
+                       the next level up if level is 1 etc.
+    *)
+    
+.. index::
+   frame_address
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ frame_address (level: CARDINAL) : ADDRESS ;
+    
+    
+    (*
+       return_address - returns the return address of function.
+                        The current function return address is
+                        obtained if level is 0,
+                        the next level up if level is 1 etc.
+    *)
+    
+.. index::
+   return_address
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ return_address (level: CARDINAL) : ADDRESS ;
+    
+    
+    (*
+       alloca_trace - this is a no-op which is used for internal debugging.
+    *)
+    
+.. index::
+   alloca_trace
+.. code-block:: modula2
+    PROCEDURE alloca_trace (returned: ADDRESS; nBytes: CARDINAL) : ADDRESS ;
+    
+    
+    END Builtins.
+
+@c @node gm2-libs/COROUTINES, gm2-libs/CmdArgs, gm2-libs/Builtins, Base libraries
+gm2-libs/COROUTINES
+-------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE FOR "C" COROUTINES ;
+
+    CONST
+       UnassignedPriority = 0 ;
+    
+    TYPE
+.. index::
+   pair: INTERRUPTSOURCE; (type)
+.. code-block:: modula2
+       INTERRUPTSOURCE = CARDINAL ;
+.. index::
+   pair: PROTECTION; (type)
+.. code-block:: modula2
+       PROTECTION = [UnassignedPriority..7] ;
+    
+    END COROUTINES.
+
+@c @node gm2-libs/CmdArgs, gm2-libs/Debug, gm2-libs/COROUTINES, Base libraries
+gm2-libs/CmdArgs
+----------------
+
+.. code-block:: modula2
+    DEFINITION MODULE CmdArgs ;
+
+    EXPORT QUALIFIED GetArg, Narg ;
+    
+    
+    (*
+       GetArg - returns the nth argument from the command line, CmdLine
+                the success of the operation is returned.
+    *)
+    
+.. index::
+   GetArg
+.. code-block:: modula2
+    PROCEDURE GetArg (CmdLine: ARRAY OF CHAR;
+                      n: CARDINAL; VAR Argi: ARRAY OF CHAR) : BOOLEAN ;
+    
+    
+    (*
+       Narg - returns the number of arguments available from
+              command line, CmdLine.
+    *)
+    
+.. index::
+   Narg
+.. code-block:: modula2
+    PROCEDURE Narg (CmdLine: ARRAY OF CHAR) : CARDINAL ;
+    
+    
+    END CmdArgs.
+
+@c @node gm2-libs/Debug, gm2-libs/DynamicStrings, gm2-libs/CmdArgs, Base libraries
+gm2-libs/Debug
+--------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Debug ;
+
+(*
+    Description: provides some simple debugging routines.
+*)
+    
+    EXPORT QUALIFIED Halt, DebugString ;
+    
+    
+    (*
+       Halt - writes a message in the format:
+              Module:Line:Message
+    
+              It then terminates by calling HALT.
+    *)
+    
+.. index::
+   Halt
+.. code-block:: modula2
+    PROCEDURE Halt (Message: ARRAY OF CHAR;
+                    LineNo: CARDINAL;
+                    Module: ARRAY OF CHAR) ;
+    
+    
+    (*
+       DebugString - writes a string to the debugging device (Scn.Write).
+                     It interprets \n as carriage return, linefeed.
+    *)
+    
+.. index::
+   DebugString
+.. code-block:: modula2
+    PROCEDURE DebugString (a: ARRAY OF CHAR) ;
+    
+    
+    END Debug.
+
+@c @node gm2-libs/DynamicStrings, gm2-libs/Environment, gm2-libs/Debug, Base libraries
+gm2-libs/DynamicStrings
+-----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE DynamicStrings ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    EXPORT QUALIFIED String,
+                     InitString, KillString, Fin, InitStringCharStar,
+                     InitStringChar, Index, RIndex,
+                     Mark, Length, ConCat, ConCatChar, Assign, Dup, Add,
+                     Equal, EqualCharStar, EqualArray, ToUpper, ToLower,
+                     CopyOut, Mult, Slice,
+                     RemoveWhitePrefix, RemoveWhitePostfix, RemoveComment,
+                     char, string,
+                     InitStringDB, InitStringCharStarDB, InitStringCharDB,
+                     MultDB, DupDB, SliceDB,
+                     PushAllocation, PopAllocation, PopAllocationExemption ;
+    
+    TYPE
+.. index::
+   pair: String; (type)
+.. code-block:: modula2
+       String ;
+    
+    
+    (*
+       InitString - creates and returns a String type object.
+                    Initial contents are, a.
+    *)
+    
+.. index::
+   InitString
+.. code-block:: modula2
+    PROCEDURE InitString (a: ARRAY OF CHAR) : String ;
+    
+    
+    (*
+       KillString - frees String, s, and its contents.
+                    NIL is returned.
+    *)
+    
+.. index::
+   KillString
+.. code-block:: modula2
+    PROCEDURE KillString (s: String) : String ;
+    
+    
+    (*
+       Fin - finishes with a string, it calls KillString with, s.
+             The purpose of the procedure is to provide a short cut
+             to calling KillString and then testing the return result.
+    *)
+    
+.. index::
+   Fin
+.. code-block:: modula2
+    PROCEDURE Fin (s: String) ;
+    
+    
+    (*
+       InitStringCharStar - initializes and returns a String to contain
+                            the C string.
+    *)
+    
+.. index::
+   InitStringCharStar
+.. code-block:: modula2
+    PROCEDURE InitStringCharStar (a: ADDRESS) : String ;
+    
+    
+    (*
+       InitStringChar - initializes and returns a String to contain the
+                        single character, ch.
+    *)
+    
+.. index::
+   InitStringChar
+.. code-block:: modula2
+    PROCEDURE InitStringChar (ch: CHAR) : String ;
+    
+    
+    (*
+       Mark - marks String, s, ready for garbage collection.
+    *)
+    
+.. index::
+   Mark
+.. code-block:: modula2
+    PROCEDURE Mark (s: String) : String ;
+    
+    
+    (*
+       Length - returns the length of the String, s.
+    *)
+    
+.. index::
+   Length
+.. code-block:: modula2
+    PROCEDURE Length (s: String) : CARDINAL ;
+    
+    
+    (*
+       ConCat - returns String, a, after the contents of, b,
+                have been appended.
+    *)
+    
+.. index::
+   ConCat
+.. code-block:: modula2
+    PROCEDURE ConCat (a, b: String) : String ;
+    
+    
+    (*
+       ConCatChar - returns String, a, after character, ch,
+                    has been appended.
+    *)
+    
+.. index::
+   ConCatChar
+.. code-block:: modula2
+    PROCEDURE ConCatChar (a: String; ch: CHAR) : String ;
+    
+    
+    (*
+       Assign - assigns the contents of, b, into, a.
+                String, a, is returned.
+    *)
+    
+.. index::
+   Assign
+.. code-block:: modula2
+    PROCEDURE Assign (a, b: String) : String ;
+    
+    
+    (*
+       Dup - duplicate a String, s, returning the copy of s.
+    *)
+    
+.. index::
+   Dup
+.. code-block:: modula2
+    PROCEDURE Dup (s: String) : String ;
+    
+    
+    (*
+       Add - returns a new String which contains the contents of a and b.
+    *)
+    
+.. index::
+   Add
+.. code-block:: modula2
+    PROCEDURE Add (a, b: String) : String ;
+    
+    
+    (*
+       Equal - returns TRUE if String, a, and, b, are equal.
+    *)
+    
+.. index::
+   Equal
+.. code-block:: modula2
+    PROCEDURE Equal (a, b: String) : BOOLEAN ;
+    
+    
+    (*
+       EqualCharStar - returns TRUE if contents of String, s, is
+                       the same as the string, a.
+    *)
+    
+.. index::
+   EqualCharStar
+.. code-block:: modula2
+    PROCEDURE EqualCharStar (s: String; a: ADDRESS) : BOOLEAN ;
+    
+    
+    (*
+       EqualArray - returns TRUE if contents of String, s, is the
+                    same as the string, a.
+    *)
+    
+.. index::
+   EqualArray
+.. code-block:: modula2
+    PROCEDURE EqualArray (s: String; a: ARRAY OF CHAR) : BOOLEAN ;
+    
+    
+    (*
+       Mult - returns a new string which is n concatenations of String, s.
+              If n<=0 then an empty string is returned.
+    *)
+    
+.. index::
+   Mult
+.. code-block:: modula2
+    PROCEDURE Mult (s: String; n: CARDINAL) : String ;
+    
+    
+    (*
+       Slice - returns a new string which contains the elements
+               low..high-1
+    
+               strings start at element 0
+               Slice(s, 0, 2)  will return elements 0, 1 but not 2
+               Slice(s, 1, 3)  will return elements 1, 2 but not 3
+               Slice(s, 2, 0)  will return elements 2..max
+               Slice(s, 3, -1) will return elements 3..max-1
+               Slice(s, 4, -2) will return elements 4..max-2
+    *)
+    
+.. index::
+   Slice
+.. code-block:: modula2
+    PROCEDURE Slice (s: String; low, high: INTEGER) : String ;
+    
+    
+    (*
+       Index - returns the indice of the first occurance of, ch, in
+               String, s. -1 is returned if, ch, does not exist.
+               The search starts at position, o.
+    *)
+    
+.. index::
+   Index
+.. code-block:: modula2
+    PROCEDURE Index (s: String; ch: CHAR; o: CARDINAL) : INTEGER ;
+    
+    
+    (*
+       RIndex - returns the indice of the last occurance of, ch,
+                in String, s. The search starts at position, o.
+                -1 is returned if, ch, is not found.
+    *)
+    
+.. index::
+   RIndex
+.. code-block:: modula2
+    PROCEDURE RIndex (s: String; ch: CHAR; o: CARDINAL) : INTEGER ;
+    
+    
+    (*
+       RemoveComment - assuming that, comment, is a comment delimiter
+                       which indicates anything to its right is a comment
+                       then strip off the comment and also any white space
+                       on the remaining right hand side.
+                       It leaves any white space on the left hand side
+                       alone.
+    *)
+    
+.. index::
+   RemoveComment
+.. code-block:: modula2
+    PROCEDURE RemoveComment (s: String; comment: CHAR) : String ;
+    
+    
+    (*
+       RemoveWhitePrefix - removes any leading white space from String, s.
+                           A new string is returned.
+    *)
+    
+.. index::
+   RemoveWhitePrefix
+.. code-block:: modula2
+    PROCEDURE RemoveWhitePrefix (s: String) : String ;
+    
+    
+    (*
+       RemoveWhitePostfix - removes any leading white space from String, s.
+                            A new string is returned.
+    *)
+    
+.. index::
+   RemoveWhitePostfix
+.. code-block:: modula2
+    PROCEDURE RemoveWhitePostfix (s: String) : String ;
+    
+    
+    (*
+       ToUpper - returns string, s, after it has had its lower case
+                 characters replaced by upper case characters.
+                 The string, s, is not duplicated.
+    *)
+    
+.. index::
+   ToUpper
+.. code-block:: modula2
+    PROCEDURE ToUpper (s: String) : String ;
+    
+    
+    (*
+       ToLower - returns string, s, after it has had its upper case
+                 characters replaced by lower case characters.
+                 The string, s, is not duplicated.
+    *)
+    
+.. index::
+   ToLower
+.. code-block:: modula2
+    PROCEDURE ToLower (s: String) : String ;
+    
+    
+    (*
+       CopyOut - copies string, s, to a.
+    *)
+    
+.. index::
+   CopyOut
+.. code-block:: modula2
+    PROCEDURE CopyOut (VAR a: ARRAY OF CHAR; s: String) ;
+    
+    
+    (*
+       char - returns the character, ch, at position, i, in String, s.
+              As Slice the index can be negative so:
+    
+              char(s, 0) will return the first character
+              char(s, 1) will return the second character
+              char(s, -1) will return the last character
+              char(s, -2) will return the penultimate character
+    
+              a nul character is returned if the index is out of range.
+    *)
+    
+.. index::
+   char
+.. code-block:: modula2
+    PROCEDURE char (s: String; i: INTEGER) : CHAR ;
+    
+    
+    (*
+       string - returns the C style char * of String, s.
+    *)
+    
+.. index::
+   string
+.. code-block:: modula2
+    PROCEDURE string (s: String) : ADDRESS ;
+    
+    
+    (*
+       to easily debug an application using this library one could use
+       use the following macro processing defines:
+    
+       #define InitString(X) InitStringDB(X, __FILE__, __LINE__)
+       #define InitStringCharStar(X) InitStringCharStarDB(X, \
+         __FILE__, __LINE__)
+       #define InitStringChar(X) InitStringCharDB(X, __FILE__, __LINE__)
+       #define Mult(X,Y) MultDB(X, Y, __FILE__, __LINE__)
+       #define Dup(X) DupDB(X, __FILE__, __LINE__)
+       #define Slice(X,Y,Z) SliceDB(X, Y, Z, __FILE__, __LINE__)
+    
+       and then invoke gm2 with the -fcpp flag.
+    *)
+    
+    
+    (*
+       InitStringDB - the debug version of InitString.
+    *)
+    
+.. index::
+   InitStringDB
+.. code-block:: modula2
+    PROCEDURE InitStringDB (a: ARRAY OF CHAR;
+                            file: ARRAY OF CHAR; line: CARDINAL) : String ;
+    
+    
+    (*
+       InitStringCharStarDB - the debug version of InitStringCharStar.
+    *)
+    
+.. index::
+   InitStringCharStarDB
+.. code-block:: modula2
+    PROCEDURE InitStringCharStarDB (a: ADDRESS;
+                                    file: ARRAY OF CHAR;
+                                    line: CARDINAL) : String ;
+    
+    
+    (*
+       InitStringCharDB - the debug version of InitStringChar.
+    *)
+    
+.. index::
+   InitStringCharDB
+.. code-block:: modula2
+    PROCEDURE InitStringCharDB (ch: CHAR;
+                                file: ARRAY OF CHAR;
+                                line: CARDINAL) : String ;
+    
+    
+    (*
+       MultDB - the debug version of MultDB.
+    *)
+    
+.. index::
+   MultDB
+.. code-block:: modula2
+    PROCEDURE MultDB (s: String; n: CARDINAL;
+                      file: ARRAY OF CHAR; line: CARDINAL) : String ;
+    
+    
+    (*
+       DupDB - the debug version of Dup.
+    *)
+    
+.. index::
+   DupDB
+.. code-block:: modula2
+    PROCEDURE DupDB (s: String;
+                     file: ARRAY OF CHAR; line: CARDINAL) : String ;
+    
+    
+    (*
+       SliceDB - debug version of Slice.
+    *)
+    
+.. index::
+   SliceDB
+.. code-block:: modula2
+    PROCEDURE SliceDB (s: String; low, high: INTEGER;
+                       file: ARRAY OF CHAR; line: CARDINAL) : String ;
+    
+    (*
+       PushAllocation - pushes the current allocation/deallocation lists.
+    *)
+    
+.. index::
+   PushAllocation
+.. code-block:: modula2
+    PROCEDURE PushAllocation ;
+    
+    
+    (*
+       PopAllocation - test to see that all strings are deallocated since
+                       the last push.  Then it pops to the previous
+                       allocation/deallocation lists.
+    
+                       If halt is true then the application terminates
+                       with an exit code of 1.
+    *)
+    
+.. index::
+   PopAllocation
+.. code-block:: modula2
+    PROCEDURE PopAllocation (halt: BOOLEAN) ;
+    
+    
+    (*
+       PopAllocationExemption - test to see that all strings are
+                                deallocated, except string, e, since
+                                the last push.
+                                Then it pops to the previous
+                                allocation/deallocation lists.
+    
+                                If halt is true then the application
+                                terminates with an exit code of 1.
+    
+                                The string, e, is returned unmodified,
+    *)
+    
+.. index::
+   PopAllocationExemption
+.. code-block:: modula2
+    PROCEDURE PopAllocationExemption (halt: BOOLEAN; e: String) : String ;
+    
+    
+    END DynamicStrings.
+
+@c @node gm2-libs/Environment, gm2-libs/FIO, gm2-libs/DynamicStrings, Base libraries
+gm2-libs/Environment
+--------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Environment ;
+
+    EXPORT QUALIFIED GetEnvironment, PutEnvironment ;
+    
+    
+    (*
+       GetEnvironment - gets the environment variable Env and places
+          	       	    a copy of its value into string, dest.
+                        It returns TRUE if the string Env was found in
+                        the processes environment.
+    *)
+    
+.. index::
+   GetEnvironment
+.. code-block:: modula2
+    PROCEDURE GetEnvironment (Env: ARRAY OF CHAR;
+                              VAR dest: ARRAY OF CHAR) : BOOLEAN ;
+    
+    
+    (*
+       PutEnvironment - change or add an environment variable definition
+                        EnvDef.
+                        TRUE is returned if the environment variable was
+                        set or changed successfully.
+    *)
+    
+.. index::
+   PutEnvironment
+.. code-block:: modula2
+    PROCEDURE PutEnvironment (EnvDef: ARRAY OF CHAR) : BOOLEAN ;
+    
+    
+    END Environment.
+
+@c @node gm2-libs/FIO, gm2-libs/FormatStrings, gm2-libs/Environment, Base libraries
+gm2-libs/FIO
+------------
+
+.. code-block:: modula2
+    DEFINITION MODULE FIO ;
+
+(* Provides a simple buffered file input/output library.  *)
+    
+    
+    FROM SYSTEM IMPORT ADDRESS, BYTE ;
+    
+    EXPORT QUALIFIED (* types *)
+                     File,
+                     (* procedures *)
+                     OpenToRead, OpenToWrite, OpenForRandom, Close,
+                     EOF, EOLN, WasEOLN, IsNoError, Exists, IsActive,
+                     exists, openToRead, openToWrite, openForRandom,
+                     SetPositionFromBeginning,
+                     SetPositionFromEnd,
+                     FindPosition,
+                     ReadChar, ReadString,
+                     WriteChar, WriteString, WriteLine,
+                     WriteCardinal, ReadCardinal,
+                     UnReadChar,
+                     WriteNBytes, ReadNBytes,
+                     FlushBuffer,
+                     GetUnixFileDescriptor,
+                     GetFileName, getFileName, getFileNameLength,
+                     FlushOutErr,
+                     (* variables *)
+                     StdIn, StdOut, StdErr ;
+    
+    TYPE
+.. index::
+   pair: File; (type)
+.. code-block:: modula2
+       File = CARDINAL ;
+    
+    (* the following variables are initialized to their UNIX equivalents *)
+    VAR
+.. index::
+   pair: StdIn; (var)
+   pair: StdOut; (var)
+   pair: StdErr; (var)
+.. code-block:: modula2
+       StdIn, StdOut, StdErr: File ;
+    
+    
+    
+    (*
+       IsNoError - returns a TRUE if no error has occured on file, f.
+    *)
+    
+.. index::
+   IsNoError
+.. code-block:: modula2
+    PROCEDURE IsNoError (f: File) : BOOLEAN ;
+    
+    
+    (*
+       IsActive - returns TRUE if the file, f, is still active.
+    *)
+    
+.. index::
+   IsActive
+.. code-block:: modula2
+    PROCEDURE IsActive (f: File) : BOOLEAN ;
+    
+    
+    (*
+       Exists - returns TRUE if a file named, fname exists for reading.
+    *)
+    
+.. index::
+   Exists
+.. code-block:: modula2
+    PROCEDURE Exists (fname: ARRAY OF CHAR) : BOOLEAN ;
+    
+    
+    (*
+       OpenToRead - attempts to open a file, fname, for reading and
+                    it returns this file.
+                    The success of this operation can be checked by
+                    calling IsNoError.
+    *)
+    
+.. index::
+   OpenToRead
+.. code-block:: modula2
+    PROCEDURE OpenToRead (fname: ARRAY OF CHAR) : File ;
+    
+    
+    (*
+       OpenToWrite - attempts to open a file, fname, for write and
+                     it returns this file.
+                     The success of this operation can be checked by
+                     calling IsNoError.
+    *)
+    
+.. index::
+   OpenToWrite
+.. code-block:: modula2
+    PROCEDURE OpenToWrite (fname: ARRAY OF CHAR) : File ;
+    
+    
+    (*
+       OpenForRandom - attempts to open a file, fname, for random access
+                       read or write and it returns this file.
+                       The success of this operation can be checked by
+                       calling IsNoError.
+                       towrite, determines whether the file should be
+                       opened for writing or reading.
+                       newfile, determines whether a file should be
+                       created if towrite is TRUE or whether the
+                       previous file should be left alone,
+                       allowing this descriptor to seek
+                       and modify an existing file.
+    *)
+    
+.. index::
+   OpenForRandom
+.. code-block:: modula2
+    PROCEDURE OpenForRandom (fname: ARRAY OF CHAR;
+                             towrite, newfile: BOOLEAN) : File ;
+    
+    
+    (*
+       Close - close a file which has been previously opened using:
+               OpenToRead, OpenToWrite, OpenForRandom.
+               It is correct to close a file which has an error status.
+    *)
+    
+.. index::
+   Close
+.. code-block:: modula2
+    PROCEDURE Close (f: File) ;
+    
+    
+    (* the following functions are functionally equivalent to the above
+       except they allow C style names.
+    *)
+    
+.. index::
+   exists
+.. code-block:: modula2
+    PROCEDURE exists        (fname: ADDRESS; flength: CARDINAL) : BOOLEAN ;
+.. index::
+   openToRead
+.. code-block:: modula2
+    PROCEDURE openToRead    (fname: ADDRESS; flength: CARDINAL) : File ;
+.. index::
+   openToWrite
+.. code-block:: modula2
+    PROCEDURE openToWrite   (fname: ADDRESS; flength: CARDINAL) : File ;
+.. index::
+   openForRandom
+.. code-block:: modula2
+    PROCEDURE openForRandom (fname: ADDRESS; flength: CARDINAL;
+                             towrite, newfile: BOOLEAN) : File ;
+    
+    
+    (*
+       FlushBuffer - flush contents of the FIO file, f, to libc.
+    *)
+    
+.. index::
+   FlushBuffer
+.. code-block:: modula2
+    PROCEDURE FlushBuffer (f: File) ;
+    
+    
+    (*
+       ReadNBytes - reads nBytes of a file into memory area, dest, returning
+                    the number of bytes actually read.
+                    This function will consume from the buffer and then
+                    perform direct libc reads. It is ideal for large reads.
+    *)
+    
+.. index::
+   ReadNBytes
+.. code-block:: modula2
+    PROCEDURE ReadNBytes (f: File; nBytes: CARDINAL;
+                          dest: ADDRESS) : CARDINAL ;
+    
+    
+    (*
+       ReadAny - reads HIGH(a) bytes into, a. All input
+                 is fully buffered, unlike ReadNBytes and thus is more
+                 suited to small reads.
+    *)
+    
+.. index::
+   ReadAny
+.. code-block:: modula2
+    PROCEDURE ReadAny (f: File; VAR a: ARRAY OF BYTE) ;
+    
+    
+    (*
+       WriteNBytes - writes nBytes from memory area src to a file
+                     returning the number of bytes actually written.
+                     This function will flush the buffer and then
+                     write the nBytes using a direct write from libc.
+                     It is ideal for large writes.
+    *)
+    
+.. index::
+   WriteNBytes
+.. code-block:: modula2
+    PROCEDURE WriteNBytes (f: File; nBytes: CARDINAL;
+                           src: ADDRESS) : CARDINAL ;
+    
+    
+    (*
+       WriteAny - writes HIGH(a) bytes onto, file, f. All output
+                  is fully buffered, unlike WriteNBytes and thus is more
+                  suited to small writes.
+    *)
+    
+.. index::
+   WriteAny
+.. code-block:: modula2
+    PROCEDURE WriteAny (f: File; VAR a: ARRAY OF BYTE) ;
+    
+    
+    (*
+       WriteChar - writes a single character to file, f.
+    *)
+    
+.. index::
+   WriteChar
+.. code-block:: modula2
+    PROCEDURE WriteChar (f: File; ch: CHAR) ;
+    
+    
+    (*
+       EOF - tests to see whether a file, f, has reached end of file.
+    *)
+    
+.. index::
+   EOF
+.. code-block:: modula2
+    PROCEDURE EOF (f: File) : BOOLEAN ;
+    
+    
+    (*
+       EOLN - tests to see whether a file, f, is about to read a newline.
+              It does NOT consume the newline.  It reads the next character
+              and then immediately unreads the character.
+    *)
+    
+.. index::
+   EOLN
+.. code-block:: modula2
+    PROCEDURE EOLN (f: File) : BOOLEAN ;
+    
+    
+    (*
+       WasEOLN - tests to see whether a file, f, has just read a newline
+                 character.
+    *)
+    
+.. index::
+   WasEOLN
+.. code-block:: modula2
+    PROCEDURE WasEOLN (f: File) : BOOLEAN ;
+    
+    
+    (*
+       ReadChar - returns a character read from file, f.
+                  Sensible to check with IsNoError or EOF after calling
+                  this function.
+    *)
+    
+.. index::
+   ReadChar
+.. code-block:: modula2
+    PROCEDURE ReadChar (f: File) : CHAR ;
+    
+    
+    (*
+       UnReadChar - replaces a character, ch, back into file, f.
+                    This character must have been read by ReadChar
+                    and it does not allow successive calls.  It may
+                    only be called if the previous read was successful,
+                    end of file or end of line seen.
+    *)
+    
+.. index::
+   UnReadChar
+.. code-block:: modula2
+    PROCEDURE UnReadChar (f: File ; ch: CHAR) ;
+    
+    
+    (*
+       WriteLine - writes out a linefeed to file, f.
+    *)
+    
+.. index::
+   WriteLine
+.. code-block:: modula2
+    PROCEDURE WriteLine (f: File) ;
+    
+    
+    (*
+       WriteString - writes a string to file, f.
+    *)
+    
+.. index::
+   WriteString
+.. code-block:: modula2
+    PROCEDURE WriteString (f: File; a: ARRAY OF CHAR) ;
+    
+    
+    (*
+       ReadString - reads a string from file, f, into string, a.
+                    It terminates the string if HIGH is reached or
+                    if a newline is seen or an error occurs.
+    *)
+    
+.. index::
+   ReadString
+.. code-block:: modula2
+    PROCEDURE ReadString (f: File; VAR a: ARRAY OF CHAR) ;
+    
+    
+    (*
+       WriteCardinal - writes a CARDINAL to file, f.
+                       It writes the binary image of the CARDINAL.
+                       to file, f.
+    *)
+    
+.. index::
+   WriteCardinal
+.. code-block:: modula2
+    PROCEDURE WriteCardinal (f: File; c: CARDINAL) ;
+    
+    
+    (*
+       ReadCardinal - reads a CARDINAL from file, f.
+                      It reads a bit image of a CARDINAL
+                      from file, f.
+    *)
+    
+.. index::
+   ReadCardinal
+.. code-block:: modula2
+    PROCEDURE ReadCardinal (f: File) : CARDINAL ;
+    
+    
+    (*
+       GetUnixFileDescriptor - returns the UNIX file descriptor of a file.
+                               Useful when combining FIO.mod with select
+                               (in Selective.def - but note the comments in
+                                Selective about using read/write primatives)
+    *)
+    
+.. index::
+   GetUnixFileDescriptor
+.. code-block:: modula2
+    PROCEDURE GetUnixFileDescriptor (f: File) : INTEGER ;
+    
+    
+    (*
+       SetPositionFromBeginning - sets the position from the beginning
+                                  of the file.
+    *)
+    
+.. index::
+   SetPositionFromBeginning
+.. code-block:: modula2
+    PROCEDURE SetPositionFromBeginning (f: File; pos: LONGINT) ;
+    
+    
+    (*
+       SetPositionFromEnd - sets the position from the end of the file.
+    *)
+    
+.. index::
+   SetPositionFromEnd
+.. code-block:: modula2
+    PROCEDURE SetPositionFromEnd (f: File; pos: LONGINT) ;
+    
+    
+    (*
+       FindPosition - returns the current absolute position in file, f.
+    *)
+    
+.. index::
+   FindPosition
+.. code-block:: modula2
+    PROCEDURE FindPosition (f: File) : LONGINT ;
+    
+    
+    (*
+       GetFileName - assigns, a, with the filename associated with, f.
+    *)
+    
+.. index::
+   GetFileName
+.. code-block:: modula2
+    PROCEDURE GetFileName (f: File; VAR a: ARRAY OF CHAR) ;
+    
+    
+    (*
+       getFileName - returns the address of the filename associated with, f.
+    *)
+    
+.. index::
+   getFileName
+.. code-block:: modula2
+    PROCEDURE getFileName (f: File) : ADDRESS ;
+    
+    
+    (*
+       getFileNameLength - returns the number of characters associated with
+                           filename, f.
+    *)
+    
+.. index::
+   getFileNameLength
+.. code-block:: modula2
+    PROCEDURE getFileNameLength (f: File) : CARDINAL ;
+    
+    
+    (*
+       FlushOutErr - flushes, StdOut, and, StdErr.
+    *)
+    
+.. index::
+   FlushOutErr
+.. code-block:: modula2
+    PROCEDURE FlushOutErr ;
+    
+    
+    END FIO.
+
+@c @node gm2-libs/FormatStrings, gm2-libs/FpuIO, gm2-libs/FIO, Base libraries
+gm2-libs/FormatStrings
+----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE FormatStrings ;
+
+    FROM SYSTEM IMPORT BYTE ;
+    FROM DynamicStrings IMPORT String ;
+    EXPORT QUALIFIED Sprintf0, Sprintf1, Sprintf2, Sprintf3, Sprintf4,
+                     HandleEscape ;
+    
+    
+    (*
+       Sprintf0 - returns a String containing, fmt, after it has had its
+                  escape sequences translated.
+    *)
+    
+.. index::
+   Sprintf0
+.. code-block:: modula2
+    PROCEDURE Sprintf0 (fmt: String) : String ;
+    
+    
+    (*
+       Sprintf1 - returns a String containing, fmt, together with
+                  encapsulated entity, w. It only formats the
+                  first %s or %d with n.
+    *)
+    
+.. index::
+   Sprintf1
+.. code-block:: modula2
+    PROCEDURE Sprintf1 (fmt: String; w: ARRAY OF BYTE) : String ;
+    
+    
+    (*
+       Sprintf2 - returns a string, fmt, which has been formatted.
+    *)
+    
+.. index::
+   Sprintf2
+.. code-block:: modula2
+    PROCEDURE Sprintf2 (fmt: String; w1, w2: ARRAY OF BYTE) : String ;
+    
+    
+    (*
+       Sprintf3 - returns a string, fmt, which has been formatted.
+    *)
+    
+.. index::
+   Sprintf3
+.. code-block:: modula2
+    PROCEDURE Sprintf3 (fmt: String; w1, w2, w3: ARRAY OF BYTE) : String ;
+    
+    
+    (*
+       Sprintf4 - returns a string, fmt, which has been formatted.
+    *)
+    
+.. index::
+   Sprintf4
+.. code-block:: modula2
+    PROCEDURE Sprintf4 (fmt: String;
+                        w1, w2, w3, w4: ARRAY OF BYTE) : String ;
+    
+    
+    (*
+       HandleEscape - translates \a, \b, \e, \f, \n, \r, \x[hex] \[octal]
+                      into their respective ascii codes.  It also converts
+                      \[any] into a single [any] character.
+    *)
+    
+.. index::
+   HandleEscape
+.. code-block:: modula2
+    PROCEDURE HandleEscape (s: String) : String ;
+    
+    
+    END FormatStrings.
+
+@c @node gm2-libs/FpuIO, gm2-libs/GetOpt, gm2-libs/FormatStrings, Base libraries
+gm2-libs/FpuIO
+--------------
+
+.. code-block:: modula2
+    DEFINITION MODULE FpuIO ;
+
+    EXPORT QUALIFIED ReadReal, WriteReal, StrToReal, RealToStr,
+                     ReadLongReal, WriteLongReal, StrToLongReal,
+                     LongRealToStr,
+                     ReadLongInt, WriteLongInt, StrToLongInt,
+                     LongIntToStr ;
+    
+    
+.. index::
+   ReadReal
+.. code-block:: modula2
+    PROCEDURE ReadReal (VAR x: REAL) ;
+.. index::
+   WriteReal
+.. code-block:: modula2
+    PROCEDURE WriteReal (x: REAL; TotalWidth, FractionWidth: CARDINAL) ;
+.. index::
+   StrToReal
+.. code-block:: modula2
+    PROCEDURE StrToReal (a: ARRAY OF CHAR ; VAR x: REAL) ;
+.. index::
+   RealToStr
+.. code-block:: modula2
+    PROCEDURE RealToStr (x: REAL; TotalWidth, FractionWidth: CARDINAL;
+                         VAR a: ARRAY OF CHAR) ;
+    
+.. index::
+   ReadLongReal
+.. code-block:: modula2
+    PROCEDURE ReadLongReal (VAR x: LONGREAL) ;
+.. index::
+   WriteLongReal
+.. code-block:: modula2
+    PROCEDURE WriteLongReal (x: LONGREAL;
+                             TotalWidth, FractionWidth: CARDINAL) ;
+.. index::
+   StrToLongReal
+.. code-block:: modula2
+    PROCEDURE StrToLongReal (a: ARRAY OF CHAR ; VAR x: LONGREAL) ;
+.. index::
+   LongRealToStr
+.. code-block:: modula2
+    PROCEDURE LongRealToStr (x: LONGREAL;
+                             TotalWidth, FractionWidth: CARDINAL;
+                             VAR a: ARRAY OF CHAR) ;
+    
+.. index::
+   ReadLongInt
+.. code-block:: modula2
+    PROCEDURE ReadLongInt (VAR x: LONGINT) ;
+.. index::
+   WriteLongInt
+.. code-block:: modula2
+    PROCEDURE WriteLongInt (x: LONGINT; n: CARDINAL) ;
+.. index::
+   StrToLongInt
+.. code-block:: modula2
+    PROCEDURE StrToLongInt (a: ARRAY OF CHAR ; VAR x: LONGINT) ;
+.. index::
+   LongIntToStr
+.. code-block:: modula2
+    PROCEDURE LongIntToStr (x: LONGINT; n: CARDINAL; VAR a: ARRAY OF CHAR) ;
+    
+    
+    END FpuIO.
+
+@c @node gm2-libs/GetOpt, gm2-libs/IO, gm2-libs/FpuIO, Base libraries
+gm2-libs/GetOpt
+---------------
+
+.. code-block:: modula2
+    DEFINITION MODULE GetOpt ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    FROM DynamicStrings IMPORT String ;
+    
+    CONST
+.. index::
+   pair: no_argument; (const)
+.. code-block:: modula2
+       no_argument = 0 ;
+.. index::
+   pair: required_argument; (const)
+.. code-block:: modula2
+       required_argument = 1 ;
+.. index::
+   pair: optional_argument; (const)
+.. code-block:: modula2
+       optional_argument = 2 ;
+    
+    TYPE
+.. index::
+   pair: LongOptions; (type)
+.. code-block:: modula2
+       LongOptions ;
+.. index::
+   pair: PtrToInteger; (type)
+.. code-block:: modula2
+       PtrToInteger = POINTER TO INTEGER ;
+    
+    (*
+       GetOpt - call C getopt and fill in the parameters:
+                optarg, optind, opterr and optop.
+    *)
+    
+.. index::
+   GetOpt
+.. code-block:: modula2
+    PROCEDURE GetOpt (argc: INTEGER; argv: ADDRESS; optstring: String;
+                      VAR optarg: String;
+                      VAR optind, opterr, optopt: INTEGER) : CHAR ;
+    
+    
+    (*
+       InitLongOptions - creates and returns a LongOptions empty array.
+    *)
+    
+.. index::
+   InitLongOptions
+.. code-block:: modula2
+    PROCEDURE InitLongOptions () : LongOptions ;
+    
+    
+    (*
+       AddLongOption - appends long option {name, has_arg, flag, val} to the
+                       array of options and new long options array is
+                       returned.
+                       The old array, lo, should no longer be used.
+    
+       (from man 3 getopt)
+           The meanings of the different fields are:
+    
+           name   is the name of the long option.
+    
+           has_arg
+                  is: no_argument (or 0) if the option does not take an
+                  argument; required_argument (or  1) if the option
+                  requires an argument; or optional_argument (or 2) if
+                  the option takes an optional argument.
+    
+           flag   specifies how results are returned for a long option.
+                  If flag is NULL, then getopt_long() returns val.
+                  (For example, the calling program may set val to the
+                  equivalent short option character).  Otherwise,
+                  getopt_long() returns 0, and flag points to a
+                  variable which is set to val if the option is found,
+                  but left unchanged if the option is not found.
+    
+           val    is the value to return, or to load into the variable
+                  pointed to by flag.
+    
+           The last element of the array has to be filled with zeros.
+    *)
+    
+.. index::
+   AddLongOption
+.. code-block:: modula2
+    PROCEDURE AddLongOption (lo: LongOptions;
+                             name: String; has_arg: INTEGER;
+                             flag: PtrToInteger;
+                             val: INTEGER) : LongOptions ;
+    
+    
+    (*
+       KillLongOptions - returns NIL and also frees up memory
+                         associated with, lo.
+    *)
+    
+.. index::
+   KillLongOptions
+.. code-block:: modula2
+    PROCEDURE KillLongOptions (lo: LongOptions) : LongOptions ;
+    
+    
+    (*
+       GetOptLong - works like GetOpt but will accept long options (using
+                    two dashes).  If the program only accepts long options
+                    then optstring should be an empty string, not NIL.
+    *)
+    
+.. index::
+   GetOptLong
+.. code-block:: modula2
+    PROCEDURE GetOptLong (argc: INTEGER; argv: ADDRESS; optstring: String;
+                          longopts: LongOptions;
+                          VAR longindex: INTEGER) : INTEGER ;
+    
+    
+    (*
+       GetOptLongOnly - works like GetOptLong except that a single dash
+                        can be used for a long option.
+    *)
+    
+.. index::
+   GetOptLongOnly
+.. code-block:: modula2
+    PROCEDURE GetOptLongOnly (argc: INTEGER; argv: ADDRESS;
+                              optstring: String; longopts: LongOptions;
+                              VAR longindex: INTEGER) : INTEGER ;
+    
+    
+    END GetOpt.
+
+@c @node gm2-libs/IO, gm2-libs/Indexing, gm2-libs/GetOpt, Base libraries
+gm2-libs/IO
+-----------
+
+.. code-block:: modula2
+    DEFINITION MODULE IO ;
+
+(*
+   Description: provides Read, Write, Errors procedures that map onto UNIX
+                file descriptors 0, 1 and 2. This is achieved by using
+                FIO if we are in buffered mode and using libc.write
+                if not.
+*)
+    
+    EXPORT QUALIFIED Read, Write, Error,
+                     UnBufferedMode, BufferedMode,
+                     EchoOn, EchoOff ;
+    
+    
+.. index::
+   Read
+.. code-block:: modula2
+    PROCEDURE Read (VAR ch: CHAR) ;
+.. index::
+   Write
+.. code-block:: modula2
+    PROCEDURE Write (ch: CHAR) ;
+.. index::
+   Error
+.. code-block:: modula2
+    PROCEDURE Error (ch: CHAR) ;
+    
+    
+    (*
+       UnBufferedMode - places file descriptor, fd, into an unbuffered mode.
+    *)
+    
+.. index::
+   UnBufferedMode
+.. code-block:: modula2
+    PROCEDURE UnBufferedMode (fd: INTEGER; input: BOOLEAN) ;
+    
+    
+    (*
+       BufferedMode - places file descriptor, fd, into a buffered mode.
+    *)
+    
+.. index::
+   BufferedMode
+.. code-block:: modula2
+    PROCEDURE BufferedMode (fd: INTEGER; input: BOOLEAN) ;
+    
+    
+    (*
+       EchoOn - turns on echoing for file descriptor, fd.  This
+                only really makes sence for a file descriptor opened
+                for terminal input or maybe some specific file descriptor
+                which is attached to a particular piece of hardware.
+    *)
+    
+.. index::
+   EchoOn
+.. code-block:: modula2
+    PROCEDURE EchoOn (fd: INTEGER; input: BOOLEAN) ;
+    
+    
+    (*
+       EchoOff - turns off echoing for file descriptor, fd.  This
+                 only really makes sence for a file descriptor opened
+                 for terminal input or maybe some specific file descriptor
+                 which is attached to a particular piece of hardware.
+    *)
+    
+.. index::
+   EchoOff
+.. code-block:: modula2
+    PROCEDURE EchoOff (fd: INTEGER; input: BOOLEAN) ;
+    
+    
+    END IO.
+
+@c @node gm2-libs/Indexing, gm2-libs/LMathLib0, gm2-libs/IO, Base libraries
+gm2-libs/Indexing
+-----------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Indexing ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    EXPORT QUALIFIED Index, InitIndex, KillIndex, GetIndice, PutIndice,
+                     HighIndice, LowIndice, InBounds, IsIndiceInIndex,
+                     RemoveIndiceFromIndex, IncludeIndiceIntoIndex,
+                     ForeachIndiceInIndexDo, DeleteIndice, DebugIndex ;
+    
+    TYPE
+.. index::
+   pair: Index; (type)
+.. code-block:: modula2
+       Index ;
+.. index::
+   pair: IndexProcedure; (type)
+.. code-block:: modula2
+       IndexProcedure = PROCEDURE (ADDRESS) ;
+    
+    
+    (*
+       InitIndex - creates and returns an Index.
+    *)
+    
+.. index::
+   InitIndex
+.. code-block:: modula2
+    PROCEDURE InitIndex (low: CARDINAL) : Index ;
+    
+    
+    (*
+       KillIndex - returns Index to free storage.
+    *)
+    
+.. index::
+   KillIndex
+.. code-block:: modula2
+    PROCEDURE KillIndex (i: Index) : Index ;
+    
+    
+    (*
+       DebugIndex - turns on debugging within an index.
+    *)
+    
+.. index::
+   DebugIndex
+.. code-block:: modula2
+    PROCEDURE DebugIndex (i: Index) : Index ;
+    
+    
+    (*
+       InBounds - returns TRUE if indice, n, is within the bounds
+                  of the dynamic array.
+    *)
+    
+.. index::
+   InBounds
+.. code-block:: modula2
+    PROCEDURE InBounds (i: Index; n: CARDINAL) : BOOLEAN ;
+    
+    
+    (*
+       HighIndice - returns the last legally accessible indice of this array.
+    *)
+    
+.. index::
+   HighIndice
+.. code-block:: modula2
+    PROCEDURE HighIndice (i: Index) : CARDINAL ;
+    
+    
+    (*
+       LowIndice - returns the first legally accessible indice of this array.
+    *)
+    
+.. index::
+   LowIndice
+.. code-block:: modula2
+    PROCEDURE LowIndice (i: Index) : CARDINAL ;
+    
+    
+    (*
+       PutIndice - places, a, into the dynamic array at position i[n]
+    *)
+    
+.. index::
+   PutIndice
+.. code-block:: modula2
+    PROCEDURE PutIndice (i: Index; n: CARDINAL; a: ADDRESS) ;
+    
+    
+    (*
+       GetIndice - retrieves, element i[n] from the dynamic array.
+    *)
+    
+.. index::
+   GetIndice
+.. code-block:: modula2
+    PROCEDURE GetIndice (i: Index; n: CARDINAL) : ADDRESS ;
+    
+    
+    (*
+       IsIndiceInIndex - returns TRUE if, a, is in the index, i.
+    *)
+    
+.. index::
+   IsIndiceInIndex
+.. code-block:: modula2
+    PROCEDURE IsIndiceInIndex (i: Index; a: ADDRESS) : BOOLEAN ;
+    
+    
+    (*
+       RemoveIndiceFromIndex - removes, a, from Index, i.
+    *)
+    
+.. index::
+   RemoveIndiceFromIndex
+.. code-block:: modula2
+    PROCEDURE RemoveIndiceFromIndex (i: Index; a: ADDRESS) ;
+    
+    
+    (*
+       DeleteIndice - delete i[j] from the array.
+    *)
+    
+.. index::
+   DeleteIndice
+.. code-block:: modula2
+    PROCEDURE DeleteIndice (i: Index; j: CARDINAL) ;
+    
+    
+    (*
+       IncludeIndiceIntoIndex - if the indice is not in the index, then
+                                add it at the end.
+    *)
+    
+.. index::
+   IncludeIndiceIntoIndex
+.. code-block:: modula2
+    PROCEDURE IncludeIndiceIntoIndex (i: Index; a: ADDRESS) ;
+    
+    
+    (*
+       ForeachIndiceInIndexDo - for each j indice of i, call procedure p(i[j])
+    *)
+    
+.. index::
+   ForeachIndiceInIndexDo
+.. code-block:: modula2
+    PROCEDURE ForeachIndiceInIndexDo (i: Index; p: IndexProcedure) ;
+    
+    
+    END Indexing.
+
+@c @node gm2-libs/LMathLib0, gm2-libs/LegacyReal, gm2-libs/Indexing, Base libraries
+gm2-libs/LMathLib0
+------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE LMathLib0 ;
+
+    CONST
+       pi   = 3.1415926535897932384626433832795028841972;
+       exp1 = 2.7182818284590452353602874713526624977572;
+    
+    
+.. index::
+   sqrt
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sqrt (x: LONGREAL) : LONGREAL ;
+.. index::
+   exp
+.. code-block:: modula2
+    PROCEDURE exp (x: LONGREAL) : LONGREAL ;
+.. index::
+   ln
+.. code-block:: modula2
+    PROCEDURE ln (x: LONGREAL) : LONGREAL ;
+.. index::
+   sin
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sin (x: LONGREAL) : LONGREAL ;
+.. index::
+   cos
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cos (x: LONGREAL) : LONGREAL ;
+.. index::
+   tan
+.. code-block:: modula2
+    PROCEDURE tan (x: LONGREAL) : LONGREAL ;
+.. index::
+   arctan
+.. code-block:: modula2
+    PROCEDURE arctan (x: LONGREAL) : LONGREAL ;
+.. index::
+   entier
+.. code-block:: modula2
+    PROCEDURE entier (x: LONGREAL) : INTEGER ;
+    
+    
+    END LMathLib0.
+
+@c @node gm2-libs/LegacyReal, gm2-libs/M2Dependent, gm2-libs/LMathLib0, Base libraries
+gm2-libs/LegacyReal
+-------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE LegacyReal ;
+
+    TYPE
+       REAL = SHORTREAL ;
+    
+    
+    END LegacyReal.
+
+@c @node gm2-libs/M2Dependent, gm2-libs/M2EXCEPTION, gm2-libs/LegacyReal, Base libraries
+gm2-libs/M2Dependent
+--------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE M2Dependent ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    
+    
+    TYPE
+.. index::
+   pair: ArgCVEnvP; (type)
+.. code-block:: modula2
+       ArgCVEnvP = PROCEDURE (INTEGER, ADDRESS, ADDRESS) ;
+    
+    
+.. index::
+   ConstructModules
+.. code-block:: modula2
+    PROCEDURE ConstructModules (applicationmodule: ADDRESS;
+                                argc: INTEGER; argv, envp: ADDRESS) ;
+    
+.. index::
+   DeconstructModules
+.. code-block:: modula2
+    PROCEDURE DeconstructModules (applicationmodule: ADDRESS;
+                                  argc: INTEGER; argv, envp: ADDRESS) ;
+    
+    
+    (*
+       RegisterModule - adds module name to the list of outstanding
+                        modules which need to have their dependencies
+                        explored to determine initialization order.
+    *)
+    
+.. index::
+   RegisterModule
+.. code-block:: modula2
+    PROCEDURE RegisterModule (name: ADDRESS;
+                              init, fini:  ArgCVEnvP;
+                              dependencies: PROC) ;
+    
+    
+    (*
+       RequestDependant - used to specify that modulename is dependant upon
+                          module dependantmodule.
+    *)
+    
+.. index::
+   RequestDependant
+.. code-block:: modula2
+    PROCEDURE RequestDependant (modulename, dependantmodule: ADDRESS) ;
+    
+    
+    END M2Dependent.
+
+@c @node gm2-libs/M2EXCEPTION, gm2-libs/M2LINK, gm2-libs/M2Dependent, Base libraries
+gm2-libs/M2EXCEPTION
+--------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE M2EXCEPTION;
+
+    
+    (* This enumerated list of exceptions must match the exceptions in gm2-libs-iso to
+       allow mixed module dialect projects.  *)
+    
+    TYPE
+.. index::
+   pair: M2Exceptions; (type)
+.. code-block:: modula2
+      M2Exceptions =
+        (indexException,     rangeException,         caseSelectException,  invalidLocation,
+         functionException,  wholeValueException,    wholeDivException,    realValueException,
+         realDivException,   complexValueException,  complexDivException,  protException,
+         sysException,       coException,            exException
+        );
+    
+    
+    (* If the program or coroutine is in the exception state then return the enumeration
+       value representing the exception cause.  If it is not in the exception state then
+       raises and exception (exException).  *)
+    
+.. index::
+   M2Exception
+.. code-block:: modula2
+    PROCEDURE M2Exception () : M2Exceptions;
+    
+    (* Returns TRUE if the program or coroutine is in the exception state.
+       Returns FALSE if the program or coroutine is not in the exception state.  *)
+    
+.. index::
+   IsM2Exception
+.. code-block:: modula2
+    PROCEDURE IsM2Exception () : BOOLEAN;
+    
+    
+    END M2EXCEPTION.
+
+@c @node gm2-libs/M2LINK, gm2-libs/M2RTS, gm2-libs/M2EXCEPTION, Base libraries
+gm2-libs/M2LINK
+---------------
+
+.. code-block:: modula2
+    DEFINITION MODULE FOR "C" M2LINK ;
+
+    
+    TYPE
+.. index::
+   pair: PtrToChar; (type)
+.. code-block:: modula2
+       PtrToChar = POINTER TO CHAR ;
+    
+    (* These variables are set by the compiler in the program module
+       according to linking command line options.  *)
+    
+    VAR
+.. index::
+   pair: ForcedModuleInitOrder; (var)
+.. code-block:: modula2
+       ForcedModuleInitOrder: PtrToChar ;
+.. index::
+   pair: StaticInitialization; (var)
+.. code-block:: modula2
+       StaticInitialization : BOOLEAN ;
+    
+    
+.. index::
+   pair: END M2LINK.; (var)
+.. code-block:: modula2
+    END M2LINK.
+
+@c @node gm2-libs/M2RTS, gm2-libs/MathLib0, gm2-libs/M2LINK, Base libraries
+gm2-libs/M2RTS
+--------------
+
+.. code-block:: modula2
+    DEFINITION MODULE M2RTS ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    
+    
+    TYPE
+.. index::
+   pair: ArgCVEnvP; (type)
+.. code-block:: modula2
+       ArgCVEnvP = PROCEDURE (INTEGER, ADDRESS, ADDRESS) ;
+    
+    
+.. index::
+   ConstructModules
+.. code-block:: modula2
+    PROCEDURE ConstructModules (applicationmodule: ADDRESS;
+                                argc: INTEGER; argv, envp: ADDRESS) ;
+    
+.. index::
+   DeconstructModules
+.. code-block:: modula2
+    PROCEDURE DeconstructModules (applicationmodule: ADDRESS;
+                                  argc: INTEGER; argv, envp: ADDRESS) ;
+    
+    
+    (*
+       RegisterModule - adds module name to the list of outstanding
+                        modules which need to have their dependencies
+                        explored to determine initialization order.
+    *)
+    
+.. index::
+   RegisterModule
+.. code-block:: modula2
+    PROCEDURE RegisterModule (name: ADDRESS;
+                              init, fini:  ArgCVEnvP;
+                              dependencies: PROC) ;
+    
+    
+    (*
+       RequestDependant - used to specify that modulename is dependant upon
+                          module dependantmodule.
+    *)
+    
+.. index::
+   RequestDependant
+.. code-block:: modula2
+    PROCEDURE RequestDependant (modulename, dependantmodule: ADDRESS) ;
+    
+    
+    (*
+       InstallTerminationProcedure - installs a procedure, p, which will
+                                     be called when the procedure
+                                     ExecuteTerminationProcedures
+                                     is invoked.  It returns TRUE is the
+                                     procedure is installed.
+    *)
+    
+.. index::
+   InstallTerminationProcedure
+.. code-block:: modula2
+    PROCEDURE InstallTerminationProcedure (p: PROC) : BOOLEAN ;
+    
+    
+    (*
+       ExecuteInitialProcedures - executes the initial procedures installed
+                                  by InstallInitialProcedure.
+    *)
+    
+.. index::
+   ExecuteInitialProcedures
+.. code-block:: modula2
+    PROCEDURE ExecuteInitialProcedures ;
+    
+    
+    (*
+       InstallInitialProcedure - installs a procedure to be executed just
+                                 before the BEGIN code section of the main
+                                 program module.
+    *)
+    
+.. index::
+   InstallInitialProcedure
+.. code-block:: modula2
+    PROCEDURE InstallInitialProcedure (p: PROC) : BOOLEAN ;
+    
+    
+    (*
+       ExecuteTerminationProcedures - calls each installed termination procedure
+                                      in reverse order.
+    *)
+    
+.. index::
+   ExecuteTerminationProcedures
+.. code-block:: modula2
+    PROCEDURE ExecuteTerminationProcedures ;
+    
+    
+    (*
+       Terminate - provides compatibility for pim.  It call exit with
+                   the exitcode provided in a prior call to ExitOnHalt
+                   (or zero if ExitOnHalt was never called).  It does
+                   not call ExecuteTerminationProcedures.
+    *)
+    
+.. index::
+   Terminate
+.. code-block:: modula2
+    PROCEDURE Terminate <* noreturn *> ;
+    
+    
+    (*
+       HALT - terminate the current program.  The procedure Terminate
+              is called before the program is stopped.  The parameter
+              exitcode is optional.  If the parameter is not supplied
+              HALT will call libc 'abort', otherwise it will exit with
+              the code supplied.  Supplying a parameter to HALT has the
+              same effect as calling ExitOnHalt with the same code and
+              then calling HALT with no parameter.
+    *)
+    
+.. index::
+   HALT
+.. code-block:: modula2
+    PROCEDURE HALT ([exitcode: INTEGER = -1]) <* noreturn *> ;
+    
+    
+    (*
+       Halt - provides a more user friendly version of HALT, which takes
+              four parameters to aid debugging.
+    *)
+    
+.. index::
+   Halt
+.. code-block:: modula2
+    PROCEDURE Halt (file: ARRAY OF CHAR; line: CARDINAL;
+                    function: ARRAY OF CHAR; description: ARRAY OF CHAR)
+    		<* noreturn *> ;
+    
+    
+    (*
+       ExitOnHalt - if HALT is executed then call exit with the exit code, e.
+    *)
+    
+.. index::
+   ExitOnHalt
+.. code-block:: modula2
+    PROCEDURE ExitOnHalt (e: INTEGER) ;
+    
+    
+    (*
+       ErrorMessage - emits an error message to stderr and then calls exit (1).
+    *)
+    
+.. index::
+   ErrorMessage
+.. code-block:: modula2
+    PROCEDURE ErrorMessage (message: ARRAY OF CHAR;
+                            file: ARRAY OF CHAR;
+                            line: CARDINAL;
+                            function: ARRAY OF CHAR) <* noreturn *> ;
+    
+    
+    (*
+       Length - returns the length of a string, a. This is called whenever
+                the user calls LENGTH and the parameter cannot be calculated
+                at compile time.
+    *)
+    
+.. index::
+   Length
+.. code-block:: modula2
+    PROCEDURE Length (a: ARRAY OF CHAR) : CARDINAL ;
+    
+    
+    (*
+       The following are the runtime exception handler routines.
+    *)
+    
+.. index::
+   AssignmentException
+.. code-block:: modula2
+    PROCEDURE AssignmentException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   ReturnException
+.. code-block:: modula2
+    PROCEDURE ReturnException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   IncException
+.. code-block:: modula2
+    PROCEDURE IncException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   DecException
+.. code-block:: modula2
+    PROCEDURE DecException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   InclException
+.. code-block:: modula2
+    PROCEDURE InclException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   ExclException
+.. code-block:: modula2
+    PROCEDURE ExclException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   ShiftException
+.. code-block:: modula2
+    PROCEDURE ShiftException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   RotateException
+.. code-block:: modula2
+    PROCEDURE RotateException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   StaticArraySubscriptException
+.. code-block:: modula2
+    PROCEDURE StaticArraySubscriptException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   DynamicArraySubscriptException
+.. code-block:: modula2
+    PROCEDURE DynamicArraySubscriptException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   ForLoopBeginException
+.. code-block:: modula2
+    PROCEDURE ForLoopBeginException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   ForLoopToException
+.. code-block:: modula2
+    PROCEDURE ForLoopToException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   ForLoopEndException
+.. code-block:: modula2
+    PROCEDURE ForLoopEndException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   PointerNilException
+.. code-block:: modula2
+    PROCEDURE PointerNilException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   NoReturnException
+.. code-block:: modula2
+    PROCEDURE NoReturnException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   CaseException
+.. code-block:: modula2
+    PROCEDURE CaseException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   WholeNonPosDivException
+.. code-block:: modula2
+    PROCEDURE WholeNonPosDivException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   WholeNonPosModException
+.. code-block:: modula2
+    PROCEDURE WholeNonPosModException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   WholeZeroDivException
+.. code-block:: modula2
+    PROCEDURE WholeZeroDivException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   WholeZeroRemException
+.. code-block:: modula2
+    PROCEDURE WholeZeroRemException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   WholeValueException
+.. code-block:: modula2
+    PROCEDURE WholeValueException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   RealValueException
+.. code-block:: modula2
+    PROCEDURE RealValueException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   ParameterException
+.. code-block:: modula2
+    PROCEDURE ParameterException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   NoException
+.. code-block:: modula2
+    PROCEDURE NoException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+    
+    
+    END M2RTS.
+
+@c @node gm2-libs/MathLib0, gm2-libs/MemUtils, gm2-libs/M2RTS, Base libraries
+gm2-libs/MathLib0
+-----------------
+
+.. code-block:: modula2
+    DEFINITION MODULE MathLib0 ;
+
+    CONST
+       pi   = 3.1415926535897932384626433832795028841972;
+       exp1 = 2.7182818284590452353602874713526624977572;
+    
+    
+.. index::
+   sqrt
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sqrt (x: REAL) : REAL ;
+.. index::
+   exp
+.. code-block:: modula2
+    PROCEDURE exp (x: REAL) : REAL ;
+.. index::
+   ln
+.. code-block:: modula2
+    PROCEDURE ln (x: REAL) : REAL ;
+.. index::
+   sin
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sin (x: REAL) : REAL ;
+.. index::
+   cos
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cos (x: REAL) : REAL ;
+.. index::
+   tan
+.. code-block:: modula2
+    PROCEDURE tan (x: REAL) : REAL ;
+.. index::
+   arctan
+.. code-block:: modula2
+    PROCEDURE arctan (x: REAL) : REAL ;
+.. index::
+   entier
+.. code-block:: modula2
+    PROCEDURE entier (x: REAL) : INTEGER ;
+    
+    
+    END MathLib0.
+
+@c @node gm2-libs/MemUtils, gm2-libs/NumberIO, gm2-libs/MathLib0, Base libraries
+gm2-libs/MemUtils
+-----------------
+
+.. code-block:: modula2
+    DEFINITION MODULE MemUtils ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    EXPORT QUALIFIED MemCopy, MemZero ;
+    
+    
+    (*
+       MemCopy - copys a region of memory to the required destination.
+    *)
+    
+.. index::
+   MemCopy
+.. code-block:: modula2
+    PROCEDURE MemCopy (from: ADDRESS; length: CARDINAL; to: ADDRESS) ;
+    
+    
+    (*
+       MemZero - sets a region of memory: a..a+length to zero.
+    *)
+    
+.. index::
+   MemZero
+.. code-block:: modula2
+    PROCEDURE MemZero (a: ADDRESS; length: CARDINAL) ;
+    
+    
+    END MemUtils.
+
+@c @node gm2-libs/NumberIO, gm2-libs/OptLib, gm2-libs/MemUtils, Base libraries
+gm2-libs/NumberIO
+-----------------
+
+.. code-block:: modula2
+    DEFINITION MODULE NumberIO ;
+
+    EXPORT QUALIFIED ReadCard, WriteCard, ReadHex, WriteHex, ReadInt, WriteInt,
+                     CardToStr, StrToCard, StrToHex, HexToStr, StrToInt, IntToStr,
+                     ReadOct, WriteOct, OctToStr, StrToOct,
+                     ReadBin, WriteBin, BinToStr, StrToBin,
+                     StrToBinInt, StrToHexInt, StrToOctInt ;
+    
+    
+.. index::
+   ReadCard
+.. code-block:: modula2
+    PROCEDURE ReadCard (VAR x: CARDINAL) ;
+    
+.. index::
+   WriteCard
+.. code-block:: modula2
+    PROCEDURE WriteCard (x, n: CARDINAL) ;
+    
+.. index::
+   ReadHex
+.. code-block:: modula2
+    PROCEDURE ReadHex (VAR x: CARDINAL) ;
+    
+.. index::
+   WriteHex
+.. code-block:: modula2
+    PROCEDURE WriteHex (x, n: CARDINAL) ;
+    
+.. index::
+   ReadInt
+.. code-block:: modula2
+    PROCEDURE ReadInt (VAR x: INTEGER) ;
+    
+.. index::
+   WriteInt
+.. code-block:: modula2
+    PROCEDURE WriteInt (x: INTEGER ; n: CARDINAL) ;
+    
+.. index::
+   CardToStr
+.. code-block:: modula2
+    PROCEDURE CardToStr (x, n: CARDINAL ; VAR a: ARRAY OF CHAR) ;
+    
+.. index::
+   StrToCard
+.. code-block:: modula2
+    PROCEDURE StrToCard (a: ARRAY OF CHAR ; VAR x: CARDINAL) ;
+    
+.. index::
+   HexToStr
+.. code-block:: modula2
+    PROCEDURE HexToStr (x, n: CARDINAL ; VAR a: ARRAY OF CHAR) ;
+    
+.. index::
+   StrToHex
+.. code-block:: modula2
+    PROCEDURE StrToHex (a: ARRAY OF CHAR ; VAR x: CARDINAL) ;
+    
+.. index::
+   IntToStr
+.. code-block:: modula2
+    PROCEDURE IntToStr (x: INTEGER ; n: CARDINAL ; VAR a: ARRAY OF CHAR) ;
+    
+.. index::
+   StrToInt
+.. code-block:: modula2
+    PROCEDURE StrToInt (a: ARRAY OF CHAR ; VAR x: INTEGER) ;
+    
+.. index::
+   ReadOct
+.. code-block:: modula2
+    PROCEDURE ReadOct (VAR x: CARDINAL) ;
+    
+.. index::
+   WriteOct
+.. code-block:: modula2
+    PROCEDURE WriteOct (x, n: CARDINAL) ;
+    
+.. index::
+   OctToStr
+.. code-block:: modula2
+    PROCEDURE OctToStr (x, n: CARDINAL ; VAR a: ARRAY OF CHAR) ;
+    
+.. index::
+   StrToOct
+.. code-block:: modula2
+    PROCEDURE StrToOct (a: ARRAY OF CHAR ; VAR x: CARDINAL) ;
+    
+.. index::
+   ReadBin
+.. code-block:: modula2
+    PROCEDURE ReadBin (VAR x: CARDINAL) ;
+    
+.. index::
+   WriteBin
+.. code-block:: modula2
+    PROCEDURE WriteBin (x, n: CARDINAL) ;
+    
+.. index::
+   BinToStr
+.. code-block:: modula2
+    PROCEDURE BinToStr (x, n: CARDINAL ; VAR a: ARRAY OF CHAR) ;
+    
+.. index::
+   StrToBin
+.. code-block:: modula2
+    PROCEDURE StrToBin (a: ARRAY OF CHAR ; VAR x: CARDINAL) ;
+    
+.. index::
+   StrToBinInt
+.. code-block:: modula2
+    PROCEDURE StrToBinInt (a: ARRAY OF CHAR ; VAR x: INTEGER) ;
+    
+.. index::
+   StrToHexInt
+.. code-block:: modula2
+    PROCEDURE StrToHexInt (a: ARRAY OF CHAR ; VAR x: INTEGER) ;
+    
+.. index::
+   StrToOctInt
+.. code-block:: modula2
+    PROCEDURE StrToOctInt (a: ARRAY OF CHAR ; VAR x: INTEGER) ;
+    
+    
+    END NumberIO.
+
+@c @node gm2-libs/OptLib, gm2-libs/PushBackInput, gm2-libs/NumberIO, Base libraries
+gm2-libs/OptLib
+---------------
+
+.. code-block:: modula2
+    DEFINITION MODULE OptLib ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    FROM DynamicStrings IMPORT String ;
+    
+    TYPE
+.. index::
+   pair: Option; (type)
+.. code-block:: modula2
+       Option ;
+    
+    
+    (*
+       InitOption - constructor for Option.
+    *)
+    
+.. index::
+   InitOption
+.. code-block:: modula2
+    PROCEDURE InitOption (argc: INTEGER; argv: ADDRESS) : Option ;
+    
+    
+    (*
+       KillOption - deconstructor for Option.
+    *)
+    
+.. index::
+   KillOption
+.. code-block:: modula2
+    PROCEDURE KillOption (o: Option) : Option ;
+    
+    
+    (*
+       Dup - duplicate the option array inside, o.
+             Notice that this does not duplicate all the contents
+             (strings) of argv.
+             Shallow copy of the top level indices.
+    *)
+    
+.. index::
+   Dup
+.. code-block:: modula2
+    PROCEDURE Dup (o: Option) : Option ;
+    
+    
+    (*
+       Slice - return a new option which has elements [low:high] from the
+               options, o.
+    *)
+    
+.. index::
+   Slice
+.. code-block:: modula2
+    PROCEDURE Slice (o: Option; low, high: INTEGER) : Option ;
+    
+    
+    (*
+       IndexStrCmp - returns the index in the argv array which matches
+                     string, s.  -1 is returned if the string is not found.
+    *)
+    
+.. index::
+   IndexStrCmp
+.. code-block:: modula2
+    PROCEDURE IndexStrCmp (o: Option; s: String) : INTEGER ;
+    
+    
+    (*
+       IndexStrNCmp - returns the index in the argv array where the first
+                      characters are matched by string, s.
+                      -1 is returned if the string is not found.
+    *)
+    
+.. index::
+   IndexStrNCmp
+.. code-block:: modula2
+    PROCEDURE IndexStrNCmp (o: Option; s: String) : INTEGER ;
+    
+    
+    (*
+       ConCat - returns the concatenation of a and b.
+    *)
+    
+.. index::
+   ConCat
+.. code-block:: modula2
+    PROCEDURE ConCat (a, b: Option) : Option ;
+    
+    
+    (*
+       GetArgv - return the argv component of option.
+    *)
+    
+.. index::
+   GetArgv
+.. code-block:: modula2
+    PROCEDURE GetArgv (o: Option) : ADDRESS ;
+    
+    
+    (*
+       GetArgc - return the argc component of option.
+    *)
+    
+.. index::
+   GetArgc
+.. code-block:: modula2
+    PROCEDURE GetArgc (o: Option) : INTEGER ;
+    
+    
+    END OptLib.
+
+@c @node gm2-libs/PushBackInput, gm2-libs/RTExceptions, gm2-libs/OptLib, Base libraries
+gm2-libs/PushBackInput
+----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE PushBackInput ;
+
+    FROM FIO IMPORT File ;
+    FROM DynamicStrings IMPORT String ;
+    
+    EXPORT QUALIFIED Open, PutCh, GetCh, Error, WarnError, WarnString,
+                     Close, SetDebug, GetExitStatus, PutStr,
+                     PutString, GetColumnPosition, GetCurrentLine ;
+    
+    
+    (*
+       Open - opens a file for reading.
+    *)
+    
+.. index::
+   Open
+.. code-block:: modula2
+    PROCEDURE Open (a: ARRAY OF CHAR) : File ;
+    
+    
+    (*
+       GetCh - gets a character from either the push back stack or
+               from file, f.
+    *)
+    
+.. index::
+   GetCh
+.. code-block:: modula2
+    PROCEDURE GetCh (f: File) : CHAR ;
+    
+    
+    (*
+       PutCh - pushes a character onto the push back stack, it also
+               returns the character which has been pushed.
+    *)
+    
+.. index::
+   PutCh
+.. code-block:: modula2
+    PROCEDURE PutCh (ch: CHAR) : CHAR ;
+    
+    
+    (*
+       PutString - pushes a string onto the push back stack.
+    *)
+    
+.. index::
+   PutString
+.. code-block:: modula2
+    PROCEDURE PutString (a: ARRAY OF CHAR) ;
+    
+    
+    (*
+       PutStr - pushes a dynamic string onto the push back stack.
+                The string, s, is not deallocated.
+    *)
+    
+.. index::
+   PutStr
+.. code-block:: modula2
+    PROCEDURE PutStr (s: String) ;
+    
+    
+    (*
+       Error - emits an error message with the appropriate file, line combination.
+    *)
+    
+.. index::
+   Error
+.. code-block:: modula2
+    PROCEDURE Error (a: ARRAY OF CHAR) ;
+    
+    
+    (*
+       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.
+    *)
+    
+.. index::
+   WarnError
+.. code-block:: modula2
+    PROCEDURE WarnError (a: ARRAY OF CHAR) ;
+    
+    
+    (*
+       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.
+    *)
+    
+.. index::
+   WarnString
+.. code-block:: modula2
+    PROCEDURE WarnString (s: String) ;
+    
+    
+    (*
+       Close - closes the opened file.
+    *)
+    
+.. index::
+   Close
+.. code-block:: modula2
+    PROCEDURE Close (f: File) ;
+    
+    
+    (*
+       GetExitStatus - returns the exit status which will be 1 if any warnings were issued.
+    *)
+    
+.. index::
+   GetExitStatus
+.. code-block:: modula2
+    PROCEDURE GetExitStatus () : CARDINAL ;
+    
+    
+    (*
+       SetDebug - sets the debug flag on or off.
+    *)
+    
+.. index::
+   SetDebug
+.. code-block:: modula2
+    PROCEDURE SetDebug (d: BOOLEAN) ;
+    
+    
+    (*
+       GetColumnPosition - returns the column position of the current character.
+    *)
+    
+.. index::
+   GetColumnPosition
+.. code-block:: modula2
+    PROCEDURE GetColumnPosition () : CARDINAL ;
+    
+    
+    (*
+       GetCurrentLine - returns the current line number.
+    *)
+    
+.. index::
+   GetCurrentLine
+.. code-block:: modula2
+    PROCEDURE GetCurrentLine () : CARDINAL ;
+    
+    
+    END PushBackInput.
+
+@c @node gm2-libs/RTExceptions, gm2-libs/RTint, gm2-libs/PushBackInput, Base libraries
+gm2-libs/RTExceptions
+---------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE RTExceptions ;
+
+(* Runtime exception handler routines.  This should
+   be considered as a system module for GNU Modula-2
+   and allow the compiler to interface with exception
+   handling.  *)
+    
+    FROM SYSTEM IMPORT ADDRESS ;
+    EXPORT QUALIFIED EHBlock,
+                     Raise, SetExceptionBlock, GetExceptionBlock,
+                     GetTextBuffer, GetTextBufferSize, GetNumber,
+                     InitExceptionBlock, KillExceptionBlock,
+                     PushHandler, PopHandler,
+                     BaseExceptionsThrow, DefaultErrorCatch,
+                     IsInExceptionState, SetExceptionState,
+                     SwitchExceptionState, GetBaseExceptionBlock,
+                     SetExceptionSource, GetExceptionSource ;
+    
+    TYPE
+.. index::
+   pair: EHBlock; (type)
+.. code-block:: modula2
+       EHBlock ;
+.. index::
+   pair: ProcedureHandler; (type)
+.. code-block:: modula2
+       ProcedureHandler = PROCEDURE ;
+    
+    
+    (*
+       Raise - invoke the exception handler associated with, number,
+               in the active EHBlock.  It keeps a record of the number
+               and message in the EHBlock for later use.
+    *)
+    
+.. index::
+   Raise
+.. code-block:: modula2
+    PROCEDURE Raise (number: CARDINAL;
+                     file: ADDRESS; line: CARDINAL;
+                     column: CARDINAL; function: ADDRESS;
+                     message: ADDRESS) ;
+    
+    
+    (*
+       SetExceptionBlock - sets, source, as the active EHB.
+    *)
+    
+.. index::
+   SetExceptionBlock
+.. code-block:: modula2
+    PROCEDURE SetExceptionBlock (source: EHBlock) ;
+    
+    
+    (*
+       GetExceptionBlock - returns the active EHB.
+    *)
+    
+.. index::
+   GetExceptionBlock
+.. code-block:: modula2
+    PROCEDURE GetExceptionBlock () : EHBlock ;
+    
+    
+    (*
+       GetTextBuffer - returns the address of the EHB buffer.
+    *)
+    
+.. index::
+   GetTextBuffer
+.. code-block:: modula2
+    PROCEDURE GetTextBuffer (e: EHBlock) : ADDRESS ;
+    
+    
+    (*
+       GetTextBufferSize - return the size of the EHB text buffer.
+    *)
+    
+.. index::
+   GetTextBufferSize
+.. code-block:: modula2
+    PROCEDURE GetTextBufferSize (e: EHBlock) : CARDINAL ;
+    
+    
+    (*
+       GetNumber - return the exception number associated with,
+                   source.
+    *)
+    
+.. index::
+   GetNumber
+.. code-block:: modula2
+    PROCEDURE GetNumber (source: EHBlock) : CARDINAL ;
+    
+    
+    (*
+       InitExceptionBlock - creates and returns a new exception block.
+    *)
+    
+.. index::
+   InitExceptionBlock
+.. code-block:: modula2
+    PROCEDURE InitExceptionBlock () : EHBlock ;
+    
+    
+    (*
+       KillExceptionBlock - destroys the EHB, e, and all its handlers.
+    *)
+    
+.. index::
+   KillExceptionBlock
+.. code-block:: modula2
+    PROCEDURE KillExceptionBlock (e: EHBlock) : EHBlock ;
+    
+    
+    (*
+       PushHandler - install a handler in EHB, e.
+    *)
+    
+.. index::
+   PushHandler
+.. code-block:: modula2
+    PROCEDURE PushHandler (e: EHBlock; number: CARDINAL; p: ProcedureHandler) ;
+    
+    
+    (*
+       PopHandler - removes the handler associated with, number, from
+                    EHB, e.
+    *)
+    
+.. index::
+   PopHandler
+.. code-block:: modula2
+    PROCEDURE PopHandler (e: EHBlock; number: CARDINAL) ;
+    
+    
+    (*
+       DefaultErrorCatch - displays the current error message in
+                           the current exception block and then
+                           calls HALT.
+    *)
+    
+.. index::
+   DefaultErrorCatch
+.. code-block:: modula2
+    PROCEDURE DefaultErrorCatch ;
+    
+    
+    (*
+       BaseExceptionsThrow - configures the Modula-2 exceptions to call
+                             THROW which in turn can be caught by an
+                             exception block.  If this is not called then
+                             a Modula-2 exception will simply call an
+                             error message routine and then HALT.
+    *)
+    
+.. index::
+   BaseExceptionsThrow
+.. code-block:: modula2
+    PROCEDURE BaseExceptionsThrow ;
+    
+    
+    (*
+       IsInExceptionState - returns TRUE if the program is currently
+                            in the exception state.
+    *)
+    
+.. index::
+   IsInExceptionState
+.. code-block:: modula2
+    PROCEDURE IsInExceptionState () : BOOLEAN ;
+    
+    
+    (*
+       SetExceptionState - returns the current exception state and
+                           then sets the current exception state to,
+                           to.
+    *)
+    
+.. index::
+   SetExceptionState
+.. code-block:: modula2
+    PROCEDURE SetExceptionState (to: BOOLEAN) : BOOLEAN ;
+    
+    
+    (*
+       SwitchExceptionState - assigns, from, with the current exception
+                              state and then assigns the current exception
+                              to, to.
+    *)
+    
+.. index::
+   SwitchExceptionState
+.. code-block:: modula2
+    PROCEDURE SwitchExceptionState (VAR from: BOOLEAN; to: BOOLEAN) ;
+    
+    
+    (*
+       GetBaseExceptionBlock - returns the initial language exception block
+                               created.
+    *)
+    
+.. index::
+   GetBaseExceptionBlock
+.. code-block:: modula2
+    PROCEDURE GetBaseExceptionBlock () : EHBlock ;
+    
+    
+    (*
+       SetExceptionSource - sets the current exception source to, source.
+    *)
+    
+.. index::
+   SetExceptionSource
+.. code-block:: modula2
+    PROCEDURE SetExceptionSource (source: ADDRESS) ;
+    
+    
+    (*
+       GetExceptionSource - returns the current exception source.
+    *)
+    
+.. index::
+   GetExceptionSource
+.. code-block:: modula2
+    PROCEDURE GetExceptionSource () : ADDRESS ;
+    
+    
+    END RTExceptions.
+
+@c @node gm2-libs/RTint, gm2-libs/SArgs, gm2-libs/RTExceptions, Base libraries
+gm2-libs/RTint
+--------------
+
+.. code-block:: modula2
+    DEFINITION MODULE RTint ;
+
+(* Provides users of the COROUTINES library with the
+   ability to create interrupt sources based on
+   file descriptors and timeouts.  *)
+    
+    FROM SYSTEM IMPORT ADDRESS ;
+    
+    TYPE
+.. index::
+   pair: DispatchVector; (type)
+.. code-block:: modula2
+       DispatchVector = PROCEDURE (CARDINAL, CARDINAL, ADDRESS) ;
+    
+    
+    (*
+       InitInputVector - returns an interrupt vector which is associated
+                         with the file descriptor, fd.
+    *)
+    
+.. index::
+   InitInputVector
+.. code-block:: modula2
+    PROCEDURE InitInputVector (fd: INTEGER; pri: CARDINAL) : CARDINAL ;
+    
+    
+    (*
+       InitOutputVector - returns an interrupt vector which is associated
+                          with the file descriptor, fd.
+    *)
+    
+.. index::
+   InitOutputVector
+.. code-block:: modula2
+    PROCEDURE InitOutputVector (fd: INTEGER; pri: CARDINAL) : CARDINAL ;
+    
+    
+    (*
+       InitTimeVector - returns an interrupt vector associated with
+                        the relative time.
+    *)
+    
+.. index::
+   InitTimeVector
+.. code-block:: modula2
+    PROCEDURE InitTimeVector (micro, secs: CARDINAL; pri: CARDINAL) : CARDINAL ;
+    
+    
+    (*
+       ReArmTimeVector - reprimes the vector, vec, to deliver an interrupt
+                         at the new relative time.
+    *)
+    
+.. index::
+   ReArmTimeVector
+.. code-block:: modula2
+    PROCEDURE ReArmTimeVector (vec: CARDINAL; micro, secs: CARDINAL) ;
+    
+    
+    (*
+       GetTimeVector - assigns, micro, and, secs, with the remaining
+                       time before this interrupt will expire.
+                       This value is only updated when a Listen
+                       occurs.
+    *)
+    
+.. index::
+   GetTimeVector
+.. code-block:: modula2
+    PROCEDURE GetTimeVector (vec: CARDINAL; VAR micro, secs: CARDINAL) ;
+    
+    
+    (*
+       AttachVector - adds the pointer, p, to be associated with the interrupt
+                      vector. It returns the previous value attached to this
+                      vector.
+    *)
+    
+.. index::
+   AttachVector
+.. code-block:: modula2
+    PROCEDURE AttachVector (vec: CARDINAL; p: ADDRESS) : ADDRESS ;
+    
+    
+    (*
+       IncludeVector - includes, vec, into the dispatcher list of
+                       possible interrupt causes.
+    *)
+    
+.. index::
+   IncludeVector
+.. code-block:: modula2
+    PROCEDURE IncludeVector (vec: CARDINAL) ;
+    
+    
+    (*
+       ExcludeVector - excludes, vec, from the dispatcher list of
+                       possible interrupt causes.
+    *)
+    
+.. index::
+   ExcludeVector
+.. code-block:: modula2
+    PROCEDURE ExcludeVector (vec: CARDINAL) ;
+    
+    
+    (*
+       Listen - will either block indefinitely (until an interrupt)
+                or alteratively will test to see whether any interrupts
+                are pending.
+                If a pending interrupt was found then, call, is called
+                and then this procedure returns.
+                It only listens for interrupts > pri.
+    *)
+    
+.. index::
+   Listen
+.. code-block:: modula2
+    PROCEDURE Listen (untilInterrupt: BOOLEAN;
+                      call: DispatchVector;
+                      pri: CARDINAL) ;
+    
+    
+    (*
+       Init - allows the user to force the initialize order.
+    *)
+    
+.. index::
+   Init
+.. code-block:: modula2
+    PROCEDURE Init ;
+    
+    
+    END RTint.
+
+@c @node gm2-libs/SArgs, gm2-libs/SCmdArgs, gm2-libs/RTint, Base libraries
+gm2-libs/SArgs
+--------------
+
+.. code-block:: modula2
+    DEFINITION MODULE SArgs ;
+
+    FROM DynamicStrings IMPORT String ;
+    EXPORT QUALIFIED GetArg, Narg ;
+    
+    
+    (*
+       GetArg - returns the nth argument from the command line.
+                The success of the operation is returned.
+                If TRUE is returned then the string, s, contains a
+                new string, otherwise s is set to NIL.
+    *)
+    
+.. index::
+   GetArg
+.. code-block:: modula2
+    PROCEDURE GetArg (VAR s: String ; n: CARDINAL) : BOOLEAN ;
+    
+    
+    (*
+       Narg - returns the number of arguments available from
+              command line.
+    *)
+    
+.. index::
+   Narg
+.. code-block:: modula2
+    PROCEDURE Narg() : CARDINAL ;
+    
+    
+    END SArgs.
+
+@c @node gm2-libs/SCmdArgs, gm2-libs/SEnvironment, gm2-libs/SArgs, Base libraries
+gm2-libs/SCmdArgs
+-----------------
+
+.. code-block:: modula2
+    DEFINITION MODULE SCmdArgs ;
+
+    FROM DynamicStrings IMPORT String ;
+    
+    EXPORT QUALIFIED GetArg, Narg ;
+    
+    
+    (*
+       GetArg - returns the nth argument from the command line, CmdLine
+                the success of the operation is returned.
+    *)
+    
+.. index::
+   GetArg
+.. code-block:: modula2
+    PROCEDURE GetArg (CmdLine: String;
+                      n: CARDINAL; VAR Argi: String) : BOOLEAN ;
+    
+    
+    (*
+       Narg - returns the number of arguments available from
+              command line, CmdLine.
+    *)
+    
+.. index::
+   Narg
+.. code-block:: modula2
+    PROCEDURE Narg (CmdLine: String) : CARDINAL ;
+    
+    
+    END SCmdArgs.
+
+@c @node gm2-libs/SEnvironment, gm2-libs/SFIO, gm2-libs/SCmdArgs, Base libraries
+gm2-libs/SEnvironment
+---------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE SEnvironment ;
+
+    
+    FROM DynamicStrings IMPORT String ;
+    EXPORT QUALIFIED GetEnvironment ;
+    
+    
+    (*
+       GetEnvironment - gets the environment variable Env and places
+          	       	    a copy of its value into String, dest.
+                        It returns TRUE if the string Env was found in
+                        the processes environment.
+    *)
+    
+.. index::
+   GetEnvironment
+.. code-block:: modula2
+    PROCEDURE GetEnvironment (Env: String;
+                              VAR dest: String) : BOOLEAN ;
+    
+    
+    (*
+       PutEnvironment - change or add an environment variable definition EnvDef.
+                        TRUE is returned if the environment variable was
+                        set or changed successfully.
+    *)
+    
+.. index::
+   PutEnvironment
+.. code-block:: modula2
+    PROCEDURE PutEnvironment (EnvDef: String) : BOOLEAN ;
+    
+    
+    END SEnvironment.
+
+@c @node gm2-libs/SFIO, gm2-libs/SMathLib0, gm2-libs/SEnvironment, Base libraries
+gm2-libs/SFIO
+-------------
+
+.. code-block:: modula2
+    DEFINITION MODULE SFIO ;
+
+    FROM DynamicStrings IMPORT String ;
+    FROM FIO IMPORT File ;
+    
+    EXPORT QUALIFIED OpenToRead, OpenToWrite, OpenForRandom, Exists, WriteS, ReadS ;
+    
+    
+    (*
+       Exists - returns TRUE if a file named, fname exists for reading.
+    *)
+    
+.. index::
+   Exists
+.. code-block:: modula2
+    PROCEDURE Exists (fname: String) : BOOLEAN ;
+    
+    
+    (*
+       OpenToRead - attempts to open a file, fname, for reading and
+                    it returns this file.
+                    The success of this operation can be checked by
+                    calling IsNoError.
+    *)
+    
+.. index::
+   OpenToRead
+.. code-block:: modula2
+    PROCEDURE OpenToRead (fname: String) : File ;
+    
+    
+    (*
+       OpenToWrite - attempts to open a file, fname, for write and
+                     it returns this file.
+                     The success of this operation can be checked by
+                     calling IsNoError.
+    *)
+    
+.. index::
+   OpenToWrite
+.. code-block:: modula2
+    PROCEDURE OpenToWrite (fname: String) : File ;
+    
+    
+    (*
+       OpenForRandom - attempts to open a file, fname, for random access
+                       read or write and it returns this file.
+                       The success of this operation can be checked by
+                       calling IsNoError.
+                       towrite, determines whether the file should be
+                       opened for writing or reading.
+                       if towrite is TRUE or whether the previous file should
+                       be left alone, allowing this descriptor to seek
+                       and modify an existing file.
+    *)
+    
+.. index::
+   OpenForRandom
+.. code-block:: modula2
+    PROCEDURE OpenForRandom (fname: String; towrite, newfile: BOOLEAN) : File ;
+    
+    
+    (*
+       WriteS - writes a string, s, to, file. It returns the String, s.
+    *)
+    
+.. index::
+   WriteS
+.. code-block:: modula2
+    PROCEDURE WriteS (file: File; s: String) : String ;
+    
+    
+    (*
+       ReadS - reads a string, s, from, file. It returns the String, s.
+               It stops reading the string at the end of line or end of file.
+               It consumes the newline at the end of line but does not place
+               this into the returned string.
+    *)
+    
+.. index::
+   ReadS
+.. code-block:: modula2
+    PROCEDURE ReadS (file: File) : String ;
+    
+    
+    END SFIO.
+
+@c @node gm2-libs/SMathLib0, gm2-libs/SYSTEM, gm2-libs/SFIO, Base libraries
+gm2-libs/SMathLib0
+------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE SMathLib0 ;
+
+    CONST
+       pi   = 3.1415926535897932384626433832795028841972;
+       exp1 = 2.7182818284590452353602874713526624977572;
+    
+    
+.. index::
+   sqrt
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sqrt (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   exp
+.. code-block:: modula2
+    PROCEDURE exp (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   ln
+.. code-block:: modula2
+    PROCEDURE ln (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   sin
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sin (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   cos
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cos (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   tan
+.. code-block:: modula2
+    PROCEDURE tan (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   arctan
+.. code-block:: modula2
+    PROCEDURE arctan (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   entier
+.. code-block:: modula2
+    PROCEDURE entier (x: SHORTREAL) : INTEGER ;
+    
+    
+    END SMathLib0.
+
+@c @node gm2-libs/SYSTEM, gm2-libs/Scan, gm2-libs/SMathLib0, Base libraries
+gm2-libs/SYSTEM
+---------------
+
+.. code-block:: modula2
+    DEFINITION MODULE SYSTEM ;
+
+    EXPORT QUALIFIED BITSPERBYTE, BYTESPERWORD,
+                     ADDRESS, WORD, BYTE, CSIZE_T, CSSIZE_T, (* @SYSTEM_DATATYPES@  *)
+                     ADR, TSIZE, ROTATE, SHIFT, THROW, TBITSIZE ;
+                     (* SIZE is also exported if -fpim2 is used,  *)
+    
+    CONST
+.. index::
+   pair: BITSPERBYTE; (const)
+.. code-block:: modula2
+      BITSPERBYTE   = __ATTRIBUTE__ __BUILTIN__ ((BITS_PER_UNIT)) ;
+.. index::
+   pair: BYTESPERWORD; (const)
+.. code-block:: modula2
+      BYTESPERWORD  = __ATTRIBUTE__ __BUILTIN__ ((UNITS_PER_WORD)) ;
+    
+    
+    (* all the following types are declared internally to gm2
+    TYPE
+       @SYSTEM_TYPES@
+    *)
+    
+    
+    (*
+       all the functions below are declared internally to gm2
+       ====================================================
+    
+.. index::
+   ADR
+.. code-block:: modula2
+    PROCEDURE ADR (VAR v: <anytype>): ADDRESS;
+      (* Returns the address of variable v. *)
+    
+.. index::
+   SIZE
+.. code-block:: modula2
+    PROCEDURE SIZE (v: <type>) : ZType;
+      (* Returns the number of BYTES used to store a v of
+         any specified <type>.  Only available if -fpim2 is used.
+      *)
+    
+.. index::
+   TSIZE
+.. code-block:: modula2
+    PROCEDURE TSIZE (<type>) : CARDINAL;
+      (* Returns the number of BYTES used to store a value of the
+         specified <type>.
+      *)
+    
+.. index::
+   ROTATE
+.. code-block:: modula2
+    PROCEDURE ROTATE (val: <a set type>;
+                      num: INTEGER): <type of first parameter>;
+      (* Returns a bit sequence obtained from val by rotating up/right
+         or down/right by the absolute value of num.  The direction is
+         down/right if the sign of num is negative, otherwise the direction
+         is up/left.
+      *)
+    
+.. index::
+   SHIFT
+.. code-block:: modula2
+    PROCEDURE SHIFT (val: <a set type>;
+                     num: INTEGER): <type of first parameter>;
+      (* Returns a bit sequence obtained from val by shifting up/left
+         or down/right by the absolute value of num, introducing
+         zeros as necessary.  The direction is down/right if the sign of
+         num is negative, otherwise the direction is up/left.
+      *)
+    
+.. index::
+   THROW
+.. code-block:: modula2
+    PROCEDURE THROW (i: INTEGER) ;
+      (*
+         THROW is a GNU extension and was not part of the PIM or ISO
+         standards.  It throws an exception which will be caught by the
+         EXCEPT block (assuming it exists).  This is a compiler builtin
+         function which interfaces to the GCC exception handling runtime
+         system.
+         GCC uses the term throw, hence the naming distinction between
+         the GCC builtin and the Modula-2 runtime library procedure Raise.
+         The later library procedure Raise will call SYSTEM.THROW after
+         performing various housekeeping activities.
+      *)
+    
+.. index::
+   TBITSIZE
+.. code-block:: modula2
+    PROCEDURE TBITSIZE (<type>) : CARDINAL ;
+      (* Returns the minimum number of bits necessary to represent
+         <type>.  This procedure function is only useful for determining
+         the number of bits used for any type field within a packed RECORD.
+         It is not particularly useful elsewhere since <type> might be
+         optimized for speed, for example a BOOLEAN could occupy a WORD.
+      *)
+    *)
+    
+    (* The following procedures are invoked by GNU Modula-2 to
+       shift non word sized set types. They are not strictly part
+       of the core PIM Modula-2, however they are used
+       to implement the SHIFT procedure defined above,
+       which are in turn used by the Logitech compatible libraries.
+    
+       Users will access these procedures by using the procedure
+       SHIFT above and GNU Modula-2 will map SHIFT onto one of
+       the following procedures.
+    *)
+    
+    (*
+       ShiftVal - is a runtime procedure whose job is to implement
+                  the SHIFT procedure of ISO SYSTEM. GNU Modula-2 will
+                  inline a SHIFT of a single WORD sized set and will only
+                  call this routine for larger sets.
+    *)
+    
+.. index::
+   ShiftVal
+.. code-block:: modula2
+    PROCEDURE ShiftVal (VAR s, d: ARRAY OF BITSET;
+                        SetSizeInBits: CARDINAL;
+                        ShiftCount: INTEGER) ;
+    
+    
+    (*
+       ShiftLeft - performs the shift left for a multi word set.
+                   This procedure might be called by the back end of
+                   GNU Modula-2 depending whether amount is known at
+                   compile time.
+    *)
+    
+.. index::
+   ShiftLeft
+.. code-block:: modula2
+    PROCEDURE ShiftLeft (VAR s, d: ARRAY OF BITSET;
+                         SetSizeInBits: CARDINAL;
+                         ShiftCount: CARDINAL) ;
+    
+    (*
+       ShiftRight - performs the shift left for a multi word set.
+                    This procedure might be called by the back end of
+                    GNU Modula-2 depending whether amount is known at
+                    compile time.
+    *)
+    
+.. index::
+   ShiftRight
+.. code-block:: modula2
+    PROCEDURE ShiftRight (VAR s, d: ARRAY OF BITSET;
+                          SetSizeInBits: CARDINAL;
+                          ShiftCount: CARDINAL) ;
+    
+    
+    (*
+       RotateVal - is a runtime procedure whose job is to implement
+                   the ROTATE procedure of ISO SYSTEM. GNU Modula-2 will
+                   inline a ROTATE of a single WORD (or less)
+                   sized set and will only call this routine for larger
+                   sets.
+    *)
+    
+.. index::
+   RotateVal
+.. code-block:: modula2
+    PROCEDURE RotateVal (VAR s, d: ARRAY OF BITSET;
+                         SetSizeInBits: CARDINAL;
+                         RotateCount: INTEGER) ;
+    
+    
+    (*
+       RotateLeft - performs the rotate left for a multi word set.
+                    This procedure might be called by the back end of
+                    GNU Modula-2 depending whether amount is known at
+                    compile time.
+    *)
+    
+.. index::
+   RotateLeft
+.. code-block:: modula2
+    PROCEDURE RotateLeft (VAR s, d: ARRAY OF BITSET;
+                          SetSizeInBits: CARDINAL;
+                          RotateCount: CARDINAL) ;
+    
+    
+    (*
+       RotateRight - performs the rotate right for a multi word set.
+                     This procedure might be called by the back end of
+                     GNU Modula-2 depending whether amount is known at
+                     compile time.
+    *)
+    
+.. index::
+   RotateRight
+.. code-block:: modula2
+    PROCEDURE RotateRight (VAR s, d: ARRAY OF BITSET;
+                           SetSizeInBits: CARDINAL;
+                           RotateCount: CARDINAL) ;
+    
+    
+    END SYSTEM.
+
+@c @node gm2-libs/Scan, gm2-libs/Selective, gm2-libs/SYSTEM, Base libraries
+gm2-libs/Scan
+-------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Scan ;
+
+(* Provides a primitive symbol fetching from input.
+   Symbols are delimited by spaces and tabs.
+   Limitation only allows one source file at
+   a time to deliver symbols.  *)
+    
+    
+    EXPORT QUALIFIED GetNextSymbol, WriteError,
+                     OpenSource, CloseSource,
+                     TerminateOnError, DefineComments ;
+    
+    
+    (* OpenSource - opens a source file for reading.                  *)
+    
+.. index::
+   OpenSource
+.. code-block:: modula2
+    PROCEDURE OpenSource (a: ARRAY OF CHAR) : BOOLEAN ;
+    
+    
+    (* CloseSource - closes the current source file from reading.     *)
+    
+.. index::
+   CloseSource
+.. code-block:: modula2
+    PROCEDURE CloseSource ;
+    
+    
+    (* GetNextSymbol gets the next source symbol and returns it in a. *)
+    
+.. index::
+   GetNextSymbol
+.. code-block:: modula2
+    PROCEDURE GetNextSymbol (VAR a: ARRAY OF CHAR) ;
+    
+    
+    (* WriteError writes a message, a, under the source line, which   *)
+    (* attempts to pinpoint the Symbol at fault.                      *)
+    
+.. index::
+   WriteError
+.. code-block:: modula2
+    PROCEDURE WriteError (a: ARRAY OF CHAR) ;
+    
+    
+    (*
+       TerminateOnError - exits with status 1 if we call WriteError.
+    *)
+    
+.. index::
+   TerminateOnError
+.. code-block:: modula2
+    PROCEDURE TerminateOnError ;
+    
+    
+    (*
+       DefineComments - defines the start of comments within the source
+                        file.
+    
+                        The characters in Start define the comment start
+                        and characters in End define the end.
+                        The BOOLEAN eoln determine whether the comment
+                        is terminated by end of line. If eoln is TRUE
+                        then End is ignored.
+    
+                        If this procedure is never called then no comments
+                        are allowed.
+    *)
+    
+.. index::
+   DefineComments
+.. code-block:: modula2
+    PROCEDURE DefineComments (Start, End: ARRAY OF CHAR; eoln: BOOLEAN) ;
+    
+    
+    END Scan.
+
+@c @node gm2-libs/Selective, gm2-libs/StdIO, gm2-libs/Scan, Base libraries
+gm2-libs/Selective
+------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Selective ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    
+    EXPORT QUALIFIED SetOfFd, Timeval,
+                     InitSet, KillSet, InitTime, KillTime,
+                     GetTime, SetTime,
+                     FdZero, FdSet, FdClr, FdIsSet, Select,
+                     MaxFdsPlusOne, WriteCharRaw, ReadCharRaw,
+                     GetTimeOfDay ;
+    
+    TYPE
+.. index::
+   pair: SetOfFd; (type)
+.. code-block:: modula2
+       SetOfFd = ADDRESS ;    (* Hidden type in Selective.c *)
+.. index::
+   pair: Timeval; (type)
+.. code-block:: modula2
+       Timeval = ADDRESS ;    (* Hidden type in Selective.c *)
+    
+    
+.. index::
+   Select
+.. code-block:: modula2
+    PROCEDURE Select (nooffds: CARDINAL;
+                      readfds, writefds, exceptfds: SetOfFd;
+                      timeout: Timeval) : INTEGER ;
+    
+.. index::
+   InitTime
+.. code-block:: modula2
+    PROCEDURE InitTime (sec, usec: CARDINAL) : Timeval ;
+.. index::
+   KillTime
+.. code-block:: modula2
+    PROCEDURE KillTime (t: Timeval) : Timeval ;
+.. index::
+   GetTime
+.. code-block:: modula2
+    PROCEDURE GetTime (t: Timeval; VAR sec, usec: CARDINAL) ;
+.. index::
+   SetTime
+.. code-block:: modula2
+    PROCEDURE SetTime (t: Timeval; sec, usec: CARDINAL) ;
+.. index::
+   InitSet
+.. code-block:: modula2
+    PROCEDURE InitSet () : SetOfFd ;
+.. index::
+   KillSet
+.. code-block:: modula2
+    PROCEDURE KillSet (s: SetOfFd) : SetOfFd ;
+.. index::
+   FdZero
+.. code-block:: modula2
+    PROCEDURE FdZero (s: SetOfFd) ;
+.. index::
+   FdSet
+.. code-block:: modula2
+    PROCEDURE FdSet (fd: INTEGER; s: SetOfFd) ;
+.. index::
+   FdClr
+.. code-block:: modula2
+    PROCEDURE FdClr (fd: INTEGER; s: SetOfFd) ;
+.. index::
+   FdIsSet
+.. code-block:: modula2
+    PROCEDURE FdIsSet (fd: INTEGER; s: SetOfFd) : BOOLEAN ;
+.. index::
+   MaxFdsPlusOne
+.. code-block:: modula2
+    PROCEDURE MaxFdsPlusOne (a, b: INTEGER) : INTEGER ;
+    
+    (* you must use the raw routines with select - not the FIO buffered routines *)
+.. index::
+   WriteCharRaw
+.. code-block:: modula2
+    PROCEDURE WriteCharRaw (fd: INTEGER; ch: CHAR) ;
+.. index::
+   ReadCharRaw
+.. code-block:: modula2
+    PROCEDURE ReadCharRaw (fd: INTEGER) : CHAR ;
+    
+    (*
+       GetTimeOfDay - fills in a record, Timeval, filled in with the
+                      current system time in seconds and microseconds.
+                      It returns zero (see man 3p gettimeofday)
+    *)
+    
+.. index::
+   GetTimeOfDay
+.. code-block:: modula2
+    PROCEDURE GetTimeOfDay (tv: Timeval) : INTEGER ;
+    
+    
+    END Selective.
+
+@c @node gm2-libs/StdIO, gm2-libs/Storage, gm2-libs/Selective, Base libraries
+gm2-libs/StdIO
+--------------
+
+.. code-block:: modula2
+    DEFINITION MODULE StdIO ;
+
+    EXPORT QUALIFIED ProcRead, ProcWrite,
+                     Read, Write,
+                     PushOutput, PopOutput, GetCurrentOutput,
+                     PushInput, PopInput, GetCurrentInput ;
+    
+    
+    TYPE
+.. index::
+   pair: ProcWrite; (type)
+.. code-block:: modula2
+       ProcWrite = PROCEDURE (CHAR) ;
+.. index::
+   pair: ProcRead; (type)
+.. code-block:: modula2
+       ProcRead  = PROCEDURE (VAR CHAR) ;
+    
+    
+    (*
+       Read - is the generic procedure that all higher application layers
+              should use to receive a character.
+    *)
+    
+.. index::
+   Read
+.. code-block:: modula2
+    PROCEDURE Read (VAR ch: CHAR) ;
+    
+    
+    (*
+       Write - is the generic procedure that all higher application layers
+               should use to emit a character.
+    *)
+    
+.. index::
+   Write
+.. code-block:: modula2
+    PROCEDURE Write (ch: CHAR) ;
+    
+    
+    (*
+       PushOutput - pushes the current Write procedure onto a stack,
+                    any future references to Write will actually invoke
+                    procedure, p.
+    *)
+    
+.. index::
+   PushOutput
+.. code-block:: modula2
+    PROCEDURE PushOutput (p: ProcWrite) ;
+    
+    
+    (*
+       PopOutput - restores Write to use the previous output procedure.
+    *)
+    
+.. index::
+   PopOutput
+.. code-block:: modula2
+    PROCEDURE PopOutput ;
+    
+    
+    (*
+       GetCurrentOutput - returns the current output procedure.
+    *)
+    
+.. index::
+   GetCurrentOutput
+.. code-block:: modula2
+    PROCEDURE GetCurrentOutput () : ProcWrite ;
+    
+    
+    (*
+       PushInput - pushes the current Read procedure onto a stack,
+                   any future references to Read will actually invoke
+                   procedure, p.
+    *)
+    
+.. index::
+   PushInput
+.. code-block:: modula2
+    PROCEDURE PushInput (p: ProcRead) ;
+    
+    
+    (*
+       PopInput - restores Write to use the previous output procedure.
+    *)
+    
+.. index::
+   PopInput
+.. code-block:: modula2
+    PROCEDURE PopInput ;
+    
+    
+    (*
+       GetCurrentInput - returns the current input procedure.
+    *)
+    
+.. index::
+   GetCurrentInput
+.. code-block:: modula2
+    PROCEDURE GetCurrentInput () : ProcRead ;
+    
+    
+    END StdIO.
+
+@c @node gm2-libs/Storage, gm2-libs/StrCase, gm2-libs/StdIO, Base libraries
+gm2-libs/Storage
+----------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Storage ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    
+    EXPORT QUALIFIED ALLOCATE, DEALLOCATE, REALLOCATE, Available ;
+    
+    
+    
+    (*
+       ALLOCATE - attempt to allocate memory from the heap.
+                  NIL is returned in, a, if ALLOCATE fails.
+    *)
+    
+.. index::
+   ALLOCATE
+.. code-block:: modula2
+    PROCEDURE ALLOCATE (VAR a: ADDRESS ; Size: CARDINAL) ;
+    
+    
+    (*
+       DEALLOCATE - return, Size, bytes to the heap.
+                    The variable, a, is set to NIL.
+    *)
+    
+.. index::
+   DEALLOCATE
+.. code-block:: modula2
+    PROCEDURE DEALLOCATE (VAR a: ADDRESS ; Size: CARDINAL) ;
+    
+    
+    (*
+       REALLOCATE - attempts to reallocate storage. The address,
+                    a, should either be NIL in which case ALLOCATE
+                    is called, or alternatively it should have already
+                    been initialized by ALLOCATE. The allocated storage
+                    is resized accordingly.
+    *)
+    
+.. index::
+   REALLOCATE
+.. code-block:: modula2
+    PROCEDURE REALLOCATE (VAR a: ADDRESS; Size: CARDINAL) ;
+    
+    
+    (*
+       Available - returns TRUE if, Size, bytes can be allocated.
+    *)
+    
+.. index::
+   Available
+.. code-block:: modula2
+    PROCEDURE Available (Size: CARDINAL) : BOOLEAN ;
+    
+    
+    END Storage.
+
+@c @node gm2-libs/StrCase, gm2-libs/StrIO, gm2-libs/Storage, Base libraries
+gm2-libs/StrCase
+----------------
+
+.. code-block:: modula2
+    DEFINITION MODULE StrCase ;
+
+    
+    EXPORT QUALIFIED StrToUpperCase, StrToLowerCase, Cap, Lower ;
+    
+    
+    (*
+       StrToUpperCase - converts string, a, to uppercase returning the
+                        result in, b.
+    *)
+    
+.. index::
+   StrToUpperCase
+.. code-block:: modula2
+    PROCEDURE StrToUpperCase (a: ARRAY OF CHAR ; VAR b: ARRAY OF CHAR) ;
+    
+    
+    (*
+       StrToLowerCase - converts string, a, to lowercase returning the
+                        result in, b.
+    *)
+    
+.. index::
+   StrToLowerCase
+.. code-block:: modula2
+    PROCEDURE StrToLowerCase (a: ARRAY OF CHAR ; VAR b: ARRAY OF CHAR) ;
+    
+    
+    (*
+       Cap - converts a lower case character into a capital character.
+             If the character is not a lower case character 'a'..'z'
+             then the character is simply returned unaltered.
+    *)
+    
+.. index::
+   Cap
+.. code-block:: modula2
+    PROCEDURE Cap (ch: CHAR) : CHAR ;
+    
+    
+    (*
+       Lower - converts an upper case character into a lower case character.
+               If the character is not an upper case character 'A'..'Z'
+               then the character is simply returned unaltered.
+    *)
+    
+.. index::
+   Lower
+.. code-block:: modula2
+    PROCEDURE Lower (ch: CHAR) : CHAR ;
+    
+    
+    END StrCase.
+
+@c @node gm2-libs/StrIO, gm2-libs/StrLib, gm2-libs/StrCase, Base libraries
+gm2-libs/StrIO
+--------------
+
+.. code-block:: modula2
+    DEFINITION MODULE StrIO ;
+
+    EXPORT QUALIFIED ReadString, WriteString,
+                     WriteLn ;
+    
+    
+    (*
+       WriteLn - writes a carriage return and a newline
+                 character.
+    *)
+    
+.. index::
+   WriteLn
+.. code-block:: modula2
+    PROCEDURE WriteLn ;
+    
+    
+    (*
+       ReadString - reads a sequence of characters into a string.
+                    Line editing accepts Del, Ctrl H, Ctrl W and
+                    Ctrl U.
+    *)
+    
+.. index::
+   ReadString
+.. code-block:: modula2
+    PROCEDURE ReadString (VAR a: ARRAY OF CHAR) ;
+    
+    
+    (*
+       WriteString - writes a string to the default output.
+    *)
+    
+.. index::
+   WriteString
+.. code-block:: modula2
+    PROCEDURE WriteString (a: ARRAY OF CHAR) ;
+    
+    
+    END StrIO.
+
+@c @node gm2-libs/StrLib, gm2-libs/StringConvert, gm2-libs/StrIO, Base libraries
+gm2-libs/StrLib
+---------------
+
+.. code-block:: modula2
+    DEFINITION MODULE StrLib ;
+
+    EXPORT QUALIFIED StrConCat, StrLen, StrCopy, StrEqual, StrLess,
+          	       	 IsSubString, StrRemoveWhitePrefix ;
+    
+    
+    (*
+       StrConCat - combines a and b into c.
+    *)
+    
+.. index::
+   StrConCat
+.. code-block:: modula2
+    PROCEDURE StrConCat (a, b: ARRAY OF CHAR; VAR c: ARRAY OF CHAR) ;
+    
+    
+    (*
+       StrLess - returns TRUE if string, a, alphabetically occurs before
+                 string, b.
+    *)
+    
+.. index::
+   StrLess
+.. code-block:: modula2
+    PROCEDURE StrLess (a, b: ARRAY OF CHAR) : BOOLEAN ;
+    
+    
+    (*
+       StrEqual - performs a = b on two strings.
+    *)
+    
+.. index::
+   StrEqual
+.. code-block:: modula2
+    PROCEDURE StrEqual (a, b: ARRAY OF CHAR) : BOOLEAN ;
+    
+    
+    (*
+       StrLen - returns the length of string, a.
+    *)
+    
+.. index::
+   StrLen
+.. code-block:: modula2
+    PROCEDURE StrLen (a: ARRAY OF CHAR) : CARDINAL ;
+    
+    
+    (*
+       StrCopy - copy string src into string dest providing dest is large enough.
+                 If dest is smaller than a then src then the string is truncated when
+                 dest is full.  Add a nul character if there is room in dest.
+    *)
+    
+.. index::
+   StrCopy
+.. code-block:: modula2
+    PROCEDURE StrCopy (src: ARRAY OF CHAR ; VAR dest: ARRAY OF CHAR) ;
+    
+    
+    (*
+       IsSubString - returns true if b is a subcomponent of a.
+    *)
+    
+.. index::
+   IsSubString
+.. code-block:: modula2
+    PROCEDURE IsSubString (a, b: ARRAY OF CHAR) : BOOLEAN ;
+    
+    
+    (*
+       StrRemoveWhitePrefix - copies string, into string, b, excluding any white
+                              space infront of a.
+    *)
+    
+.. index::
+   StrRemoveWhitePrefix
+.. code-block:: modula2
+    PROCEDURE StrRemoveWhitePrefix (a: ARRAY OF CHAR; VAR b: ARRAY OF CHAR) ;
+    
+    
+    END StrLib.
+
+@c @node gm2-libs/StringConvert, gm2-libs/SysExceptions, gm2-libs/StrLib, Base libraries
+gm2-libs/StringConvert
+----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE StringConvert ;
+
+    FROM DynamicStrings IMPORT String ;
+    EXPORT QUALIFIED IntegerToString, StringToInteger,
+                     StringToLongInteger, LongIntegerToString,
+                     StringToCardinal, CardinalToString,
+                     StringToLongCardinal, LongCardinalToString,
+                     StringToShortCardinal, ShortCardinalToString,
+                     StringToLongreal, LongrealToString,
+                     ToSigFig,
+                     stoi, itos, ctos, stoc, hstoi, ostoi, bstoi,
+                     hstoc, ostoc, bstoc,
+                     stor, stolr ;
+    
+    
+    (*
+       IntegerToString - converts INTEGER, i, into a String. The field with
+                         can be specified if non zero. Leading characters
+                         are defined by padding and this function will
+                         prepend a + if sign is set to TRUE.
+                         The base allows the caller to generate binary,
+                         octal, decimal, hexidecimal numbers.
+                         The value of lower is only used when hexidecimal
+                         numbers are generated and if TRUE then digits
+                         abcdef are used, and if FALSE then ABCDEF are used.
+    *)
+    
+.. index::
+   IntegerToString
+.. code-block:: modula2
+    PROCEDURE IntegerToString (i: INTEGER; width: CARDINAL; padding: CHAR; sign: BOOLEAN;
+                               base: CARDINAL; lower: BOOLEAN) : String ;
+    
+    
+    (*
+       CardinalToString - converts CARDINAL, c, into a String. The field
+                          width can be specified if non zero. Leading
+                          characters are defined by padding.
+                          The base allows the caller to generate binary,
+                          octal, decimal, hexidecimal numbers.
+                          The value of lower is only used when hexidecimal
+                          numbers are generated and if TRUE then digits
+                          abcdef are used, and if FALSE then ABCDEF are used.
+    *)
+    
+.. index::
+   CardinalToString
+.. code-block:: modula2
+    PROCEDURE CardinalToString (c: CARDINAL; width: CARDINAL; padding: CHAR;
+                                base: CARDINAL; lower: BOOLEAN) : String ;
+    
+    
+    (*
+       StringToInteger - converts a string, s, of, base, into an INTEGER.
+                         Leading white space is ignored. It stops converting
+                         when either the string is exhausted or if an illegal
+                         numeral is found.
+                         The parameter found is set TRUE if a number was found.
+    *)
+    
+.. index::
+   StringToInteger
+.. code-block:: modula2
+    PROCEDURE StringToInteger (s: String; base: CARDINAL; VAR found: BOOLEAN) : INTEGER ;
+    
+    
+    (*
+       StringToCardinal - converts a string, s, of, base, into a CARDINAL.
+                          Leading white space is ignored. It stops converting
+                          when either the string is exhausted or if an illegal
+                          numeral is found.
+                          The parameter found is set TRUE if a number was found.
+    *)
+    
+.. index::
+   StringToCardinal
+.. code-block:: modula2
+    PROCEDURE StringToCardinal (s: String; base: CARDINAL; VAR found: BOOLEAN) : CARDINAL ;
+    
+    
+    (*
+       LongIntegerToString - converts LONGINT, i, into a String. The field with
+                             can be specified if non zero. Leading characters
+                             are defined by padding and this function will
+                             prepend a + if sign is set to TRUE.
+                             The base allows the caller to generate binary,
+                             octal, decimal, hexidecimal numbers.
+                             The value of lower is only used when hexidecimal
+                             numbers are generated and if TRUE then digits
+                             abcdef are used, and if FALSE then ABCDEF are used.
+    *)
+    
+.. index::
+   LongIntegerToString
+.. code-block:: modula2
+    PROCEDURE LongIntegerToString (i: LONGINT; width: CARDINAL; padding: CHAR;
+                                   sign: BOOLEAN; base: CARDINAL; lower: BOOLEAN) : String ;
+    
+    
+    
+    (*
+       StringToLongInteger - converts a string, s, of, base, into an LONGINT.
+                             Leading white space is ignored. It stops converting
+                             when either the string is exhausted or if an illegal
+                             numeral is found.
+                             The parameter found is set TRUE if a number was found.
+    *)
+    
+.. index::
+   StringToLongInteger
+.. code-block:: modula2
+    PROCEDURE StringToLongInteger (s: String; base: CARDINAL; VAR found: BOOLEAN) : LONGINT ;
+    
+    
+    (*
+       LongCardinalToString - converts LONGCARD, c, into a String. The field
+                              width can be specified if non zero. Leading
+                              characters are defined by padding.
+                              The base allows the caller to generate binary,
+                              octal, decimal, hexidecimal numbers.
+                              The value of lower is only used when hexidecimal
+                              numbers are generated and if TRUE then digits
+                              abcdef are used, and if FALSE then ABCDEF are used.
+    *)
+    
+.. index::
+   LongCardinalToString
+.. code-block:: modula2
+    PROCEDURE LongCardinalToString (c: LONGCARD; width: CARDINAL; padding: CHAR;
+                                    base: CARDINAL; lower: BOOLEAN) : String ;
+    
+    
+    (*
+       StringToLongCardinal - converts a string, s, of, base, into a LONGCARD.
+                              Leading white space is ignored. It stops converting
+                              when either the string is exhausted or if an illegal
+                              numeral is found.
+                              The parameter found is set TRUE if a number was found.
+    *)
+    
+.. index::
+   StringToLongCardinal
+.. code-block:: modula2
+    PROCEDURE StringToLongCardinal (s: String; base: CARDINAL; VAR found: BOOLEAN) : LONGCARD ;
+    
+    
+    (*
+       ShortCardinalToString - converts SHORTCARD, c, into a String. The field
+                               width can be specified if non zero. Leading
+                               characters are defined by padding.
+                               The base allows the caller to generate binary,
+                               octal, decimal, hexidecimal numbers.
+                               The value of lower is only used when hexidecimal
+                               numbers are generated and if TRUE then digits
+                               abcdef are used, and if FALSE then ABCDEF are used.
+    *)
+    
+.. index::
+   ShortCardinalToString
+.. code-block:: modula2
+    PROCEDURE ShortCardinalToString (c: SHORTCARD; width: CARDINAL; padding: CHAR;
+                                     base: CARDINAL; lower: BOOLEAN) : String ;
+    
+    
+    (*
+       StringToShortCardinal - converts a string, s, of, base, into a SHORTCARD.
+                               Leading white space is ignored. It stops converting
+                               when either the string is exhausted or if an illegal
+                               numeral is found.
+                               The parameter found is set TRUE if a number was found.
+    *)
+    
+.. index::
+   StringToShortCardinal
+.. code-block:: modula2
+    PROCEDURE StringToShortCardinal (s: String; base: CARDINAL;
+                                     VAR found: BOOLEAN) : SHORTCARD ;
+    
+    
+    (*
+       stoi - decimal string to INTEGER
+    *)
+    
+.. index::
+   stoi
+.. code-block:: modula2
+    PROCEDURE stoi (s: String) : INTEGER ;
+    
+    
+    (*
+       itos - integer to decimal string.
+    *)
+    
+.. index::
+   itos
+.. code-block:: modula2
+    PROCEDURE itos (i: INTEGER; width: CARDINAL; padding: CHAR; sign: BOOLEAN) : String ;
+    
+    
+    (*
+       ctos - cardinal to decimal string.
+    *)
+    
+.. index::
+   ctos
+.. code-block:: modula2
+    PROCEDURE ctos (c: CARDINAL; width: CARDINAL; padding: CHAR) : String ;
+    
+    
+    (*
+       stoc - decimal string to CARDINAL
+    *)
+    
+.. index::
+   stoc
+.. code-block:: modula2
+    PROCEDURE stoc (s: String) : CARDINAL ;
+    
+    
+    (*
+       hstoi - hexidecimal string to INTEGER
+    *)
+    
+.. index::
+   hstoi
+.. code-block:: modula2
+    PROCEDURE hstoi (s: String) : INTEGER ;
+    
+    
+    (*
+       ostoi - octal string to INTEGER
+    *)
+    
+.. index::
+   ostoi
+.. code-block:: modula2
+    PROCEDURE ostoi (s: String) : INTEGER ;
+    
+    
+    (*
+       bstoi - binary string to INTEGER
+    *)
+    
+.. index::
+   bstoi
+.. code-block:: modula2
+    PROCEDURE bstoi (s: String) : INTEGER ;
+    
+    
+    (*
+       hstoc - hexidecimal string to CARDINAL
+    *)
+    
+.. index::
+   hstoc
+.. code-block:: modula2
+    PROCEDURE hstoc (s: String) : CARDINAL ;
+    
+    
+    (*
+       ostoc - octal string to CARDINAL
+    *)
+    
+.. index::
+   ostoc
+.. code-block:: modula2
+    PROCEDURE ostoc (s: String) : CARDINAL ;
+    
+    
+    (*
+       bstoc - binary string to CARDINAL
+    *)
+    
+.. index::
+   bstoc
+.. code-block:: modula2
+    PROCEDURE bstoc (s: String) : CARDINAL ;
+    
+    
+    (*
+       StringToLongreal - returns a LONGREAL and sets found to TRUE
+                          if a legal number is seen.
+    *)
+    
+.. index::
+   StringToLongreal
+.. code-block:: modula2
+    PROCEDURE StringToLongreal (s: String; VAR found: BOOLEAN) : LONGREAL ;
+    
+    
+    (*
+       LongrealToString - converts a LONGREAL number, Real, which has,
+                          TotalWidth, and FractionWidth into a string.
+    
+                          So for example:
+    
+                          LongrealToString(1.0, 4, 2)  -> '1.00'
+                          LongrealToString(12.3, 5, 2) -> '12.30'
+                          LongrealToString(12.3, 6, 2) -> ' 12.30'
+                          LongrealToString(12.3, 6, 3) -> '12.300'
+    
+                          if total width is too small then the fraction
+                          becomes truncated.
+    
+                          LongrealToString(12.3, 5, 3) -> '12.30'
+    
+                          If TotalWidth is 0 then the function
+                          will return the value of x which is converted
+                          into as a fixed point number with exhaustive
+                          precision.
+    *)
+    
+.. index::
+   LongrealToString
+.. code-block:: modula2
+    PROCEDURE LongrealToString (x: LONGREAL;
+                                TotalWidth, FractionWidth: CARDINAL) : String ;
+    
+    
+    (*
+       stor - returns a REAL given a string.
+    *)
+    
+.. index::
+   stor
+.. code-block:: modula2
+    PROCEDURE stor (s: String) : REAL ;
+    
+    
+    (*
+       stolr - returns a LONGREAL given a string.
+    *)
+    
+.. index::
+   stolr
+.. code-block:: modula2
+    PROCEDURE stolr (s: String) : LONGREAL ;
+    
+    
+    (*
+       ToSigFig - returns a floating point or base 10 integer
+                  string which is accurate to, n, significant
+                  figures.  It will return a new String
+                  and, s, will be destroyed.
+    
+    
+                  So:  12.345
+    
+                  rounded to the following significant figures yields
+    
+                  5      12.345
+                  4      12.34
+                  3      12.3
+                  2      12
+                  1      10
+    *)
+    
+.. index::
+   ToSigFig
+.. code-block:: modula2
+    PROCEDURE ToSigFig (s: String; n: CARDINAL) : String ;
+    
+    
+    (*
+       ToDecimalPlaces - returns a floating point or base 10 integer
+                         string which is accurate to, n, decimal
+                         places.  It will return a new String
+                         and, s, will be destroyed.
+                         Decimal places yields, n, digits after
+                         the .
+    
+                         So:  12.345
+    
+                         rounded to the following decimal places yields
+    
+                         5      12.34500
+                         4      12.3450
+                         3      12.345
+                         2      12.34
+                         1      12.3
+    *)
+    
+.. index::
+   ToDecimalPlaces
+.. code-block:: modula2
+    PROCEDURE ToDecimalPlaces (s: String; n: CARDINAL) : String ;
+    
+    
+    END StringConvert.
+
+@c @node gm2-libs/SysExceptions, gm2-libs/SysStorage, gm2-libs/StringConvert, Base libraries
+gm2-libs/SysExceptions
+----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE SysExceptions ;
+
+(* Provides a mechanism for the underlying libraries to
+   configure the exception routines.  This mechanism
+   is used by both the ISO and PIM libraries.
+   It is written to be ISO compliant and this also
+   allows for mixed dialect projects.  *)
+    
+    FROM SYSTEM IMPORT ADDRESS ;
+    
+    TYPE
+.. index::
+   pair: PROCEXCEPTION; (type)
+.. code-block:: modula2
+       PROCEXCEPTION = PROCEDURE (ADDRESS) ;
+    
+.. index::
+   InitExceptionHandlers
+.. code-block:: modula2
+    PROCEDURE InitExceptionHandlers (indexf, range, casef, invalidloc,
+                                     function, wholevalue, wholediv,
+                                     realvalue, realdiv, complexvalue,
+                                     complexdiv, protection, systemf,
+                                     coroutine, exception: PROCEXCEPTION) ;
+    
+    
+    END SysExceptions.
+
+@c @node gm2-libs/SysStorage, gm2-libs/TimeString, gm2-libs/SysExceptions, Base libraries
+gm2-libs/SysStorage
+-------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE SysStorage ;
+
+(*  Provides dynamic allocation for the system components.
+    This allows the application to use the traditional Storage module
+    which can be handled differently.  *)
+    
+    FROM SYSTEM IMPORT ADDRESS ;
+    EXPORT QUALIFIED ALLOCATE, DEALLOCATE, REALLOCATE, Available, Init ;
+    
+    
+    (*
+       ALLOCATE - attempt to allocate memory from the heap.
+                  NIL is returned in, a, if ALLOCATE fails.
+    *)
+    
+.. index::
+   ALLOCATE
+.. code-block:: modula2
+    PROCEDURE ALLOCATE (VAR a: ADDRESS ; size: CARDINAL) ;
+    
+    
+    (*
+       DEALLOCATE - return, size, bytes to the heap.
+                    The variable, a, is set to NIL.
+    *)
+    
+.. index::
+   DEALLOCATE
+.. code-block:: modula2
+    PROCEDURE DEALLOCATE (VAR a: ADDRESS ; size: CARDINAL) ;
+    
+    
+    (*
+       REALLOCATE - attempts to reallocate storage. The address,
+                    a, should either be NIL in which case ALLOCATE
+                    is called, or alternatively it should have already
+                    been initialized by ALLOCATE. The allocated storage
+                    is resized accordingly.
+    *)
+    
+.. index::
+   REALLOCATE
+.. code-block:: modula2
+    PROCEDURE REALLOCATE (VAR a: ADDRESS; size: CARDINAL) ;
+    
+    
+    (*
+       Available - returns TRUE if, size, bytes can be allocated.
+    *)
+    
+.. index::
+   Available
+.. code-block:: modula2
+    PROCEDURE Available (size: CARDINAL) : BOOLEAN;
+    
+    
+    (*
+       Init - initializes the heap.
+              This does nothing on a GNU/Linux system.
+              But it remains here since it might be used in an
+              embedded system.
+    *)
+    
+.. index::
+   Init
+.. code-block:: modula2
+    PROCEDURE Init ;
+    
+    
+    END SysStorage.
+
+@c @node gm2-libs/TimeString, gm2-libs/UnixArgs, gm2-libs/SysStorage, Base libraries
+gm2-libs/TimeString
+-------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE TimeString ;
+
+    EXPORT QUALIFIED GetTimeString ;
+    
+    
+    (*
+       GetTimeString - places the time in ascii format into array, a.
+    
+    *)
+    
+.. index::
+   GetTimeString
+.. code-block:: modula2
+    PROCEDURE GetTimeString (VAR a: ARRAY OF CHAR) ;
+    
+    
+    END TimeString.
+
+@c @node gm2-libs/UnixArgs, gm2-libs/cbuiltin, gm2-libs/TimeString, Base libraries
+gm2-libs/UnixArgs
+-----------------
+
+.. code-block:: modula2
+    DEFINITION MODULE UnixArgs ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    
+    EXPORT QUALIFIED GetArgC, GetArgV, GetEnvV ;
+    
+.. index::
+   GetArgC
+.. code-block:: modula2
+    PROCEDURE GetArgC () : INTEGER ;
+.. index::
+   GetArgV
+.. code-block:: modula2
+    PROCEDURE GetArgV () : ADDRESS ;
+.. index::
+   GetEnvV
+.. code-block:: modula2
+    PROCEDURE GetEnvV () : ADDRESS ;
+    
+    
+    END UnixArgs.
+
+@c @node gm2-libs/cbuiltin, gm2-libs/cgetopt, gm2-libs/UnixArgs, Base libraries
+gm2-libs/cbuiltin
+-----------------
+
+.. code-block:: modula2
+    DEFINITION MODULE FOR "C" cbuiltin ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    EXPORT UNQUALIFIED alloca, memcpy,
+    		   isfinite, isfinitef, isfinitel,
+    		   isinf_sign, isinf_signf, isinf_signl,
+                       sinf, sinl, sin,
+                       cosf, cosl, cos,
+                       atan2f, atan2l, atan2,
+                       sqrtf, sqrtl, sqrt,
+                       fabsf, fabsl, fabs,
+                       logf, logl, log,
+                       expf, expl, exp,
+                       log10f, log10l, log10,
+                       exp10f, exp10l, exp10,
+                       ilogbf, ilogbl, ilogb,
+                       significand, significandf, significandl,
+                       modf, modff, modfl,
+                       nextafter, nextafterf, nextafterl,
+                       nexttoward, nexttowardf, nexttowardl,
+                       scalb, scalbf, scalbl,
+                       scalbn, scalbnf, scalbnl,
+                       scalbln, scalblnf, scalblnl,
+    
+                       cabsf, cabsl, cabs,
+                       cargf, carg, cargl,
+                       conjf, conj, conjl,
+                       cpowf, cpow, cpowl,
+                       csqrtf, csqrt, csqrtl,
+                       cexpf, cexp, cexpl,
+                       clogf, clog, clogl,
+                       csinf, csin, csinl,
+                       ccosf, ccos, ccosl,
+                       ctanf, ctan, ctanl,
+                       casinf, casin, casinl,
+                       cacosf, cacos, cacosl,
+                       catanf, catan, catanl,
+    
+                       index, rindex,
+                       memcmp, memset, memmove,
+                       strcat, strncat, strcpy, strncpy, strcmp, strncmp,
+                       strlen, strstr, strpbrk, strspn, strcspn, strchr, strrchr ;
+    
+.. index::
+   alloca
+.. code-block:: modula2
+    PROCEDURE alloca (i: CARDINAL) : ADDRESS ;
+.. index::
+   memcpy
+.. code-block:: modula2
+    PROCEDURE memcpy (dest, src: ADDRESS; n: CARDINAL) : ADDRESS ;
+.. index::
+   isfinite
+.. code-block:: modula2
+    PROCEDURE isfinite (x: REAL) : BOOLEAN ;
+.. index::
+   isfinitel
+.. code-block:: modula2
+    PROCEDURE isfinitel (x: LONGREAL) : BOOLEAN ;
+.. index::
+   isfinitef
+.. code-block:: modula2
+    PROCEDURE isfinitef (x: SHORTREAL) : BOOLEAN ;
+.. index::
+   isinf_sign
+.. code-block:: modula2
+    PROCEDURE isinf_sign (x: REAL) : BOOLEAN ;
+.. index::
+   isinf_signl
+.. code-block:: modula2
+    PROCEDURE isinf_signl (x: LONGREAL) : BOOLEAN ;
+.. index::
+   isinf_signf
+.. code-block:: modula2
+    PROCEDURE isinf_signf (x: SHORTREAL) : BOOLEAN ;
+.. index::
+   sinf
+.. code-block:: modula2
+    PROCEDURE sinf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   sin
+.. code-block:: modula2
+    PROCEDURE sin (x: REAL) : REAL ;
+.. index::
+   sinl
+.. code-block:: modula2
+    PROCEDURE sinl (x: LONGREAL) : LONGREAL ;
+.. index::
+   cosf
+.. code-block:: modula2
+    PROCEDURE cosf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   cos
+.. code-block:: modula2
+    PROCEDURE cos (x: REAL) : REAL ;
+.. index::
+   cosl
+.. code-block:: modula2
+    PROCEDURE cosl (x: LONGREAL) : LONGREAL ;
+.. index::
+   atan2f
+.. code-block:: modula2
+    PROCEDURE atan2f (x, y: SHORTREAL) : SHORTREAL ;
+.. index::
+   atan2
+.. code-block:: modula2
+    PROCEDURE atan2 (x, y: REAL) : REAL ;
+.. index::
+   atan2l
+.. code-block:: modula2
+    PROCEDURE atan2l (x, y: LONGREAL) : LONGREAL ;
+.. index::
+   sqrtf
+.. code-block:: modula2
+    PROCEDURE sqrtf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   sqrt
+.. code-block:: modula2
+    PROCEDURE sqrt (x: REAL) : REAL ;
+.. index::
+   sqrtl
+.. code-block:: modula2
+    PROCEDURE sqrtl (x: LONGREAL) : LONGREAL ;
+.. index::
+   fabsf
+.. code-block:: modula2
+    PROCEDURE fabsf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   fabs
+.. code-block:: modula2
+    PROCEDURE fabs (x: REAL) : REAL ;
+.. index::
+   fabsl
+.. code-block:: modula2
+    PROCEDURE fabsl (x: LONGREAL) : LONGREAL ;
+.. index::
+   logf
+.. code-block:: modula2
+    PROCEDURE logf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   log
+.. code-block:: modula2
+    PROCEDURE log (x: REAL) : REAL ;
+.. index::
+   logl
+.. code-block:: modula2
+    PROCEDURE logl (x: LONGREAL) : LONGREAL ;
+.. index::
+   expf
+.. code-block:: modula2
+    PROCEDURE expf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   exp
+.. code-block:: modula2
+    PROCEDURE exp (x: REAL) : REAL ;
+.. index::
+   expl
+.. code-block:: modula2
+    PROCEDURE expl (x: LONGREAL) : LONGREAL ;
+.. index::
+   log10f
+.. code-block:: modula2
+    PROCEDURE log10f (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   log10
+.. code-block:: modula2
+    PROCEDURE log10 (x: REAL) : REAL ;
+.. index::
+   log10l
+.. code-block:: modula2
+    PROCEDURE log10l (x: LONGREAL) : LONGREAL ;
+.. index::
+   exp10f
+.. code-block:: modula2
+    PROCEDURE exp10f (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   exp10
+.. code-block:: modula2
+    PROCEDURE exp10 (x: REAL) : REAL ;
+.. index::
+   exp10l
+.. code-block:: modula2
+    PROCEDURE exp10l (x: LONGREAL) : LONGREAL ;
+.. index::
+   ilogbf
+.. code-block:: modula2
+    PROCEDURE ilogbf (x: SHORTREAL) : INTEGER ;
+.. index::
+   ilogb
+.. code-block:: modula2
+    PROCEDURE ilogb (x: REAL) : INTEGER ;
+.. index::
+   ilogbl
+.. code-block:: modula2
+    PROCEDURE ilogbl (x: LONGREAL) : INTEGER ;
+    
+.. index::
+   significand
+.. code-block:: modula2
+    PROCEDURE significand (r: REAL) : REAL ;
+.. index::
+   significandf
+.. code-block:: modula2
+    PROCEDURE significandf (s: SHORTREAL) : SHORTREAL ;
+.. index::
+   significandl
+.. code-block:: modula2
+    PROCEDURE significandl (l: LONGREAL) : LONGREAL ;
+    
+.. index::
+   modf
+.. code-block:: modula2
+    PROCEDURE modf (x: REAL; VAR y: REAL) : REAL ;
+.. index::
+   modff
+.. code-block:: modula2
+    PROCEDURE modff (x: SHORTREAL; VAR y: SHORTREAL) : SHORTREAL ;
+.. index::
+   modfl
+.. code-block:: modula2
+    PROCEDURE modfl (x: LONGREAL; VAR y: LONGREAL) : LONGREAL ;
+    
+.. index::
+   nextafter
+.. code-block:: modula2
+    PROCEDURE nextafter (x, y: REAL) : REAL ;
+.. index::
+   nextafterf
+.. code-block:: modula2
+    PROCEDURE nextafterf (x, y: SHORTREAL) : SHORTREAL ;
+.. index::
+   nextafterl
+.. code-block:: modula2
+    PROCEDURE nextafterl (x, y: LONGREAL) : LONGREAL ;
+    
+.. index::
+   nexttoward
+.. code-block:: modula2
+    PROCEDURE nexttoward (x, y: REAL) : REAL ;
+.. index::
+   nexttowardf
+.. code-block:: modula2
+    PROCEDURE nexttowardf (x, y: SHORTREAL) : SHORTREAL ;
+.. index::
+   nexttowardl
+.. code-block:: modula2
+    PROCEDURE nexttowardl (x, y: LONGREAL) : LONGREAL ;
+    
+.. index::
+   scalb
+.. code-block:: modula2
+    PROCEDURE scalb (x, n: REAL) : REAL ;
+.. index::
+   scalbf
+.. code-block:: modula2
+    PROCEDURE scalbf (x, n: SHORTREAL) : SHORTREAL ;
+.. index::
+   scalbl
+.. code-block:: modula2
+    PROCEDURE scalbl (x, n: LONGREAL) : LONGREAL ;
+    
+.. index::
+   scalbn
+.. code-block:: modula2
+    PROCEDURE scalbn (x: REAL; n: INTEGER) : REAL ;
+.. index::
+   scalbnf
+.. code-block:: modula2
+    PROCEDURE scalbnf (x: SHORTREAL; n: INTEGER) : SHORTREAL ;
+.. index::
+   scalbnl
+.. code-block:: modula2
+    PROCEDURE scalbnl (x: LONGREAL; n: INTEGER) : LONGREAL ;
+    
+.. index::
+   scalbln
+.. code-block:: modula2
+    PROCEDURE scalbln (x: REAL; n: LONGINT) : REAL ;
+.. index::
+   scalblnf
+.. code-block:: modula2
+    PROCEDURE scalblnf (x: SHORTREAL; n: LONGINT) : SHORTREAL ;
+.. index::
+   scalblnl
+.. code-block:: modula2
+    PROCEDURE scalblnl (x: LONGREAL; n: LONGINT) : LONGREAL ;
+    
+.. index::
+   cabsf
+.. code-block:: modula2
+    PROCEDURE cabsf (z: SHORTCOMPLEX) : SHORTREAL ;
+.. index::
+   cabs
+.. code-block:: modula2
+    PROCEDURE cabs (z: COMPLEX) : REAL ;
+.. index::
+   cabsl
+.. code-block:: modula2
+    PROCEDURE cabsl (z: LONGCOMPLEX) : LONGREAL ;
+    
+.. index::
+   cargf
+.. code-block:: modula2
+    PROCEDURE cargf (z: SHORTCOMPLEX) : SHORTREAL ;
+.. index::
+   carg
+.. code-block:: modula2
+    PROCEDURE carg (z: COMPLEX) : REAL ;
+.. index::
+   cargl
+.. code-block:: modula2
+    PROCEDURE cargl (z: LONGCOMPLEX) : LONGREAL ;
+    
+.. index::
+   conjf
+.. code-block:: modula2
+    PROCEDURE conjf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   conj
+.. code-block:: modula2
+    PROCEDURE conj (z: COMPLEX) : COMPLEX ;
+.. index::
+   conjl
+.. code-block:: modula2
+    PROCEDURE conjl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   cpowf
+.. code-block:: modula2
+    PROCEDURE cpowf (base: SHORTCOMPLEX; exp: SHORTREAL) : SHORTCOMPLEX ;
+.. index::
+   cpow
+.. code-block:: modula2
+    PROCEDURE cpow (base: COMPLEX; exp: REAL) : COMPLEX ;
+.. index::
+   cpowl
+.. code-block:: modula2
+    PROCEDURE cpowl (base: LONGCOMPLEX; exp: LONGREAL) : LONGCOMPLEX ;
+    
+.. index::
+   csqrtf
+.. code-block:: modula2
+    PROCEDURE csqrtf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   csqrt
+.. code-block:: modula2
+    PROCEDURE csqrt (z: COMPLEX) : COMPLEX ;
+.. index::
+   csqrtl
+.. code-block:: modula2
+    PROCEDURE csqrtl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   cexpf
+.. code-block:: modula2
+    PROCEDURE cexpf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   cexp
+.. code-block:: modula2
+    PROCEDURE cexp (z: COMPLEX) : COMPLEX ;
+.. index::
+   cexpl
+.. code-block:: modula2
+    PROCEDURE cexpl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   clogf
+.. code-block:: modula2
+    PROCEDURE clogf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   clog
+.. code-block:: modula2
+    PROCEDURE clog (z: COMPLEX) : COMPLEX ;
+.. index::
+   clogl
+.. code-block:: modula2
+    PROCEDURE clogl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   csinf
+.. code-block:: modula2
+    PROCEDURE csinf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   csin
+.. code-block:: modula2
+    PROCEDURE csin (z: COMPLEX) : COMPLEX ;
+.. index::
+   csinl
+.. code-block:: modula2
+    PROCEDURE csinl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   ccosf
+.. code-block:: modula2
+    PROCEDURE ccosf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   ccos
+.. code-block:: modula2
+    PROCEDURE ccos (z: COMPLEX) : COMPLEX ;
+.. index::
+   ccosl
+.. code-block:: modula2
+    PROCEDURE ccosl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   ctanf
+.. code-block:: modula2
+    PROCEDURE ctanf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   ctan
+.. code-block:: modula2
+    PROCEDURE ctan (z: COMPLEX) : COMPLEX ;
+.. index::
+   ctanl
+.. code-block:: modula2
+    PROCEDURE ctanl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   casinf
+.. code-block:: modula2
+    PROCEDURE casinf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   casin
+.. code-block:: modula2
+    PROCEDURE casin (z: COMPLEX) : COMPLEX ;
+.. index::
+   casinl
+.. code-block:: modula2
+    PROCEDURE casinl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   cacosf
+.. code-block:: modula2
+    PROCEDURE cacosf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   cacos
+.. code-block:: modula2
+    PROCEDURE cacos (z: COMPLEX) : COMPLEX ;
+.. index::
+   cacosl
+.. code-block:: modula2
+    PROCEDURE cacosl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   catanf
+.. code-block:: modula2
+    PROCEDURE catanf (z: SHORTCOMPLEX) : SHORTCOMPLEX ;
+.. index::
+   catan
+.. code-block:: modula2
+    PROCEDURE catan (z: COMPLEX) : COMPLEX ;
+.. index::
+   catanl
+.. code-block:: modula2
+    PROCEDURE catanl (z: LONGCOMPLEX) : LONGCOMPLEX ;
+    
+.. index::
+   index
+.. code-block:: modula2
+    PROCEDURE index (s: ADDRESS; c: INTEGER) : ADDRESS ;
+.. index::
+   rindex
+.. code-block:: modula2
+    PROCEDURE rindex (s: ADDRESS; c: INTEGER) : ADDRESS ;
+.. index::
+   memcmp
+.. code-block:: modula2
+    PROCEDURE memcmp (s1, s2: ADDRESS; n: CARDINAL) : INTEGER ;
+.. index::
+   memmove
+.. code-block:: modula2
+    PROCEDURE memmove (s1, s2: ADDRESS; n: CARDINAL) : ADDRESS ;
+.. index::
+   memset
+.. code-block:: modula2
+    PROCEDURE memset (s: ADDRESS; c: INTEGER; n: CARDINAL) : ADDRESS ;
+.. index::
+   strcat
+.. code-block:: modula2
+    PROCEDURE strcat (dest, src: ADDRESS) : ADDRESS ;
+.. index::
+   strncat
+.. code-block:: modula2
+    PROCEDURE strncat (dest, src: ADDRESS; n: CARDINAL) : ADDRESS ;
+.. index::
+   strcpy
+.. code-block:: modula2
+    PROCEDURE strcpy (dest, src: ADDRESS) : ADDRESS ;
+.. index::
+   strncpy
+.. code-block:: modula2
+    PROCEDURE strncpy (dest, src: ADDRESS; n: CARDINAL) : ADDRESS ;
+.. index::
+   strcmp
+.. code-block:: modula2
+    PROCEDURE strcmp (s1, s2: ADDRESS) : INTEGER ;
+.. index::
+   strncmp
+.. code-block:: modula2
+    PROCEDURE strncmp (s1, s2: ADDRESS; n: CARDINAL) : INTEGER ;
+.. index::
+   strlen
+.. code-block:: modula2
+    PROCEDURE strlen (s: ADDRESS) : INTEGER ;
+.. index::
+   strstr
+.. code-block:: modula2
+    PROCEDURE strstr (haystack, needle: ADDRESS) : ADDRESS ;
+.. index::
+   strpbrk
+.. code-block:: modula2
+    PROCEDURE strpbrk (s, accept: ADDRESS) : ADDRESS ;
+.. index::
+   strspn
+.. code-block:: modula2
+    PROCEDURE strspn (s, accept: ADDRESS) : CARDINAL ;
+.. index::
+   strcspn
+.. code-block:: modula2
+    PROCEDURE strcspn (s, accept: ADDRESS) : CARDINAL ;
+.. index::
+   strchr
+.. code-block:: modula2
+    PROCEDURE strchr (s: ADDRESS; c: INTEGER) : ADDRESS ;
+.. index::
+   strrchr
+.. code-block:: modula2
+    PROCEDURE strrchr (s: ADDRESS; c: INTEGER) : ADDRESS ;
+    
+    END cbuiltin.
+
+@c @node gm2-libs/cgetopt, gm2-libs/cxxabi, gm2-libs/cbuiltin, Base libraries
+gm2-libs/cgetopt
+----------------
+
+.. code-block:: modula2
+    DEFINITION MODULE cgetopt ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    
+    
+    TYPE
+.. index::
+   pair: Options; (type)
+.. code-block:: modula2
+       Options = ADDRESS ;
+    
+    VAR
+.. index::
+   pair: optarg; (var)
+.. code-block:: modula2
+       optarg                : ADDRESS ;
+.. index::
+   pair: optind; (var)
+   pair: opterr; (var)
+   pair: optopt; (var)
+.. code-block:: modula2
+       optind, opterr, optopt: INTEGER ;
+    
+    
+    (*
+       getopt - the getopt() function parses the command-line arguments.
+                Its arguments argc and argv are the argument count and array as
+                passed to the main() function on program invocation.  An element of
+                argv that starts with '-' (and is not exactly "-" or "--") is an
+                option element.  The characters of this element (aside from the
+                initial '-') are option characters.  If getopt() is called
+                repeatedly, it returns successively each of the option characters
+                from each of the option elements.
+    *)
+    
+.. index::
+   getopt
+.. code-block:: modula2
+    PROCEDURE getopt (argc: INTEGER; argv: ADDRESS; optstring: ADDRESS) : CHAR ;
+    
+    
+    (*
+       getopt_long - works like getopt() except that it also accepts long options,
+                     started with two dashes.  (If the program accepts only long
+                     options, then optstring should be specified as an empty string (""),
+                     not NULL.)  Long option names may be abbreviated if the abbreviation
+                     is unique or is an exact match for some defined option.  A
+                     long option may take a parameter, of the form --arg=param or
+                     --arg param.
+    *)
+    
+.. index::
+   getopt_long
+.. code-block:: modula2
+    PROCEDURE getopt_long (argc: INTEGER; argv: ADDRESS; optstring: ADDRESS;
+                           longopts: ADDRESS; VAR longindex: INTEGER) : INTEGER ;
+    
+    
+    (*
+       getopt_long_only - a wrapper for the C getopt_long_only.
+    *)
+    
+.. index::
+   getopt_long_only
+.. code-block:: modula2
+    PROCEDURE getopt_long_only (argc: INTEGER; argv: ADDRESS; optstring: ADDRESS;
+                                longopts: ADDRESS; VAR longindex: INTEGER) : INTEGER ;
+    
+    
+    (*
+       InitOptions - constructor for empty Options.
+    *)
+    
+.. index::
+   InitOptions
+.. code-block:: modula2
+    PROCEDURE InitOptions () : Options ;
+    
+    
+    (*
+       KillOptions - deconstructor for empty Options.
+    *)
+    
+.. index::
+   KillOptions
+.. code-block:: modula2
+    PROCEDURE KillOptions (o: Options) : Options ;
+    
+    
+    (*
+       SetOption - set option[index] with {name, has_arg, flag, val}.
+    *)
+    
+.. index::
+   SetOption
+.. code-block:: modula2
+    PROCEDURE SetOption (o: Options; index: CARDINAL;
+                         name: ADDRESS; has_arg: BOOLEAN;
+                         VAR flag: INTEGER; val: INTEGER) ;
+    
+    
+    (*
+       GetLongOptionArray - return a pointer to the C array containing all
+                            long options.
+    *)
+    
+.. index::
+   GetLongOptionArray
+.. code-block:: modula2
+    PROCEDURE GetLongOptionArray (o: Options) : ADDRESS ;
+    
+    
+    END cgetopt.
+
+@c @node gm2-libs/cxxabi, gm2-libs/dtoa, gm2-libs/cgetopt, Base libraries
+gm2-libs/cxxabi
+---------------
+
+.. code-block:: modula2
+    DEFINITION MODULE FOR "C" cxxabi ;
+
+(* This should only be used by the compiler and it matches the
+    g++ implementation.  *)
+    
+    FROM SYSTEM IMPORT ADDRESS ;
+    EXPORT UNQUALIFIED __cxa_begin_catch, __cxa_end_catch, __cxa_rethrow ;
+    
+    
+.. index::
+   __cxa_begin_catch
+.. code-block:: modula2
+    PROCEDURE __cxa_begin_catch (a: ADDRESS) : ADDRESS ;
+.. index::
+   __cxa_end_catch
+.. code-block:: modula2
+    PROCEDURE __cxa_end_catch ;
+.. index::
+   __cxa_rethrow
+.. code-block:: modula2
+    PROCEDURE __cxa_rethrow ;
+    
+    
+    END cxxabi.
+
+@c @node gm2-libs/dtoa, gm2-libs/errno, gm2-libs/cxxabi, Base libraries
+gm2-libs/dtoa
+-------------
+
+.. code-block:: modula2
+    DEFINITION MODULE dtoa ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    
+    TYPE
+.. index::
+   pair: Mode; (type)
+.. code-block:: modula2
+       Mode = (maxsignificant, decimaldigits) ;
+    
+    
+    (*
+       strtod - returns a REAL given a string, s.  It will set
+                error to TRUE if the number is too large.
+    *)
+    
+.. index::
+   strtod
+.. code-block:: modula2
+    PROCEDURE strtod (s: ADDRESS; VAR error: BOOLEAN) : REAL ;
+    
+    
+    (*
+       dtoa - converts a REAL, d, into a string.  The address of the
+              string is returned.
+              mode       indicates the type of conversion required.
+              ndigits    determines the number of digits according to mode.
+              decpt      the position of the decimal point.
+              sign       does the string have a sign?
+    *)
+    
+.. index::
+   dtoa
+.. code-block:: modula2
+    PROCEDURE dtoa (d        : REAL;
+                    mode     : Mode;
+                    ndigits  : INTEGER;
+    	        VAR decpt: INTEGER;
+    	        VAR sign : BOOLEAN) : ADDRESS ;
+    
+    
+    END dtoa.
+
+@c @node gm2-libs/errno, gm2-libs/gdbif, gm2-libs/dtoa, Base libraries
+gm2-libs/errno
+--------------
+
+.. code-block:: modula2
+    DEFINITION MODULE errno ;
+
+    CONST
+        EINTR  =  4 ;   (* system call interrupted *)
+        ERANGE = 34 ;   (* result is too large     *)
+        EAGAIN = 11 ;   (* retry the system call   *)
+    
+.. index::
+   geterrno
+.. code-block:: modula2
+    PROCEDURE geterrno () : INTEGER ;
+    
+    
+    END errno.
+
+@c @node gm2-libs/gdbif, gm2-libs/ldtoa, gm2-libs/errno, Base libraries
+gm2-libs/gdbif
+--------------
+
+.. code-block:: modula2
+    DEFINITION MODULE gdbif ;
+
+(*  Provides interactive connectivity with gdb useful for debugging
+    Modula-2 shared libraries.  *)
+    
+    EXPORT UNQUALIFIED sleepSpin, finishSpin, connectSpin ;
+    
+    
+    (*
+       finishSpin - sets boolean mustWait to FALSE.
+    *)
+    
+.. index::
+   finishSpin
+.. code-block:: modula2
+    PROCEDURE finishSpin ;
+    
+    
+    (*
+       sleepSpin - waits for the boolean variable mustWait to become FALSE.
+                   It sleeps for a second between each test of the variable.
+    *)
+    
+.. index::
+   sleepSpin
+.. code-block:: modula2
+    PROCEDURE sleepSpin ;
+    
+    
+    (*
+       connectSpin - breakpoint placeholder.  Its only purpose is to allow users
+                     to set a breakpoint.  This procedure is called once
+                     sleepSpin is released from its spin (via a call from
+                     finishSpin).
+    *)
+    
+.. index::
+   connectSpin
+.. code-block:: modula2
+    PROCEDURE connectSpin ;
+    
+    
+    END gdbif.
+
+@c @node gm2-libs/ldtoa, gm2-libs/libc, gm2-libs/gdbif, Base libraries
+gm2-libs/ldtoa
+--------------
+
+.. code-block:: modula2
+    DEFINITION MODULE ldtoa ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    
+    TYPE
+.. index::
+   pair: Mode; (type)
+.. code-block:: modula2
+       Mode = (maxsignificant, decimaldigits) ;
+    
+    
+    (*
+       strtold - returns a LONGREAL given a C string, s.  It will set
+                 error to TRUE if the number is too large or badly formed.
+    *)
+    
+.. index::
+   strtold
+.. code-block:: modula2
+    PROCEDURE strtold (s: ADDRESS; VAR error: BOOLEAN) : LONGREAL ;
+    
+    
+    (*
+       ldtoa - converts a LONGREAL, d, into a string.  The address of the
+               string is returned.
+               mode       indicates the type of conversion required.
+               ndigits    determines the number of digits according to mode.
+               decpt      the position of the decimal point.
+               sign       does the string have a sign?
+    *)
+    
+.. index::
+   ldtoa
+.. code-block:: modula2
+    PROCEDURE ldtoa (d        : LONGREAL;
+                     mode     : Mode;
+                     ndigits  : INTEGER;
+                     VAR decpt: INTEGER;
+                     VAR sign : BOOLEAN) : ADDRESS ;
+    
+    
+    END ldtoa.
+
+@c @node gm2-libs/libc, gm2-libs/libm, gm2-libs/ldtoa, Base libraries
+gm2-libs/libc
+-------------
+
+.. code-block:: modula2
+    DEFINITION MODULE FOR "C" libc ;
+
+    FROM SYSTEM IMPORT ADDRESS, CSIZE_T, CSSIZE_T ;
+    
+    EXPORT UNQUALIFIED time_t, timeb, tm, ptrToTM,
+                       write, read,
+                       system, abort,
+                       malloc, free,
+                       exit, isatty,
+                       getenv, putenv, getpid,
+                       dup, close, open, lseek,
+                       readv, writev,
+                       perror, creat,
+                       getcwd, chown, strlen, strcpy, strncpy,
+                       unlink, setenv,
+                       memcpy, memset, memmove, printf, realloc,
+                       rand, srand,
+                       time, localtime, ftime,
+                       shutdown, rename, setjmp, longjmp, atexit,
+                       ttyname, sleep, execv ;
+    
+    
+    TYPE
+.. index::
+   pair: time_t; (type)
+.. code-block:: modula2
+       time_t = LONGINT ;
+    
+.. index::
+   pair: ptrToTM; (type)
+.. code-block:: modula2
+       ptrToTM = POINTER TO tm ;
+.. index::
+   pair: tm; (type)
+.. code-block:: modula2
+       tm = RECORD
+               tm_sec: INTEGER ;     (* Seconds.     [0-60] (1 leap second) *)
+               tm_min: INTEGER ;     (* Minutes.     [0-59]   *)
+               tm_hour: INTEGER ;    (* Hours.       [0-23]   *)
+               tm_mday: INTEGER ;    (* Day.         [1-31]   *)
+               tm_mon: INTEGER ;     (* Month.       [0-11]   *)
+               tm_year: INTEGER ;    (* Year - 1900.          *)
+               tm_wday: INTEGER ;    (* Day of week. [0-6]    *)
+               tm_yday: INTEGER ;    (* Days in year.[0-365]  *)
+               tm_isdst: INTEGER ;   (* DST.         [-1/0/1] *)
+               tm_gmtoff: LONGINT ;  (* Seconds east of UTC.  *)
+               tm_zone: ADDRESS ;    (* char * zone name      *)
+.. index::
+   pair: END; (type)
+.. code-block:: modula2
+            END ;
+    
+.. index::
+   pair: timeb; (type)
+.. code-block:: modula2
+       timeb = RECORD
+                  time    : time_t ;
+                  millitm : SHORTCARD ;
+                  timezone: SHORTCARD ;
+                  dstflag : SHORTCARD ;
+.. index::
+   pair: END; (type)
+.. code-block:: modula2
+               END ;
+    
+.. index::
+   pair: exitP; (type)
+.. code-block:: modula2
+       exitP = PROCEDURE () : INTEGER ;
+    
+    
+    (*
+         ssize_t write (int d, void *buf, size_t nbytes)
+    *)
+    
+.. index::
+   write
+.. code-block:: modula2
+    PROCEDURE write (d: INTEGER; buf: ADDRESS; nbytes: CSIZE_T) : [ CSSIZE_T ] ;
+    
+    
+    (*
+         ssize_t read (int d, void *buf, size_t nbytes)
+    *)
+    
+.. index::
+   read
+.. code-block:: modula2
+    PROCEDURE read (d: INTEGER; buf: ADDRESS; nbytes: CSIZE_T) : [ CSSIZE_T ] ;
+    
+    
+    (*
+         int system(string)
+         char *string;
+    *)
+    
+.. index::
+   system
+.. code-block:: modula2
+    PROCEDURE system (a: ADDRESS) : [ INTEGER ] ;
+    
+    
+    (*
+         abort - generate a fault
+    
+         abort() first closes all open files if possible, then sends
+         an IOT signal to the process.  This signal usually results
+         in termination with a core dump, which may be used for
+         debugging.
+    
+         It is possible for abort() to return control if is caught or
+         ignored, in which case the value returned is that of the
+         kill(2V) system call.
+    *)
+    
+.. index::
+   abort
+.. code-block:: modula2
+    PROCEDURE abort <* noreturn *> ;
+    
+    
+    (*
+         malloc - memory allocator.
+    
+         void *malloc(size_t size);
+    
+         malloc() returns a pointer to a block of at least size
+         bytes, which is appropriately aligned.  If size is zero,
+         malloc() returns a non-NULL pointer, but this pointer should
+         not be dereferenced.
+    *)
+    
+.. index::
+   malloc
+.. code-block:: modula2
+    PROCEDURE malloc (size: CSIZE_T) : ADDRESS ;
+    
+    
+    (*
+         free - memory deallocator.
+    
+         free (void *ptr);
+    
+         free() releases a previously allocated block.  Its argument
+         is a pointer to a block previously allocated by malloc,
+         calloc, realloc, malloc, or memalign.
+    *)
+    
+.. index::
+   free
+.. code-block:: modula2
+    PROCEDURE free (ptr: ADDRESS) ;
+    
+    
+    (*
+         void *realloc (void *ptr, size_t size);
+    
+         realloc changes the size of the memory block pointed to
+         by ptr to size bytes. The contents will be  unchanged  to
+         the minimum of the old and new sizes; newly allocated memory
+         will be uninitialized. If ptr is NIL, the call is
+         equivalent  to malloc(size); if size is equal to zero, the
+         call is equivalent to free(ptr). Unless ptr is NIL, it
+         must have been returned by an earlier call to malloc(),
+         realloc.
+    *)
+    
+.. index::
+   realloc
+.. code-block:: modula2
+    PROCEDURE realloc (ptr: ADDRESS; size: CSIZE_T) : ADDRESS ;
+    
+    
+    (*
+       isatty - does this descriptor refer to a terminal.
+    *)
+    
+.. index::
+   isatty
+.. code-block:: modula2
+    PROCEDURE isatty (fd: INTEGER) : INTEGER ;
+    
+    
+    (*
+       exit - returns control to the invoking process. Result, r, is
+              returned.
+    *)
+    
+.. index::
+   exit
+.. code-block:: modula2
+    PROCEDURE exit (r: INTEGER) <* noreturn *> ;
+    
+    
+    (*
+       getenv - returns the C string for the equivalent C environment
+                variable.
+    *)
+    
+.. index::
+   getenv
+.. code-block:: modula2
+    PROCEDURE getenv (s: ADDRESS) : ADDRESS ;
+    
+    
+    (*
+       putenv - change or add an environment variable.
+    *)
+    
+.. index::
+   putenv
+.. code-block:: modula2
+    PROCEDURE putenv (s: ADDRESS) : INTEGER ;
+    
+    
+    (*
+       getpid - returns the UNIX process identification number.
+    *)
+    
+.. index::
+   getpid
+.. code-block:: modula2
+    PROCEDURE getpid () : INTEGER ;
+    
+    
+    (*
+       dup - duplicates the file descriptor, d.
+    *)
+    
+.. index::
+   dup
+.. code-block:: modula2
+    PROCEDURE dup (d: INTEGER) : INTEGER ;
+    
+    
+    (*
+       close - closes the file descriptor, d.
+    *)
+    
+.. index::
+   close
+.. code-block:: modula2
+    PROCEDURE close (d: INTEGER) : [ INTEGER ] ;
+    
+    
+    (*
+       open - open the file, filename with flag and mode.
+    *)
+    
+.. index::
+   open
+.. code-block:: modula2
+    PROCEDURE open (filename: ADDRESS; oflag: INTEGER; ...) : INTEGER ;
+    
+    
+    (*
+       creat - creates a new file
+    *)
+    
+.. index::
+   creat
+.. code-block:: modula2
+    PROCEDURE creat (filename: ADDRESS; mode: CARDINAL) : INTEGER;
+    
+    
+    (*
+       lseek - calls unix lseek:
+    
+               off_t lseek(int fildes, off_t offset, int whence);
+    *)
+    
+.. index::
+   lseek
+.. code-block:: modula2
+    PROCEDURE lseek (fd: INTEGER; offset: LONGINT; whence: INTEGER) : LONGINT ;
+    
+    
+    (*
+       perror - writes errno and string. (ARRAY OF CHAR is translated onto ADDRESS).
+    *)
+    
+.. index::
+   perror
+.. code-block:: modula2
+    PROCEDURE perror (string: ARRAY OF CHAR);
+    
+    
+    (*
+       readv - reads an io vector of bytes.
+    *)
+    
+.. index::
+   readv
+.. code-block:: modula2
+    PROCEDURE readv (fd: INTEGER; v: ADDRESS; n: INTEGER) : [ INTEGER ] ;
+    
+    
+    (*
+       writev - writes an io vector of bytes.
+    *)
+    
+.. index::
+   writev
+.. code-block:: modula2
+    PROCEDURE writev (fd: INTEGER; v: ADDRESS; n: INTEGER) : [ INTEGER ] ;
+    
+    
+    (*
+       getcwd - copies the absolute pathname of the
+                current working directory to the array pointed to by buf,
+                which is of length size.
+    
+                If the current absolute path name would require a buffer
+                longer than size elements, NULL is returned, and errno is
+                set to ERANGE; an application should check for this error,
+                and allocate a larger buffer if necessary.
+    *)
+    
+.. index::
+   getcwd
+.. code-block:: modula2
+    PROCEDURE getcwd (buf: ADDRESS; size: CSIZE_T) : ADDRESS ;
+    
+    
+    (*
+       chown - The  owner  of  the  file  specified  by  path or by fd is
+               changed.  Only the super-user may change the  owner  of  a
+               file.   The  owner  of  a file may change the group of the
+               file to any group of which that owner is  a  member.   The
+               super-user may change the group arbitrarily.
+    
+               If  the owner or group is specified as -1, then that ID is
+               not changed.
+    
+               On success, zero is returned.  On error, -1  is  returned,
+               and errno is set appropriately.
+    *)
+    
+.. index::
+   chown
+.. code-block:: modula2
+    PROCEDURE chown (filename: ADDRESS; uid, gid: INTEGER) : [ INTEGER ] ;
+    
+    
+    (*
+       strlen - returns the length of string, a.
+    *)
+    
+.. index::
+   strlen
+.. code-block:: modula2
+    PROCEDURE strlen (a: ADDRESS) : CSIZE_T ;
+    
+    
+    (*
+       strcpy - copies string, src, into, dest.
+                It returns dest.
+    *)
+    
+.. index::
+   strcpy
+.. code-block:: modula2
+    PROCEDURE strcpy (dest, src: ADDRESS) : [ ADDRESS ] ;
+    
+    
+    (*
+       strncpy - copies string, src, into, dest, copying at most, n, bytes.
+                 It returns dest.
+    *)
+    
+.. index::
+   strncpy
+.. code-block:: modula2
+    PROCEDURE strncpy (dest, src: ADDRESS; n: CARDINAL) : [ ADDRESS ] ;
+    
+    
+    (*
+       unlink - removes file and returns 0 if successful.
+    *)
+    
+.. index::
+   unlink
+.. code-block:: modula2
+    PROCEDURE unlink (file: ADDRESS) : [ INTEGER ] ;
+    
+    
+    (*
+       memcpy - copy memory area
+    
+       SYNOPSIS
+    
+       #include <string.h>
+    
+       void *memcpy(void *dest, const void *src, size_t n);
+       It returns dest.
+    *)
+    
+.. index::
+   memcpy
+.. code-block:: modula2
+    PROCEDURE memcpy (dest, src: ADDRESS; size: CSIZE_T) : [ ADDRESS ] ;
+    
+    
+    (*
+       memset - fill memory with a constant byte
+    
+       SYNOPSIS
+    
+       #include <string.h>
+    
+       void *memset(void *s, int c, size_t n);
+       It returns s.
+    *)
+    
+.. index::
+   memset
+.. code-block:: modula2
+    PROCEDURE memset (s: ADDRESS; c: INTEGER; size: CSIZE_T) : [ ADDRESS ] ;
+    
+    
+    (*
+       memmove - copy memory areas which may overlap
+    
+       SYNOPSIS
+    
+       #include <string.h>
+    
+       void *memmove(void *dest, const void *src, size_t n);
+       It returns dest.
+    *)
+    
+.. index::
+   memmove
+.. code-block:: modula2
+    PROCEDURE memmove (dest, src: ADDRESS; size: CSIZE_T) : [ ADDRESS ] ;
+    
+    
+    (*
+       int printf(const char *format, ...);
+    *)
+    
+.. index::
+   printf
+.. code-block:: modula2
+    PROCEDURE printf (format: ARRAY OF CHAR; ...) : [ INTEGER ] ;
+    
+    
+    (*
+       setenv - sets environment variable, name, to value.
+                It will overwrite an existing value if, overwrite,
+                is true.  It returns 0 on success and -1 for an error.
+    *)
+    
+.. index::
+   setenv
+.. code-block:: modula2
+    PROCEDURE setenv (name: ADDRESS; value: ADDRESS; overwrite: INTEGER) : [ INTEGER ] ;
+    
+    
+    (*
+       srand - initialize the random number seed.
+    *)
+    
+.. index::
+   srand
+.. code-block:: modula2
+    PROCEDURE srand (seed: INTEGER) ;
+    
+    
+    (*
+       rand - return a random integer.
+    *)
+    
+.. index::
+   rand
+.. code-block:: modula2
+    PROCEDURE rand () : INTEGER ;
+    
+    
+    (*
+       time - returns a pointer to the time_t value. If, a,
+              is not NIL then the libc value is copied into
+              memory at address, a.
+    *)
+    
+.. index::
+   time
+.. code-block:: modula2
+    PROCEDURE time (a: ADDRESS) : time_t ;
+    
+    
+    (*
+       localtime - returns a pointer to the libc copy of the tm
+                   structure.
+    *)
+    
+.. index::
+   localtime
+.. code-block:: modula2
+    PROCEDURE localtime (VAR t: time_t) : ADDRESS ;
+    
+    
+    (*
+       ftime - return date and time.
+    *)
+    
+.. index::
+   ftime
+.. code-block:: modula2
+    PROCEDURE ftime (VAR t: timeb) : [ INTEGER ] ;
+    
+    
+    (*
+       shutdown - shutdown a socket, s.
+                  if how = 0, then no more reads are allowed.
+                  if how = 1, then no more writes are allowed.
+                  if how = 2, then mo more reads or writes are allowed.
+    *)
+    
+.. index::
+   shutdown
+.. code-block:: modula2
+    PROCEDURE shutdown (s: INTEGER; how: INTEGER) : [ INTEGER ] ;
+    
+    
+    (*
+       rename - change the name or location of a file
+    *)
+    
+.. index::
+   rename
+.. code-block:: modula2
+    PROCEDURE rename (oldpath, newpath: ADDRESS) : [ INTEGER ] ;
+    
+    
+    (*
+       setjmp - returns 0 if returning directly, and non-zero
+                when returning from longjmp using the saved
+                context.
+    *)
+    
+.. index::
+   setjmp
+.. code-block:: modula2
+    PROCEDURE setjmp (env: ADDRESS) : INTEGER ;
+    
+    
+    (*
+       longjmp - restores the environment saved by the last call
+                 of setjmp with the corresponding env argument.
+                 After longjmp is completed, program execution
+                 continues as if the corresponding call of setjmp
+                 had just returned the value val.  The value of
+                 val must not be zero.
+    *)
+    
+.. index::
+   longjmp
+.. code-block:: modula2
+    PROCEDURE longjmp (env: ADDRESS; val: INTEGER) ;
+    
+    
+    (*
+       atexit - execute, proc, when the function exit is called.
+    *)
+    
+.. index::
+   atexit
+.. code-block:: modula2
+    PROCEDURE atexit (proc: exitP) : [ INTEGER ] ;
+    
+    
+    (*
+       ttyname - returns a pointer to a string determining the ttyname.
+    *)
+    
+.. index::
+   ttyname
+.. code-block:: modula2
+    PROCEDURE ttyname (filedes: INTEGER) : ADDRESS ;
+    
+    
+    (*
+       sleep - calling thread sleeps for seconds.
+    *)
+    
+.. index::
+   sleep
+.. code-block:: modula2
+    PROCEDURE sleep (seconds: CARDINAL) : [ CARDINAL ] ;
+    
+    
+    (*
+       execv - execute a file.
+    *)
+    
+.. index::
+   execv
+.. code-block:: modula2
+    PROCEDURE execv (pathname: ADDRESS; argv: ADDRESS) : [ INTEGER ] ;
+    
+    
+    END libc.
+
+@c @node gm2-libs/libm, gm2-libs/sckt, gm2-libs/libc, Base libraries
+gm2-libs/libm
+-------------
+
+.. code-block:: modula2
+    DEFINITION MODULE FOR "C" libm ;
+
+(* Users are strongly advised to use MathLib0 or RealMath as calls
+   to functions within these modules will generate inline code.
+   This module is used by MathLib0 and RealMath when inline code cannot
+   be generated.  *)
+    
+    EXPORT UNQUALIFIED sin, sinl, sinf,
+                       cos, cosl, cosf,
+                       tan, tanl, tanf,
+                       sqrt, sqrtl, sqrtf,
+                       asin, asinl, asinf,
+                       acos, acosl, acosf,
+                       atan, atanl, atanf,
+                       atan2, atan2l, atan2f,
+                       exp, expl, expf,
+                       log, logl, logf,
+                       exp10, exp10l, exp10f,
+                       pow, powl, powf,
+                       floor, floorl, floorf,
+                       ceil, ceill, ceilf ;
+    
+.. index::
+   sin
+.. code-block:: modula2
+    PROCEDURE sin (x: REAL) : REAL ;
+.. index::
+   sinl
+.. code-block:: modula2
+    PROCEDURE sinl (x: LONGREAL) : LONGREAL ;
+.. index::
+   sinf
+.. code-block:: modula2
+    PROCEDURE sinf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   cos
+.. code-block:: modula2
+    PROCEDURE cos (x: REAL) : REAL ;
+.. index::
+   cosl
+.. code-block:: modula2
+    PROCEDURE cosl (x: LONGREAL) : LONGREAL ;
+.. index::
+   cosf
+.. code-block:: modula2
+    PROCEDURE cosf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   tan
+.. code-block:: modula2
+    PROCEDURE tan (x: REAL) : REAL ;
+.. index::
+   tanl
+.. code-block:: modula2
+    PROCEDURE tanl (x: LONGREAL) : LONGREAL ;
+.. index::
+   tanf
+.. code-block:: modula2
+    PROCEDURE tanf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   sqrt
+.. code-block:: modula2
+    PROCEDURE sqrt (x: REAL) : REAL ;
+.. index::
+   sqrtl
+.. code-block:: modula2
+    PROCEDURE sqrtl (x: LONGREAL) : LONGREAL ;
+.. index::
+   sqrtf
+.. code-block:: modula2
+    PROCEDURE sqrtf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   asin
+.. code-block:: modula2
+    PROCEDURE asin (x: REAL) : REAL ;
+.. index::
+   asinl
+.. code-block:: modula2
+    PROCEDURE asinl (x: LONGREAL) : LONGREAL ;
+.. index::
+   asinf
+.. code-block:: modula2
+    PROCEDURE asinf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   acos
+.. code-block:: modula2
+    PROCEDURE acos (x: REAL) : REAL ;
+.. index::
+   acosl
+.. code-block:: modula2
+    PROCEDURE acosl (x: LONGREAL) : LONGREAL ;
+.. index::
+   acosf
+.. code-block:: modula2
+    PROCEDURE acosf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   atan
+.. code-block:: modula2
+    PROCEDURE atan (x: REAL) : REAL ;
+.. index::
+   atanl
+.. code-block:: modula2
+    PROCEDURE atanl (x: LONGREAL) : LONGREAL ;
+.. index::
+   atanf
+.. code-block:: modula2
+    PROCEDURE atanf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   atan2
+.. code-block:: modula2
+    PROCEDURE atan2 (x, y: REAL) : REAL ;
+.. index::
+   atan2l
+.. code-block:: modula2
+    PROCEDURE atan2l (x, y: LONGREAL) : LONGREAL ;
+.. index::
+   atan2f
+.. code-block:: modula2
+    PROCEDURE atan2f (x, y: SHORTREAL) : SHORTREAL ;
+.. index::
+   exp
+.. code-block:: modula2
+    PROCEDURE exp (x: REAL) : REAL ;
+.. index::
+   expl
+.. code-block:: modula2
+    PROCEDURE expl (x: LONGREAL) : LONGREAL ;
+.. index::
+   expf
+.. code-block:: modula2
+    PROCEDURE expf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   log
+.. code-block:: modula2
+    PROCEDURE log (x: REAL) : REAL ;
+.. index::
+   logl
+.. code-block:: modula2
+    PROCEDURE logl (x: LONGREAL) : LONGREAL ;
+.. index::
+   logf
+.. code-block:: modula2
+    PROCEDURE logf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   exp10
+.. code-block:: modula2
+    PROCEDURE exp10 (x: REAL) : REAL ;
+.. index::
+   exp10l
+.. code-block:: modula2
+    PROCEDURE exp10l (x: LONGREAL) : LONGREAL ;
+.. index::
+   exp10f
+.. code-block:: modula2
+    PROCEDURE exp10f (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   pow
+.. code-block:: modula2
+    PROCEDURE pow (x, y: REAL) : REAL ;
+.. index::
+   powl
+.. code-block:: modula2
+    PROCEDURE powl (x, y: LONGREAL) : LONGREAL ;
+.. index::
+   powf
+.. code-block:: modula2
+    PROCEDURE powf (x, y: SHORTREAL) : SHORTREAL ;
+.. index::
+   floor
+.. code-block:: modula2
+    PROCEDURE floor (x: REAL) : REAL ;
+.. index::
+   floorl
+.. code-block:: modula2
+    PROCEDURE floorl (x: LONGREAL) : LONGREAL ;
+.. index::
+   floorf
+.. code-block:: modula2
+    PROCEDURE floorf (x: SHORTREAL) : SHORTREAL ;
+.. index::
+   ceil
+.. code-block:: modula2
+    PROCEDURE ceil (x: REAL) : REAL ;
+.. index::
+   ceill
+.. code-block:: modula2
+    PROCEDURE ceill (x: LONGREAL) : LONGREAL ;
+.. index::
+   ceilf
+.. code-block:: modula2
+    PROCEDURE ceilf (x: SHORTREAL) : SHORTREAL ;
+    
+    END libm.
+
+@c @node gm2-libs/sckt, gm2-libs/termios, gm2-libs/libm, Base libraries
+gm2-libs/sckt
+-------------
+
+.. code-block:: modula2
+    DEFINITION MODULE sckt ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    EXPORT UNQUALIFIED tcpServerState,
+                       tcpServerEstablish, tcpServerEstablishPort,
+                       tcpServerAccept, getLocalIP,
+                       tcpServerPortNo, tcpServerIP, tcpServerSocketFd,
+                       tcpServerClientIP, tcpServerClientPortNo,
+                       tcpClientState,
+                       tcpClientSocket, tcpClientSocketIP, tcpClientConnect,
+                       tcpClientPortNo, tcpClientIP, tcpClientSocketFd ;
+    
+    TYPE
+.. index::
+   pair: tcpServerState; (type)
+.. code-block:: modula2
+       tcpServerState = ADDRESS ;
+.. index::
+   pair: tcpClientState; (type)
+.. code-block:: modula2
+       tcpClientState = ADDRESS ;
+    
+    
+    (*
+       tcpServerEstablish - returns a tcpState containing the relevant
+                            information about a socket declared to receive
+                            tcp connections.
+    *)
+    
+.. index::
+   tcpServerEstablish
+.. code-block:: modula2
+    PROCEDURE tcpServerEstablish () : tcpServerState ;
+    
+    
+    (*
+       tcpServerEstablishPort - returns a tcpState containing the relevant
+                                information about a socket declared to receive
+                                tcp connections.  This method attempts to use
+                                the port specified by the parameter.
+    *)
+    
+.. index::
+   tcpServerEstablishPort
+.. code-block:: modula2
+    PROCEDURE tcpServerEstablishPort (port: CARDINAL) : tcpServerState ;
+    
+    
+    (*
+       tcpServerAccept - returns a file descriptor once a client has connected and
+                         been accepted.
+    *)
+    
+.. index::
+   tcpServerAccept
+.. code-block:: modula2
+    PROCEDURE tcpServerAccept (s: tcpServerState) : INTEGER ;
+    
+    
+    (*
+       tcpServerPortNo - returns the portNo from structure, s.
+    *)
+    
+.. index::
+   tcpServerPortNo
+.. code-block:: modula2
+    PROCEDURE tcpServerPortNo (s: tcpServerState) : CARDINAL ;
+    
+    
+    (*
+       tcpSocketFd - returns the sockFd from structure, s.
+    *)
+    
+.. index::
+   tcpServerSocketFd
+.. code-block:: modula2
+    PROCEDURE tcpServerSocketFd (s: tcpServerState) : INTEGER ;
+    
+    
+    (*
+       getLocalIP - returns the IP address of this machine.
+    *)
+    
+.. index::
+   getLocalIP
+.. code-block:: modula2
+    PROCEDURE getLocalIP (s: tcpServerState) : CARDINAL ;
+    
+    
+    (*
+       tcpServerIP - returns the IP address from structure, s.
+    *)
+    
+.. index::
+   tcpServerIP
+.. code-block:: modula2
+    PROCEDURE tcpServerIP (s: tcpServerState) : CARDINAL ;
+    
+    
+    (*
+       tcpServerClientIP - returns the IP address of the client who
+                           has connected to server, s.
+    *)
+    
+.. index::
+   tcpServerClientIP
+.. code-block:: modula2
+    PROCEDURE tcpServerClientIP (s: tcpServerState) : CARDINAL ;
+    
+    
+    (*
+       tcpServerClientPortNo - returns the port number of the client who
+                               has connected to server, s.
+    *)
+    
+.. index::
+   tcpServerClientPortNo
+.. code-block:: modula2
+    PROCEDURE tcpServerClientPortNo (s: tcpServerState) : CARDINAL ;
+    
+    
+    (*
+       tcpClientSocket - returns a file descriptor (socket) which has
+                         connected to, serverName:portNo.
+    *)
+    
+.. index::
+   tcpClientSocket
+.. code-block:: modula2
+    PROCEDURE tcpClientSocket (serverName: ADDRESS; portNo: CARDINAL) : tcpClientState ;
+    
+    
+    (*
+       tcpClientSocketIP - returns a file descriptor (socket) which has
+                           connected to, ip:portNo.
+    *)
+    
+.. index::
+   tcpClientSocketIP
+.. code-block:: modula2
+    PROCEDURE tcpClientSocketIP (ip: CARDINAL; portNo: CARDINAL) : tcpClientState ;
+    
+    
+    (*
+       tcpClientConnect - returns the file descriptor associated with, s,
+                          once a connect has been performed.
+    *)
+    
+.. index::
+   tcpClientConnect
+.. code-block:: modula2
+    PROCEDURE tcpClientConnect (s: tcpClientState) : INTEGER ;
+    
+    
+    (*
+       tcpClientPortNo - returns the portNo from structure, s.
+    *)
+    
+.. index::
+   tcpClientPortNo
+.. code-block:: modula2
+    PROCEDURE tcpClientPortNo (s: tcpClientState) : INTEGER ;
+    
+    
+    (*
+       tcpClientSocketFd - returns the sockFd from structure, s.
+    *)
+    
+.. index::
+   tcpClientSocketFd
+.. code-block:: modula2
+    PROCEDURE tcpClientSocketFd (s: tcpClientState) : INTEGER ;
+    
+    
+    (*
+       tcpClientIP - returns the IP address from structure, s.
+    *)
+    
+.. index::
+   tcpClientIP
+.. code-block:: modula2
+    PROCEDURE tcpClientIP (s: tcpClientState) : CARDINAL ;
+    
+    
+    END sckt.
+
+@c @node gm2-libs/termios, gm2-libs/wrapc, gm2-libs/sckt, Base libraries
+gm2-libs/termios
+----------------
+
+.. code-block:: modula2
+    DEFINITION MODULE termios ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    
+    TYPE
+.. index::
+   pair: TERMIOS; (type)
+.. code-block:: modula2
+       TERMIOS = ADDRESS ;
+    
+.. index::
+   pair: ControlChar; (type)
+.. code-block:: modula2
+       ControlChar = (vintr, vquit, verase, vkill, veof, vtime, vmin,
+                      vswtc, vstart, vstop, vsusp, veol, vreprint, vdiscard,
+                      vwerase, vlnext, veol2) ;
+    
+.. index::
+   pair: Flag; (type)
+.. code-block:: modula2
+       Flag = (
+               (* input flag bits *)
+               ignbrk, ibrkint, ignpar, iparmrk, inpck, istrip, inlcr,
+               igncr, icrnl, iuclc, ixon, ixany, ixoff, imaxbel,
+               (* output flag bits *)
+               opost, olcuc, onlcr, ocrnl, onocr, onlret, ofill, ofdel,
+               onl0, onl1, ocr0, ocr1, ocr2, ocr3,
+               otab0, otab1, otab2, otab3, obs0, obs1, off0, off1, ovt0, ovt1,
+               (* baud rate *)
+               b0, b50, b75, b110, b135, b150, b200, b300, b600, b1200,
+               b1800, b2400, b4800, b9600, b19200, b38400,
+               b57600, b115200, b240400, b460800, b500000, b576000,
+               b921600, b1000000, b1152000, b1500000, b2000000, b2500000,
+               b3000000, b3500000, b4000000, maxbaud, crtscts,
+               (* character size *)
+               cs5, cs6, cs7, cs8, cstopb, cread, parenb, parodd, hupcl, clocal,
+               (* local flags *)
+               lisig, licanon, lxcase, lecho, lechoe, lechok, lechonl, lnoflsh,
+               ltopstop, lechoctl, lechoprt, lechoke, lflusho, lpendin, liexten) ;
+    
+    
+    (*
+       InitTermios - new data structure.
+    *)
+    
+.. index::
+   InitTermios
+.. code-block:: modula2
+    PROCEDURE InitTermios () : TERMIOS ;
+    
+    
+    (*
+       KillTermios - delete data structure.
+    *)
+    
+.. index::
+   KillTermios
+.. code-block:: modula2
+    PROCEDURE KillTermios (t: TERMIOS) : TERMIOS ;
+    
+    
+    (*
+       cfgetospeed - return output baud rate.
+    *)
+    
+.. index::
+   cfgetospeed
+.. code-block:: modula2
+    PROCEDURE cfgetospeed (t: TERMIOS) : INTEGER ;
+    
+    
+    (*
+       cfgetispeed - return input baud rate.
+    *)
+    
+.. index::
+   cfgetispeed
+.. code-block:: modula2
+    PROCEDURE cfgetispeed (t: TERMIOS) : INTEGER ;
+    
+    
+    (*
+       cfsetospeed - set output baud rate.
+    *)
+    
+.. index::
+   cfsetospeed
+.. code-block:: modula2
+    PROCEDURE cfsetospeed (t: TERMIOS; b: CARDINAL) : INTEGER ;
+    
+    
+    (*
+       cfsetispeed - set input baud rate.
+    *)
+    
+.. index::
+   cfsetispeed
+.. code-block:: modula2
+    PROCEDURE cfsetispeed (t: TERMIOS; b: CARDINAL) : INTEGER ;
+    
+    
+    (*
+       cfsetspeed - set input and output baud rate.
+    *)
+    
+.. index::
+   cfsetspeed
+.. code-block:: modula2
+    PROCEDURE cfsetspeed (t: TERMIOS; b: CARDINAL) : INTEGER ;
+    
+    
+    (*
+       tcgetattr - get state of, fd, into, t.
+    *)
+    
+.. index::
+   tcgetattr
+.. code-block:: modula2
+    PROCEDURE tcgetattr (fd: INTEGER; t: TERMIOS) : INTEGER ;
+    
+    
+    (*
+       The following three functions return the different option values.
+    *)
+    
+.. index::
+   tcsnow
+.. code-block:: modula2
+    PROCEDURE tcsnow () : INTEGER ;   (* alter fd now *)
+.. index::
+   tcsdrain
+.. code-block:: modula2
+    PROCEDURE tcsdrain () : INTEGER ; (* alter when all output has been sent *)
+.. index::
+   tcsflush
+.. code-block:: modula2
+    PROCEDURE tcsflush () : INTEGER ; (* like drain, except discard any pending input *)
+    
+    
+    (*
+       tcsetattr - set state of, fd, to, t, using option.
+    *)
+    
+.. index::
+   tcsetattr
+.. code-block:: modula2
+    PROCEDURE tcsetattr (fd: INTEGER; option: INTEGER; t: TERMIOS) : INTEGER ;
+    
+    
+    (*
+       cfmakeraw - sets, t, to raw mode.
+    *)
+    
+.. index::
+   cfmakeraw
+.. code-block:: modula2
+    PROCEDURE cfmakeraw (t: TERMIOS) ;
+    
+    
+    (*
+       tcsendbreak - send zero bits for duration.
+    *)
+    
+.. index::
+   tcsendbreak
+.. code-block:: modula2
+    PROCEDURE tcsendbreak (fd: INTEGER; duration: INTEGER) : INTEGER ;
+    
+    
+    (*
+       tcdrain - waits for pending output to be written on, fd.
+    *)
+    
+.. index::
+   tcdrain
+.. code-block:: modula2
+    PROCEDURE tcdrain (fd: INTEGER) : INTEGER ;
+    
+    
+    (*
+       tcflushi - flush input.
+    *)
+    
+.. index::
+   tcflushi
+.. code-block:: modula2
+    PROCEDURE tcflushi (fd: INTEGER) : INTEGER ;
+    
+    
+    (*
+       tcflusho - flush output.
+    *)
+    
+.. index::
+   tcflusho
+.. code-block:: modula2
+    PROCEDURE tcflusho (fd: INTEGER) : INTEGER ;
+    
+    
+    (*
+       tcflushio - flush input and output.
+    *)
+    
+.. index::
+   tcflushio
+.. code-block:: modula2
+    PROCEDURE tcflushio (fd: INTEGER) : INTEGER ;
+    
+    
+    (*
+       tcflowoni - restart input on, fd.
+    *)
+    
+.. index::
+   tcflowoni
+.. code-block:: modula2
+    PROCEDURE tcflowoni (fd: INTEGER) : INTEGER ;
+    
+    
+    (*
+       tcflowoffi - stop input on, fd.
+    *)
+    
+.. index::
+   tcflowoffi
+.. code-block:: modula2
+    PROCEDURE tcflowoffi (fd: INTEGER) : INTEGER ;
+    
+    
+    (*
+       tcflowono - restart output on, fd.
+    *)
+    
+.. index::
+   tcflowono
+.. code-block:: modula2
+    PROCEDURE tcflowono (fd: INTEGER) : INTEGER ;
+    
+    
+    (*
+       tcflowoffo - stop output on, fd.
+    *)
+    
+.. index::
+   tcflowoffo
+.. code-block:: modula2
+    PROCEDURE tcflowoffo (fd: INTEGER) : INTEGER ;
+    
+    
+    (*
+       GetFlag - sets a flag value from, t, in, b, and returns TRUE
+                 if, t, supports, f.
+    *)
+    
+.. index::
+   GetFlag
+.. code-block:: modula2
+    PROCEDURE GetFlag (t: TERMIOS; f: Flag; VAR b: BOOLEAN) : BOOLEAN ;
+    
+    
+    (*
+       SetFlag - sets a flag value in, t, to, b, and returns TRUE if
+                 this flag value is supported.
+    *)
+    
+.. index::
+   SetFlag
+.. code-block:: modula2
+    PROCEDURE SetFlag (t: TERMIOS; f: Flag; b: BOOLEAN) : BOOLEAN ;
+    
+    
+    (*
+       GetChar - sets a CHAR, ch, value from, t, and returns TRUE if
+                 this value is supported.
+    *)
+    
+.. index::
+   GetChar
+.. code-block:: modula2
+    PROCEDURE GetChar (t: TERMIOS; c: ControlChar; VAR ch: CHAR) : BOOLEAN ;
+    
+    
+    (*
+       SetChar - sets a CHAR value in, t, and returns TRUE if, c,
+                 is supported.
+    *)
+    
+.. index::
+   SetChar
+.. code-block:: modula2
+    PROCEDURE SetChar (t: TERMIOS; c: ControlChar; ch: CHAR) : BOOLEAN ;
+    
+    
+    END termios.
+
+@c @node gm2-libs/wrapc, , gm2-libs/termios, Base libraries
+gm2-libs/wrapc
+--------------
+
+.. code-block:: modula2
+    DEFINITION MODULE wrapc ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    
+    EXPORT QUALIFIED strtime, filesize, fileinode,
+                     getrand, getusername, filemtime,
+                     getnameuidgid, signbit, signbitf, signbitl,
+    		 isfinite, isfinitel, isfinitef ;
+    
+    
+    (*
+       strtime - returns the C string for the equivalent C asctime
+                 function.
+    *)
+    
+.. index::
+   strtime
+.. code-block:: modula2
+    PROCEDURE strtime () : ADDRESS ;
+    
+    
+    (*
+       filesize - assigns the size of a file, f, into low, high and
+                  returns zero if successful.
+    *)
+    
+.. index::
+   filesize
+.. code-block:: modula2
+    PROCEDURE filesize (f: INTEGER; VAR low, high: CARDINAL) : INTEGER ;
+    
+    
+    (*
+       fileinode - return the inode associated with file, f.
+    *)
+    
+.. index::
+   fileinode
+.. code-block:: modula2
+    PROCEDURE fileinode (f: INTEGER; VAR low, high: CARDINAL) : INTEGER ;
+    
+    
+    (*
+       filemtime - returns the mtime of a file, f.
+    *)
+    
+.. index::
+   filemtime
+.. code-block:: modula2
+    PROCEDURE filemtime (f: INTEGER) : INTEGER ;
+    
+    
+    (*
+       getrand - returns a random number between 0..n-1
+    *)
+    
+.. index::
+   getrand
+.. code-block:: modula2
+    PROCEDURE getrand (n: INTEGER) : INTEGER ;
+    
+    
+    (*
+       getusername - returns a C string describing the current user.
+    *)
+    
+.. index::
+   getusername
+.. code-block:: modula2
+    PROCEDURE getusername () : ADDRESS ;
+    
+    
+    (*
+       getnameuidgid - fills in the, uid, and, gid, which represents
+                       user, name.
+    *)
+    
+.. index::
+   getnameuidgid
+.. code-block:: modula2
+    PROCEDURE getnameuidgid (name: ADDRESS; VAR uid, gid: INTEGER) ;
+    
+    
+    (*
+       in C these procedure functions are really macros, so we provide
+       real C functions and let gm2 call these if the builtins
+       are unavailable.
+    *)
+    
+.. index::
+   signbit
+.. code-block:: modula2
+    PROCEDURE signbit (r: REAL) : INTEGER ;
+.. index::
+   signbitf
+.. code-block:: modula2
+    PROCEDURE signbitf (s: SHORTREAL) : INTEGER ;
+.. index::
+   signbitl
+.. code-block:: modula2
+    PROCEDURE signbitl (l: LONGREAL) : INTEGER ;
+    
+    
+    (*
+       isfinite - provide non builtin alternative to the gcc builtin isfinite.
+                  Returns 1 if x is finite and 0 if it is not.
+    *)
+    
+.. index::
+   isfinite
+.. code-block:: modula2
+    PROCEDURE isfinite (x: REAL) : INTEGER ;
+    
+    
+    (*
+       isfinitef - provide non builtin alternative to the gcc builtin isfinite.
+                   Returns 1 if x is finite and 0 if it is not.
+    *)
+    
+.. index::
+   isfinitef
+.. code-block:: modula2
+    PROCEDURE isfinitef (x: SHORTREAL) : INTEGER ;
+    
+    
+    (*
+       isfinitel - provide non builtin alternative to the gcc builtin isfinite.
+                   Returns 1 if x is finite and 0 if it is not.
+    *)
+    
+.. index::
+   isfinitel
+.. code-block:: modula2
+    PROCEDURE isfinitel (x: LONGREAL) : INTEGER ;
+    
+    
+    END wrapc.
+
+
+@c ------------------------------------------------------------
+@c @node PIM and Logitech 3.0 Compatible, PIM coroutine support, Base libraries, Libraries
+PIM and Logitech 3.0 Compatible
+===============================
+
+@menu
+* gm2-libs-pim/BitBlockOps::BitBlockOps.def
+* gm2-libs-pim/BitByteOps::BitByteOps.def
+* gm2-libs-pim/BitWordOps::BitWordOps.def
+* gm2-libs-pim/BlockOps::BlockOps.def
+* gm2-libs-pim/Break::Break.def
+* gm2-libs-pim/CardinalIO::CardinalIO.def
+* gm2-libs-pim/Conversions::Conversions.def
+* gm2-libs-pim/DebugPMD::DebugPMD.def
+* gm2-libs-pim/DebugTrace::DebugTrace.def
+* gm2-libs-pim/Delay::Delay.def
+* gm2-libs-pim/Display::Display.def
+* gm2-libs-pim/ErrorCode::ErrorCode.def
+* gm2-libs-pim/FileSystem::FileSystem.def
+* gm2-libs-pim/FloatingUtilities::FloatingUtilities.def
+* gm2-libs-pim/InOut::InOut.def
+* gm2-libs-pim/Keyboard::Keyboard.def
+* gm2-libs-pim/LongIO::LongIO.def
+* gm2-libs-pim/NumberConversion::NumberConversion.def
+* gm2-libs-pim/Random::Random.def
+* gm2-libs-pim/RealConversions::RealConversions.def
+* gm2-libs-pim/RealInOut::RealInOut.def
+* gm2-libs-pim/Strings::Strings.def
+* gm2-libs-pim/Termbase::Termbase.def
+* gm2-libs-pim/Terminal::Terminal.def
+* gm2-libs-pim/TimeDate::TimeDate.def
+@end menu
+
+@c @node gm2-libs-pim/BitBlockOps, gm2-libs-pim/BitByteOps, , PIM and Logitech 3.0 Compatible
+gm2-libs-pim/BitBlockOps
+------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE BitBlockOps ;
+
+    
+    FROM SYSTEM IMPORT ADDRESS ;
+    
+    
+    (*
+       BlockAnd - performs a bitwise AND on blocks
+                  [dest..dest+size-1] := [dest..dest+size-1] AND
+                                         [src..src+size-1]
+    *)
+    
+.. index::
+   BlockAnd
+.. code-block:: modula2
+    PROCEDURE BlockAnd (dest, src: ADDRESS; size: CARDINAL) ;
+    
+    
+    (*
+       BlockOr - performs a bitwise OR on blocks
+                 [dest..dest+size-1] := [dest..dest+size-1] OR
+                                        [src..src+size-1]
+    *)
+    
+.. index::
+   BlockOr
+.. code-block:: modula2
+    PROCEDURE BlockOr (dest, src: ADDRESS; size: CARDINAL) ;
+    
+    
+    (*
+       BlockXor - performs a bitwise XOR on blocks
+                  [dest..dest+size-1] := [dest..dest+size-1] XOR
+                                         [src..src+size-1]
+    *)
+    
+.. index::
+   BlockXor
+.. code-block:: modula2
+    PROCEDURE BlockXor (dest, src: ADDRESS; size: CARDINAL) ;
+    
+    
+    (*
+       BlockNot - performs a bitsize NOT on the block as defined
+                  by:  [dest..dest+size-1]
+    *)
+    
+.. index::
+   BlockNot
+.. code-block:: modula2
+    PROCEDURE BlockNot (dest: ADDRESS; size: CARDINAL) ;
+    
+    
+    (*
+       BlockShr - performs a block shift right of, count, bits.
+                  Where the block is defined as:
+                  [dest..dest+size-1].
+                  The block is considered to be an ARRAY OF BYTEs
+                  which is shifted, bit at a time over each byte in
+                  turn.  The left most byte is considered the byte
+                  located at the lowest address.
+                  If you require an endianness SHIFT use
+                  the SYSTEM.SHIFT procedure and declare the
+                  block as a POINTER TO set type.
+    *)
+    
+.. index::
+   BlockShr
+.. code-block:: modula2
+    PROCEDURE BlockShr (dest: ADDRESS; size, count: CARDINAL) ;
+    
+    
+    (*
+       BlockShl - performs a block shift left of, count, bits.
+                  Where the block is defined as:
+                  [dest..dest+size-1].
+                  The block is considered to be an ARRAY OF BYTEs
+                  which is shifted, bit at a time over each byte in
+                  turn.  The left most byte is considered the byte
+                  located at the lowest address.
+                  If you require an endianness SHIFT use
+                  the SYSTEM.SHIFT procedure and declare the
+                  block as a POINTER TO set type.
+    *)
+    
+.. index::
+   BlockShl
+.. code-block:: modula2
+    PROCEDURE BlockShl (dest: ADDRESS; size, count: CARDINAL) ;
+    
+    
+    (*
+       BlockRor - performs a block rotate right of, count, bits.
+                  Where the block is defined as:
+                  [dest..dest+size-1].
+                  The block is considered to be an ARRAY OF BYTEs
+                  which is rotated, bit at a time over each byte in
+                  turn.  The left most byte is considered the byte
+                  located at the lowest address.
+                  If you require an endianness ROTATE use
+                  the SYSTEM.ROTATE procedure and declare the
+                  block as a POINTER TO set type.
+    *)
+    
+.. index::
+   BlockRor
+.. code-block:: modula2
+    PROCEDURE BlockRor (dest: ADDRESS; size, count: CARDINAL) ;
+    
+    
+    (*
+       BlockRol - performs a block rotate left of, count, bits.
+                  Where the block is defined as:
+                  [dest..dest+size-1].
+                  The block is considered to be an ARRAY OF BYTEs
+                  which is rotated, bit at a time over each byte in
+                  turn.  The left most byte is considered the byte
+                  located at the lowest address.
+                  If you require an endianness ROTATE use
+                  the SYSTEM.ROTATE procedure and declare the
+                  block as a POINTER TO set type.
+    *)
+    
+.. index::
+   BlockRol
+.. code-block:: modula2
+    PROCEDURE BlockRol (dest: ADDRESS; size, count: CARDINAL) ;
+    
+    
+    END BitBlockOps.
+
+@c @node gm2-libs-pim/BitByteOps, gm2-libs-pim/BitWordOps, gm2-libs-pim/BitBlockOps, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/BitByteOps
+-----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE BitByteOps ;
+
+    FROM SYSTEM IMPORT BYTE ;
+    
+    
+    (*
+       GetBits - returns the bits firstBit..lastBit from source.
+                 Bit 0 of byte maps onto the firstBit of source.
+    *)
+    
+.. index::
+   GetBits
+.. code-block:: modula2
+    PROCEDURE GetBits (source: BYTE; firstBit, lastBit: CARDINAL) : BYTE ;
+    
+    
+    (*
+       SetBits - sets bits in, byte, starting at, firstBit, and ending at,
+                 lastBit, with, pattern.  The bit zero of, pattern, will
+                 be placed into, byte, at position, firstBit.
+    *)
+    
+.. index::
+   SetBits
+.. code-block:: modula2
+    PROCEDURE SetBits (VAR byte: BYTE; firstBit, lastBit: CARDINAL;
+                       pattern: BYTE) ;
+    
+    
+    (*
+       ByteAnd - returns a bitwise (left AND right)
+    *)
+    
+.. index::
+   ByteAnd
+.. code-block:: modula2
+    PROCEDURE ByteAnd (left, right: BYTE) : BYTE ;
+    
+    
+    (*
+       ByteOr - returns a bitwise (left OR right)
+    *)
+    
+.. index::
+   ByteOr
+.. code-block:: modula2
+    PROCEDURE ByteOr (left, right: BYTE) : BYTE ;
+    
+    
+    (*
+       ByteXor - returns a bitwise (left XOR right)
+    *)
+    
+.. index::
+   ByteXor
+.. code-block:: modula2
+    PROCEDURE ByteXor (left, right: BYTE) : BYTE ;
+    
+    
+    (*
+       ByteNot - returns a byte with all bits inverted.
+    *)
+    
+.. index::
+   ByteNot
+.. code-block:: modula2
+    PROCEDURE ByteNot (byte: BYTE) : BYTE ;
+    
+    
+    (*
+       ByteShr - returns a, byte, which has been shifted, count
+                 bits to the right.
+    *)
+    
+.. index::
+   ByteShr
+.. code-block:: modula2
+    PROCEDURE ByteShr (byte: BYTE; count: CARDINAL) : BYTE ;
+    
+    
+    (*
+       ByteShl - returns a, byte, which has been shifted, count
+                 bits to the left.
+    *)
+    
+.. index::
+   ByteShl
+.. code-block:: modula2
+    PROCEDURE ByteShl (byte: BYTE; count: CARDINAL) : BYTE ;
+    
+    
+    (*
+       ByteSar - shift byte arthemetic right.  Preserves the top
+                 end bit and as the value is shifted right.
+    *)
+    
+.. index::
+   ByteSar
+.. code-block:: modula2
+    PROCEDURE ByteSar (byte: BYTE; count: CARDINAL) : BYTE ;
+    
+    
+    (*
+       ByteRor - returns a, byte, which has been rotated, count
+                 bits to the right.
+    *)
+    
+.. index::
+   ByteRor
+.. code-block:: modula2
+    PROCEDURE ByteRor (byte: BYTE; count: CARDINAL) : BYTE ;
+    
+    
+    (*
+       ByteRol - returns a, byte, which has been rotated, count
+                 bits to the left.
+    *)
+    
+.. index::
+   ByteRol
+.. code-block:: modula2
+    PROCEDURE ByteRol (byte: BYTE; count: CARDINAL) : BYTE ;
+    
+    
+    (*
+       HighNibble - returns the top nibble only from, byte.
+                    The top nibble of, byte, is extracted and
+                    returned in the bottom nibble of the return
+                    value.
+    *)
+    
+.. index::
+   HighNibble
+.. code-block:: modula2
+    PROCEDURE HighNibble (byte: BYTE) : BYTE ;
+    
+    
+    (*
+       LowNibble - returns the low nibble only from, byte.
+                   The top nibble is replaced by zeros.
+    *)
+    
+.. index::
+   LowNibble
+.. code-block:: modula2
+    PROCEDURE LowNibble (byte: BYTE) : BYTE ;
+    
+    
+    (*
+       Swap - swaps the low and high nibbles in the, byte.
+    *)
+    
+.. index::
+   Swap
+.. code-block:: modula2
+    PROCEDURE Swap (byte: BYTE) : BYTE ;
+    
+    
+    END BitByteOps.
+
+@c @node gm2-libs-pim/BitWordOps, gm2-libs-pim/BlockOps, gm2-libs-pim/BitByteOps, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/BitWordOps
+-----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE BitWordOps ;
+
+    FROM SYSTEM IMPORT WORD ;
+    
+    
+    (*
+       GetBits - returns the bits firstBit..lastBit from source.
+                 Bit 0 of word maps onto the firstBit of source.
+    *)
+    
+.. index::
+   GetBits
+.. code-block:: modula2
+    PROCEDURE GetBits (source: WORD; firstBit, lastBit: CARDINAL) : WORD ;
+    
+    
+    (*
+       SetBits - sets bits in, word, starting at, firstBit, and ending at,
+                 lastBit, with, pattern.  The bit zero of, pattern, will
+                 be placed into, word, at position, firstBit.
+    *)
+    
+.. index::
+   SetBits
+.. code-block:: modula2
+    PROCEDURE SetBits (VAR word: WORD; firstBit, lastBit: CARDINAL;
+                       pattern: WORD) ;
+    
+    
+    (*
+       WordAnd - returns a bitwise (left AND right)
+    *)
+    
+.. index::
+   WordAnd
+.. code-block:: modula2
+    PROCEDURE WordAnd (left, right: WORD) : WORD ;
+    
+    
+    (*
+       WordOr - returns a bitwise (left OR right)
+    *)
+    
+.. index::
+   WordOr
+.. code-block:: modula2
+    PROCEDURE WordOr (left, right: WORD) : WORD ;
+    
+    
+    (*
+       WordXor - returns a bitwise (left XOR right)
+    *)
+    
+.. index::
+   WordXor
+.. code-block:: modula2
+    PROCEDURE WordXor (left, right: WORD) : WORD ;
+    
+    
+    (*
+       WordNot - returns a word with all bits inverted.
+    *)
+    
+.. index::
+   WordNot
+.. code-block:: modula2
+    PROCEDURE WordNot (word: WORD) : WORD ;
+    
+    
+    (*
+       WordShr - returns a, word, which has been shifted, count
+                 bits to the right.
+    *)
+    
+.. index::
+   WordShr
+.. code-block:: modula2
+    PROCEDURE WordShr (word: WORD; count: CARDINAL) : WORD ;
+    
+    
+    (*
+       WordShl - returns a, word, which has been shifted, count
+                 bits to the left.
+    *)
+    
+.. index::
+   WordShl
+.. code-block:: modula2
+    PROCEDURE WordShl (word: WORD; count: CARDINAL) : WORD ;
+    
+    
+    (*
+       WordSar - shift word arthemetic right.  Preserves the top
+                 end bit and as the value is shifted right.
+    *)
+    
+.. index::
+   WordSar
+.. code-block:: modula2
+    PROCEDURE WordSar (word: WORD; count: CARDINAL) : WORD ;
+    
+    
+    (*
+       WordRor - returns a, word, which has been rotated, count
+                 bits to the right.
+    *)
+    
+.. index::
+   WordRor
+.. code-block:: modula2
+    PROCEDURE WordRor (word: WORD; count: CARDINAL) : WORD ;
+    
+    
+    (*
+       WordRol - returns a, word, which has been rotated, count
+                 bits to the left.
+    *)
+    
+.. index::
+   WordRol
+.. code-block:: modula2
+    PROCEDURE WordRol (word: WORD; count: CARDINAL) : WORD ;
+    
+    
+    (*
+       HighByte - returns the top byte only from, word.
+                  The byte is returned in the bottom byte
+                  in the return value.
+    *)
+    
+.. index::
+   HighByte
+.. code-block:: modula2
+    PROCEDURE HighByte (word: WORD) : WORD ;
+    
+    
+    (*
+       LowByte - returns the low byte only from, word.
+                 The byte is returned in the bottom byte
+                 in the return value.
+    *)
+    
+.. index::
+   LowByte
+.. code-block:: modula2
+    PROCEDURE LowByte (word: WORD) : WORD ;
+    
+    
+    (*
+       Swap - byte flips the contents of word.
+    *)
+    
+.. index::
+   Swap
+.. code-block:: modula2
+    PROCEDURE Swap (word: WORD) : WORD ;
+    
+    
+    END BitWordOps.
+
+@c @node gm2-libs-pim/BlockOps, gm2-libs-pim/Break, gm2-libs-pim/BitWordOps, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/BlockOps
+---------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE BlockOps ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    
+    
+    (*
+       MoveBlockForward - moves, n, bytes from, src, to, dest.
+                          Starts copying from src and keep copying
+                          until, n, bytes have been copied.
+    *)
+    
+.. index::
+   BlockMoveForward
+.. code-block:: modula2
+    PROCEDURE BlockMoveForward (dest, src: ADDRESS; n: CARDINAL) ;
+    
+    
+    (*
+       MoveBlockBackward - moves, n, bytes from, src, to, dest.
+                           Starts copying from src+n and keeps copying
+                           until, n, bytes have been copied.
+                           The last datum to be copied will be the byte
+                           at address, src.
+    *)
+    
+.. index::
+   BlockMoveBackward
+.. code-block:: modula2
+    PROCEDURE BlockMoveBackward (dest, src: ADDRESS; n: CARDINAL) ;
+    
+    
+    (*
+       BlockClear - fills, block..block+n-1, with zero's.
+    *)
+    
+.. index::
+   BlockClear
+.. code-block:: modula2
+    PROCEDURE BlockClear (block: ADDRESS; n: CARDINAL) ;
+    
+    
+    (*
+       BlockSet - fills, n, bytes starting at, block, with a pattern
+                  defined at address pattern..pattern+patternSize-1.
+    *)
+    
+.. index::
+   BlockSet
+.. code-block:: modula2
+    PROCEDURE BlockSet (block: ADDRESS; n: CARDINAL;
+                        pattern: ADDRESS; patternSize: CARDINAL) ;
+    
+    
+    (*
+       BlockEqual - returns TRUE if the blocks defined, a..a+n-1, and,
+                    b..b+n-1 contain the same bytes.
+    *)
+    
+.. index::
+   BlockEqual
+.. code-block:: modula2
+    PROCEDURE BlockEqual (a, b: ADDRESS; n: CARDINAL) : BOOLEAN ;
+    
+    
+    (*
+       BlockPosition - searches for a pattern as defined by
+                       pattern..patternSize-1 in the block,
+                       block..block+blockSize-1.  It returns
+                       the offset from block indicating the
+                       first occurence of, pattern.
+                       MAX(CARDINAL) is returned if no match
+                       is detected.
+    *)
+    
+.. index::
+   BlockPosition
+.. code-block:: modula2
+    PROCEDURE BlockPosition (block: ADDRESS; blockSize: CARDINAL;
+                             pattern: ADDRESS; patternSize: CARDINAL) : CARDINAL ;
+    
+    
+    END BlockOps.
+
+@c @node gm2-libs-pim/Break, gm2-libs-pim/CardinalIO, gm2-libs-pim/BlockOps, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/Break
+------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Break ;
+
+    
+    EXPORT QUALIFIED EnableBreak, DisableBreak, InstallBreak, UnInstallBreak ;
+    
+    
+    (*
+       EnableBreak - enable the current break handler.
+    *)
+    
+.. index::
+   EnableBreak
+.. code-block:: modula2
+    PROCEDURE EnableBreak ;
+    
+    
+    (*
+       DisableBreak - disable the current break handler (and all
+                      installed handlers).
+    *)
+    
+.. index::
+   DisableBreak
+.. code-block:: modula2
+    PROCEDURE DisableBreak ;
+    
+    
+    (*
+       InstallBreak - installs a procedure, p, to be invoked when
+                      a ctrl-c is caught. Any number of these
+                      procedures may be stacked. Only the top
+                      procedure is run when ctrl-c is caught.
+    *)
+    
+.. index::
+   InstallBreak
+.. code-block:: modula2
+    PROCEDURE InstallBreak (p: PROC) ;
+    
+    
+    (*
+       UnInstallBreak - pops the break handler stack.
+    *)
+    
+.. index::
+   UnInstallBreak
+.. code-block:: modula2
+    PROCEDURE UnInstallBreak ;
+    
+    
+    END Break.
+
+@c @node gm2-libs-pim/CardinalIO, gm2-libs-pim/Conversions, gm2-libs-pim/Break, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/CardinalIO
+-----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE CardinalIO ;
+
+    EXPORT QUALIFIED Done,
+                     ReadCardinal, WriteCardinal, ReadHex, WriteHex,
+                     ReadLongCardinal, WriteLongCardinal, ReadLongHex,
+                     WriteLongHex,
+                     ReadShortCardinal, WriteShortCardinal, ReadShortHex,
+                     WriteShortHex ;
+    
+    
+    VAR
+.. index::
+   pair: Done; (var)
+.. code-block:: modula2
+       Done: BOOLEAN ;
+    
+    
+    (*
+       ReadCardinal - read an unsigned decimal number from the terminal.
+                      The read continues until a space, newline, esc or
+                      end of file is reached.
+    *)
+    
+.. index::
+   ReadCardinal
+.. code-block:: modula2
+    PROCEDURE ReadCardinal (VAR c: CARDINAL) ;
+    
+    
+    (*
+       WriteCardinal - writes the value, c, to the terminal and ensures
+                       that at least, n, characters are written. The number
+                       will be padded out by preceeding spaces if necessary.
+    *)
+    
+.. index::
+   WriteCardinal
+.. code-block:: modula2
+    PROCEDURE WriteCardinal (c: CARDINAL; n: CARDINAL) ;
+    
+    
+    (*
+       ReadHex - reads in an unsigned hexadecimal number from the terminal.
+                 The read continues until a space, newline, esc or
+                 end of file is reached.
+    *)
+    
+.. index::
+   ReadHex
+.. code-block:: modula2
+    PROCEDURE ReadHex (VAR c: CARDINAL) ;
+    
+    
+    (*
+       WriteHex - writes out a CARDINAL, c, in hexadecimal format padding
+                  with, n, characters (leading with '0')
+    *)
+    
+.. index::
+   WriteHex
+.. code-block:: modula2
+    PROCEDURE WriteHex (c: CARDINAL; n: CARDINAL) ;
+    
+    
+    (*
+       ReadLongCardinal - read an unsigned decimal number from the terminal.
+                          The read continues until a space, newline, esc or
+                          end of file is reached.
+    *)
+    
+.. index::
+   ReadLongCardinal
+.. code-block:: modula2
+    PROCEDURE ReadLongCardinal (VAR c: LONGCARD) ;
+    
+    
+    (*
+       WriteLongCardinal - writes the value, c, to the terminal and ensures
+                           that at least, n, characters are written. The number
+                           will be padded out by preceeding spaces if necessary.
+    *)
+    
+.. index::
+   WriteLongCardinal
+.. code-block:: modula2
+    PROCEDURE WriteLongCardinal (c: LONGCARD; n: CARDINAL) ;
+    
+    
+    (*
+       ReadLongHex - reads in an unsigned hexadecimal number from the terminal.
+                     The read continues until a space, newline, esc or
+                     end of file is reached.
+    *)
+    
+.. index::
+   ReadLongHex
+.. code-block:: modula2
+    PROCEDURE ReadLongHex (VAR c: LONGCARD) ;
+    
+    
+    (*
+       WriteLongHex - writes out a LONGCARD, c, in hexadecimal format padding
+                      with, n, characters (leading with '0')
+    *)
+    
+.. index::
+   WriteLongHex
+.. code-block:: modula2
+    PROCEDURE WriteLongHex (c: LONGCARD; n: CARDINAL) ;
+    
+    
+    (*
+       WriteShortCardinal - writes the value, c, to the terminal and ensures
+                           that at least, n, characters are written. The number
+                           will be padded out by preceeding spaces if necessary.
+    *)
+    
+.. index::
+   WriteShortCardinal
+.. code-block:: modula2
+    PROCEDURE WriteShortCardinal (c: SHORTCARD; n: CARDINAL) ;
+    
+    
+    (*
+       ReadShortCardinal - read an unsigned decimal number from the terminal.
+                           The read continues until a space, newline, esc or
+                           end of file is reached.
+    *)
+    
+.. index::
+   ReadShortCardinal
+.. code-block:: modula2
+    PROCEDURE ReadShortCardinal (VAR c: SHORTCARD) ;
+    
+    
+    (*
+       ReadShortHex - reads in an unsigned hexadecimal number from the terminal.
+                     The read continues until a space, newline, esc or
+                     end of file is reached.
+    *)
+    
+.. index::
+   ReadShortHex
+.. code-block:: modula2
+    PROCEDURE ReadShortHex (VAR c: SHORTCARD) ;
+    
+    
+    (*
+       WriteShortHex - writes out a SHORTCARD, c, in hexadecimal format padding
+                      with, n, characters (leading with '0')
+    *)
+    
+.. index::
+   WriteShortHex
+.. code-block:: modula2
+    PROCEDURE WriteShortHex (c: SHORTCARD; n: CARDINAL) ;
+    
+    
+    END CardinalIO.
+
+@c @node gm2-libs-pim/Conversions, gm2-libs-pim/DebugPMD, gm2-libs-pim/CardinalIO, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/Conversions
+------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Conversions ;
+
+    EXPORT QUALIFIED ConvertOctal, ConvertHex, ConvertCardinal,
+                     ConvertInteger, ConvertLongInt, ConvertShortInt ;
+    
+    (*
+       ConvertOctal - converts a CARDINAL, num, into an octal/hex/decimal
+                      string and right justifies the string. It adds
+                      spaces rather than '0' to pad out the string
+                      to len characters.
+    
+                      If the length of str is < num then the number is
+                      truncated on the right.
+    *)
+    
+.. index::
+   ConvertOctal
+.. code-block:: modula2
+    PROCEDURE ConvertOctal    (num, len: CARDINAL; VAR str: ARRAY OF CHAR) ;
+.. index::
+   ConvertHex
+.. code-block:: modula2
+    PROCEDURE ConvertHex      (num, len: CARDINAL; VAR str: ARRAY OF CHAR) ;
+.. index::
+   ConvertCardinal
+.. code-block:: modula2
+    PROCEDURE ConvertCardinal (num, len: CARDINAL; VAR str: ARRAY OF CHAR) ;
+    
+    (*
+       The INTEGER counterparts will add a '-' if, num, is <0
+    *)
+    
+.. index::
+   ConvertInteger
+.. code-block:: modula2
+    PROCEDURE ConvertInteger  (num: INTEGER; len: CARDINAL; VAR str: ARRAY OF CHAR) ;
+.. index::
+   ConvertLongInt
+.. code-block:: modula2
+    PROCEDURE ConvertLongInt  (num: LONGINT; len: CARDINAL; VAR str: ARRAY OF CHAR) ;
+.. index::
+   ConvertShortInt
+.. code-block:: modula2
+    PROCEDURE ConvertShortInt (num: SHORTINT; len: CARDINAL; VAR str: ARRAY OF CHAR) ;
+    
+    
+    END Conversions.
+
+@c @node gm2-libs-pim/DebugPMD, gm2-libs-pim/DebugTrace, gm2-libs-pim/Conversions, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/DebugPMD
+---------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE DebugPMD ;
+
+    END DebugPMD.
+
+@c @node gm2-libs-pim/DebugTrace, gm2-libs-pim/Delay, gm2-libs-pim/DebugPMD, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/DebugTrace
+-----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE DebugTrace ;
+
+    END DebugTrace.
+
+@c @node gm2-libs-pim/Delay, gm2-libs-pim/Display, gm2-libs-pim/DebugTrace, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/Delay
+------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Delay ;
+
+    EXPORT QUALIFIED Delay ;
+    
+    
+    (*
+       milliSec - delays the program by approximately, milliSec, milliseconds.
+    *)
+    
+.. index::
+   Delay
+.. code-block:: modula2
+    PROCEDURE Delay (milliSec: INTEGER) ;
+    
+    
+    END Delay.
+
+@c @node gm2-libs-pim/Display, gm2-libs-pim/ErrorCode, gm2-libs-pim/Delay, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/Display
+--------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Display ;
+
+    EXPORT QUALIFIED Write ;
+    
+    
+    (*
+       Write - display a character to the stdout.
+               ASCII.EOL moves to the beginning of the next line.
+               ASCII.del erases the character to the left of the cursor.
+    *)
+    
+.. index::
+   Write
+.. code-block:: modula2
+    PROCEDURE Write (ch: CHAR) ;
+    
+    
+    END Display.
+
+@c @node gm2-libs-pim/ErrorCode, gm2-libs-pim/FileSystem, gm2-libs-pim/Display, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/ErrorCode
+----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE ErrorCode ;
+
+    EXPORT QUALIFIED SetErrorCode, GetErrorCode, ExitToOS ;
+    
+    
+    (*
+       SetErrorCode - sets the exit value which will be used if
+                      the application terminates normally.
+    *)
+    
+.. index::
+   SetErrorCode
+.. code-block:: modula2
+    PROCEDURE SetErrorCode (value: INTEGER) ;
+    
+    
+    (*
+       GetErrorCode - returns the current value to be used upon
+                      application termination.
+    *)
+    
+.. index::
+   GetErrorCode
+.. code-block:: modula2
+    PROCEDURE GetErrorCode (VAR value: INTEGER) ;
+    
+    
+    (*
+       ExitToOS - terminate the application and exit returning
+                  the last value set by SetErrorCode to the OS.
+    *)
+    
+.. index::
+   ExitToOS
+.. code-block:: modula2
+    PROCEDURE ExitToOS ;
+    
+    
+    END ErrorCode.
+
+@c @node gm2-libs-pim/FileSystem, gm2-libs-pim/FloatingUtilities, gm2-libs-pim/ErrorCode, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/FileSystem
+-----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE FileSystem ;
+
+(*  Use this module sparingly, FIO or the ISO file modules have a
+    much cleaner interface.  *)
+    
+    FROM SYSTEM IMPORT WORD, BYTE, ADDRESS ;
+    IMPORT FIO ;
+    FROM DynamicStrings IMPORT String ;
+    
+    EXPORT QUALIFIED File, Response, Flag, FlagSet,
+    
+                     Create, Close, Lookup, Rename, Delete,
+                     SetRead, SetWrite, SetModify, SetOpen,
+                     Doio, SetPos, GetPos, Length, Reset,
+    
+                     ReadWord, ReadChar, ReadByte, ReadNBytes,
+                     WriteWord, WriteChar, WriteByte, WriteNBytes ;
+    
+    TYPE
+.. index::
+   pair: File; (type)
+.. code-block:: modula2
+       File = RECORD
+                 res     : Response ;
+                 flags   : FlagSet ;
+                 eof     : BOOLEAN ;
+                 lastWord: WORD ;
+                 lastByte: BYTE ;
+                 fio     : FIO.File ;
+                 highpos,
+                 lowpos  : CARDINAL ;
+                 name    : String ;
+.. index::
+   pair: END; (type)
+.. code-block:: modula2
+              END ;
+    
+.. index::
+   pair: Flag; (type)
+.. code-block:: modula2
+       Flag = (
+               read,        (* read access mode *)
+               write,       (* write access mode *)
+               modify,
+               truncate,    (* truncate file when closed *)
+               again,       (* reread the last character *)
+               temporary,   (* file is temporary *)
+               opened       (* file has been opened *)
+              );
+    
+.. index::
+   pair: FlagSet; (type)
+.. code-block:: modula2
+       FlagSet = SET OF Flag;
+    
+.. index::
+   pair: Response; (type)
+.. code-block:: modula2
+       Response = (done, notdone, notsupported, callerror,
+                   unknownfile, paramerror, toomanyfiles,
+.. index::
+   pair: userdeverror); (type)
+.. code-block:: modula2
+                   userdeverror) ;
+    
+.. index::
+   pair: Command; (type)
+.. code-block:: modula2
+       Command = (create, close, lookup, rename, delete,
+                  setread, setwrite, setmodify, setopen,
+                  doio, setpos, getpos, length) ;
+    
+    
+    (*
+       Create - creates a temporary file. To make the file perminant
+                the file must be renamed.
+    *)
+    
+.. index::
+   Create
+.. code-block:: modula2
+    PROCEDURE Create (VAR f: File) ;
+    
+    
+    (*
+       Close - closes an open file.
+    *)
+    
+.. index::
+   Close
+.. code-block:: modula2
+    PROCEDURE Close (f: File) ;
+    
+    
+    (*
+       Lookup - looks for a file, filename. If the file is found
+                then, f, is opened. If it is not found and, newFile,
+                is TRUE then a new file is created and attached to, f.
+                If, newFile, is FALSE and no file was found then f.res
+                is set to notdone.
+    *)
+    
+.. index::
+   Lookup
+.. code-block:: modula2
+    PROCEDURE Lookup (VAR f: File; filename: ARRAY OF CHAR; newFile: BOOLEAN) ;
+    
+    
+    (*
+       Rename - rename a file and change a temporary file to a permanent
+                file. f.res is set appropriately.
+    *)
+    
+.. index::
+   Rename
+.. code-block:: modula2
+    PROCEDURE Rename (VAR f: File; newname: ARRAY OF CHAR) ;
+    
+    
+    (*
+       Delete - deletes a file, name, and sets the f.res field.
+                f.res is set appropriately.
+    *)
+    
+.. index::
+   Delete
+.. code-block:: modula2
+    PROCEDURE Delete (name: ARRAY OF CHAR; VAR f: File) ;
+    
+    
+    (*
+       ReadWord - reads a WORD, w, from file, f.
+                  f.res is set appropriately.
+    *)
+    
+.. index::
+   ReadWord
+.. code-block:: modula2
+    PROCEDURE ReadWord (VAR f: File; VAR w: WORD) ;
+    
+    
+    (*
+       WriteWord - writes one word to a file, f.
+                   f.res is set appropriately.
+    *)
+    
+.. index::
+   WriteWord
+.. code-block:: modula2
+    PROCEDURE WriteWord (VAR f: File; w: WORD) ;
+    
+    
+    (*
+       ReadChar - reads one character from a file, f.
+    *)
+    
+.. index::
+   ReadChar
+.. code-block:: modula2
+    PROCEDURE ReadChar (VAR f: File; VAR ch: CHAR) ;
+    
+    
+    (*
+       WriteChar - writes a character, ch, to a file, f.
+                   f.res is set appropriately.
+    *)
+    
+.. index::
+   WriteChar
+.. code-block:: modula2
+    PROCEDURE WriteChar (VAR f: File; ch: CHAR) ;
+    
+    
+    (*
+       ReadByte - reads a BYTE, b, from file, f.
+                  f.res is set appropriately.
+    *)
+    
+.. index::
+   ReadByte
+.. code-block:: modula2
+    PROCEDURE ReadByte (VAR f: File; VAR b: BYTE) ;
+    
+    
+    (*
+       WriteByte - writes one BYTE, b, to a file, f.
+                   f.res is set appropriately.
+    *)
+    
+.. index::
+   WriteByte
+.. code-block:: modula2
+    PROCEDURE WriteByte (VAR f: File; b: BYTE) ;
+    
+    
+    (*
+       ReadNBytes - reads a sequence of bytes from a file, f.
+    *)
+    
+.. index::
+   ReadNBytes
+.. code-block:: modula2
+    PROCEDURE ReadNBytes (VAR f: File; a: ADDRESS; amount: CARDINAL;
+                          VAR actuallyRead: CARDINAL) ;
+    
+    
+    (*
+       WriteNBytes - writes a sequence of bytes to file, f.
+    *)
+    
+.. index::
+   WriteNBytes
+.. code-block:: modula2
+    PROCEDURE WriteNBytes (VAR f: File; a: ADDRESS; amount: CARDINAL;
+                           VAR actuallyWritten: CARDINAL) ;
+    
+    
+    (*
+       Again - returns the last character read to the internal buffer
+               so that it can be read again.
+    *)
+    
+.. index::
+   Again
+.. code-block:: modula2
+    PROCEDURE Again (VAR f: File) ;
+    
+    
+    (*
+       SetRead - puts the file, f, into the read state.
+                 The file position is unchanged.
+    *)
+    
+.. index::
+   SetRead
+.. code-block:: modula2
+    PROCEDURE SetRead (VAR f: File) ;
+    
+    
+    (*
+       SetWrite - puts the file, f, into the write state.
+                  The file position is unchanged.
+    *)
+    
+.. index::
+   SetWrite
+.. code-block:: modula2
+    PROCEDURE SetWrite (VAR f: File) ;
+    
+    
+    (*
+       SetModify - puts the file, f, into the modify state.
+                   The file position is unchanged but the file can be
+                   read and written.
+    *)
+    
+.. index::
+   SetModify
+.. code-block:: modula2
+    PROCEDURE SetModify (VAR f: File) ;
+    
+    
+    (*
+       SetOpen - places a file, f, into the open state. The file may
+                 have been in the read/write/modify state before and
+                 in which case the previous buffer contents are flushed
+                 and the file state is reset to open. The position is
+                 unaltered.
+    *)
+    
+.. index::
+   SetOpen
+.. code-block:: modula2
+    PROCEDURE SetOpen (VAR f: File) ;
+    
+    
+    (*
+       Reset - places a file, f, into the open state and reset the
+               position to the start of the file.
+    *)
+    
+.. index::
+   Reset
+.. code-block:: modula2
+    PROCEDURE Reset (VAR f: File) ;
+    
+    
+    (*
+       SetPos - lseek to a position within a file.
+    *)
+    
+.. index::
+   SetPos
+.. code-block:: modula2
+    PROCEDURE SetPos (VAR f: File; high, low: CARDINAL) ;
+    
+    
+    (*
+       GetPos - return the position within a file.
+    *)
+    
+.. index::
+   GetPos
+.. code-block:: modula2
+    PROCEDURE GetPos (VAR f: File; VAR high, low: CARDINAL) ;
+    
+    
+    (*
+       Length - returns the length of file, in, high, and, low.
+    *)
+    
+.. index::
+   Length
+.. code-block:: modula2
+    PROCEDURE Length (VAR f: File; VAR high, low: CARDINAL) ;
+    
+    
+    (*
+       Doio - effectively flushes a file in write mode, rereads the
+              current buffer from disk if in read mode and writes
+              and rereads the buffer if in modify mode.
+    *)
+    
+.. index::
+   Doio
+.. code-block:: modula2
+    PROCEDURE Doio (VAR f: File) ;
+    
+    
+    (*
+       FileNameChar - checks to see whether the character, ch, is
+                      legal in a filename. nul is returned if the
+                      character was illegal.
+    *)
+    
+.. index::
+   FileNameChar
+.. code-block:: modula2
+    PROCEDURE FileNameChar (ch: CHAR) ;
+    
+    
+    END FileSystem.
+
+@c @node gm2-libs-pim/FloatingUtilities, gm2-libs-pim/InOut, gm2-libs-pim/FileSystem, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/FloatingUtilities
+------------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE FloatingUtilities ;
+
+    EXPORT QUALIFIED Frac, Round, Float, Trunc,
+                     Fracl, Roundl, Floatl, Truncl ;
+    
+    
+    (*
+       Frac - returns the fractional component of, r.
+    *)
+    
+.. index::
+   Frac
+.. code-block:: modula2
+    PROCEDURE Frac (r: REAL) : REAL ;
+    
+    
+    (*
+       Int - returns the integer part of r. It rounds the value towards zero.
+    *)
+    
+.. index::
+   Int
+.. code-block:: modula2
+    PROCEDURE Int (r: REAL) : INTEGER ;
+    
+    
+    (*
+       Round - returns the number rounded to the nearest integer.
+    *)
+    
+.. index::
+   Round
+.. code-block:: modula2
+    PROCEDURE Round (r: REAL) : INTEGER ;
+    
+    
+    (*
+       Float - returns a REAL value corresponding to, i.
+    *)
+    
+.. index::
+   Float
+.. code-block:: modula2
+    PROCEDURE Float (i: INTEGER) : REAL ;
+    
+    
+    (*
+       Trunc - round to the nearest integer not larger in absolute
+               value.
+    *)
+    
+.. index::
+   Trunc
+.. code-block:: modula2
+    PROCEDURE Trunc (r: REAL) : INTEGER ;
+    
+    
+    (*
+       Fracl - returns the fractional component of, r.
+    *)
+    
+.. index::
+   Fracl
+.. code-block:: modula2
+    PROCEDURE Fracl (r: LONGREAL) : LONGREAL ;
+    
+    
+    (*
+       Intl - returns the integer part of r. It rounds the value towards zero.
+    *)
+    
+.. index::
+   Intl
+.. code-block:: modula2
+    PROCEDURE Intl (r: LONGREAL) : LONGINT ;
+    
+    
+    (*
+       Roundl - returns the number rounded to the nearest integer.
+    *)
+    
+.. index::
+   Roundl
+.. code-block:: modula2
+    PROCEDURE Roundl (r: LONGREAL) : LONGINT ;
+    
+    
+    (*
+       Floatl - returns a REAL value corresponding to, i.
+    *)
+    
+.. index::
+   Floatl
+.. code-block:: modula2
+    PROCEDURE Floatl (i: INTEGER) : LONGREAL ;
+    
+    
+    (*
+       Truncl - round to the nearest integer not larger in absolute
+                value.
+    *)
+    
+.. index::
+   Truncl
+.. code-block:: modula2
+    PROCEDURE Truncl (r: LONGREAL) : LONGINT ;
+    
+    
+    END FloatingUtilities.
+
+@c @node gm2-libs-pim/InOut, gm2-libs-pim/Keyboard, gm2-libs-pim/FloatingUtilities, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/InOut
+------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE InOut ;
+
+    IMPORT ASCII ;
+    FROM DynamicStrings IMPORT String ;
+    EXPORT QUALIFIED EOL, Done, termCH, OpenInput, OpenOutput,
+                     CloseInput, CloseOutput,
+                     Read, ReadString, ReadInt, ReadCard,
+                     Write, WriteLn, WriteString, WriteInt, WriteCard,
+                     WriteOct, WriteHex,
+                     ReadS, WriteS ;
+    
+    CONST
+.. index::
+   pair: EOL; (const)
+.. code-block:: modula2
+       EOL = ASCII.EOL ;
+    
+    VAR
+.. index::
+   pair: Done; (var)
+.. code-block:: modula2
+       Done  : BOOLEAN ;
+.. index::
+   pair: termCH; (var)
+.. code-block:: modula2
+       termCH: CHAR ;
+    
+    
+    (*
+       OpenInput - reads a string from stdin as the filename for reading.
+                   If the filename ends with `.' then it appends the defext
+                   extension. The global variable Done is set if all
+                   was successful.
+    *)
+    
+.. index::
+   OpenInput
+.. code-block:: modula2
+    PROCEDURE OpenInput (defext: ARRAY OF CHAR) ;
+    
+    
+    (*
+       CloseInput - closes an opened input file and returns input back to
+                    StdIn.
+    *)
+    
+.. index::
+   CloseInput
+.. code-block:: modula2
+    PROCEDURE CloseInput ;
+    
+    
+    (*
+       OpenOutput - reads a string from stdin as the filename for writing.
+                    If the filename ends with `.' then it appends the defext
+                    extension. The global variable Done is set if all
+                    was successful.
+    *)
+    
+.. index::
+   OpenOutput
+.. code-block:: modula2
+    PROCEDURE OpenOutput (defext: ARRAY OF CHAR) ;
+    
+    
+    (*
+       CloseOutput - closes an opened output file and returns output back to
+                     StdOut.
+    *)
+    
+.. index::
+   CloseOutput
+.. code-block:: modula2
+    PROCEDURE CloseOutput ;
+    
+    
+    (*
+       Read - reads a single character from the current input file.
+              Done is set to FALSE if end of file is reached or an
+              error occurs.
+    *)
+    
+.. index::
+   Read
+.. code-block:: modula2
+    PROCEDURE Read (VAR ch: CHAR) ;
+    
+    
+    (*
+       ReadString - reads a sequence of characters. Leading white space
+                    is ignored and the string is terminated with a character
+                    <= ' '
+    *)
+    
+.. index::
+   ReadString
+.. code-block:: modula2
+    PROCEDURE ReadString (VAR s: ARRAY OF CHAR) ;
+    
+    
+    (*
+       WriteString - writes a string to the output file.
+    *)
+    
+.. index::
+   WriteString
+.. code-block:: modula2
+    PROCEDURE WriteString (s: ARRAY OF CHAR) ;
+    
+    
+    (*
+       Write - writes out a single character, ch, to the current output file.
+    *)
+    
+.. index::
+   Write
+.. code-block:: modula2
+    PROCEDURE Write (ch: CHAR) ;
+    
+    
+    (*
+       WriteLn - writes a newline to the output file.
+    *)
+    
+.. index::
+   WriteLn
+.. code-block:: modula2
+    PROCEDURE WriteLn ;
+    
+    
+    (*
+       ReadInt - reads a string and converts it into an INTEGER, x.
+                 Done is set if an INTEGER is read.
+    *)
+    
+.. index::
+   ReadInt
+.. code-block:: modula2
+    PROCEDURE ReadInt (VAR x: INTEGER) ;
+    
+    
+    (*
+       ReadInt - reads a string and converts it into an INTEGER, x.
+                 Done is set if an INTEGER is read.
+    *)
+    
+.. index::
+   ReadCard
+.. code-block:: modula2
+    PROCEDURE ReadCard (VAR x: CARDINAL) ;
+    
+    
+    (*
+       WriteCard - writes the CARDINAL, x, to the output file. It ensures
+                   that the number occupies, n, characters. Leading spaces
+                   are added if required.
+    *)
+    
+.. index::
+   WriteCard
+.. code-block:: modula2
+    PROCEDURE WriteCard (x, n: CARDINAL) ;
+    
+    
+    (*
+       WriteInt - writes the INTEGER, x, to the output file. It ensures
+                  that the number occupies, n, characters. Leading spaces
+                  are added if required.
+    *)
+    
+.. index::
+   WriteInt
+.. code-block:: modula2
+    PROCEDURE WriteInt (x: INTEGER; n: CARDINAL) ;
+    
+    
+    (*
+       WriteOct - writes the CARDINAL, x, to the output file in octal.
+                  It ensures that the number occupies, n, characters.
+                  Leading spaces are added if required.
+    *)
+    
+.. index::
+   WriteOct
+.. code-block:: modula2
+    PROCEDURE WriteOct (x, n: CARDINAL) ;
+    
+    
+    (*
+       WriteHex - writes the CARDINAL, x, to the output file in hexadecimal.
+                  It ensures that the number occupies, n, characters.
+                  Leading spaces are added if required.
+    *)
+    
+.. index::
+   WriteHex
+.. code-block:: modula2
+    PROCEDURE WriteHex (x, n: CARDINAL) ;
+    
+    
+    (*
+       ReadS - returns a string which has is a sequence of characters.
+               Leading white space is ignored and string is terminated
+               with a character <= ' '.
+    *)
+    
+.. index::
+   ReadS
+.. code-block:: modula2
+    PROCEDURE ReadS () : String ;
+    
+    
+    (*
+       WriteS - writes a String to the output device.
+                It returns the string, s.
+    *)
+    
+.. index::
+   WriteS
+.. code-block:: modula2
+    PROCEDURE WriteS (s: String) : String ;
+    
+    
+    END InOut.
+
+@c @node gm2-libs-pim/Keyboard, gm2-libs-pim/LongIO, gm2-libs-pim/InOut, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/Keyboard
+---------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Keyboard ;
+
+    EXPORT QUALIFIED Read, KeyPressed ;
+    
+    
+    (*
+       Read - reads a character from StdIn. If necessary it will wait
+              for a key to become present on StdIn.
+    *)
+    
+.. index::
+   Read
+.. code-block:: modula2
+    PROCEDURE Read (VAR ch: CHAR) ;
+    
+    
+    (*
+       KeyPressed - returns TRUE if a character can be read from StdIn
+                    without blocking the caller.
+    *)
+    
+.. index::
+   KeyPressed
+.. code-block:: modula2
+    PROCEDURE KeyPressed () : BOOLEAN ;
+    
+    
+    END Keyboard.
+
+@c @node gm2-libs-pim/LongIO, gm2-libs-pim/NumberConversion, gm2-libs-pim/Keyboard, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/LongIO
+-------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE LongIO ;
+
+    EXPORT QUALIFIED Done, ReadLongInt, WriteLongInt ;
+    
+    VAR
+.. index::
+   pair: Done; (var)
+.. code-block:: modula2
+       Done: BOOLEAN ;
+    
+.. index::
+   ReadLongInt
+.. code-block:: modula2
+    PROCEDURE ReadLongInt (VAR i: LONGINT) ;
+.. index::
+   WriteLongInt
+.. code-block:: modula2
+    PROCEDURE WriteLongInt (i: LONGINT; n: CARDINAL) ;
+    
+    
+    END LongIO.
+
+@c @node gm2-libs-pim/NumberConversion, gm2-libs-pim/Random, gm2-libs-pim/LongIO, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/NumberConversion
+-----------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE NumberConversion ;
+
+(* --fixme-- finish this.  *)
+    
+    END NumberConversion.
+
+@c @node gm2-libs-pim/Random, gm2-libs-pim/RealConversions, gm2-libs-pim/NumberConversion, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/Random
+-------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Random ;
+
+    FROM SYSTEM IMPORT BYTE ;
+    EXPORT QUALIFIED Randomize, RandomInit, RandomBytes, RandomCard, RandomInt, RandomReal, RandomLongReal ;
+    
+    
+    (*
+       Randomize - initialize the random number generator with a seed
+                   based on the microseconds.
+    *)
+    
+.. index::
+   Randomize
+.. code-block:: modula2
+    PROCEDURE Randomize ;
+    
+    
+    (*
+       RandomInit - initialize the random number generator with value, seed.
+    *)
+    
+.. index::
+   RandomInit
+.. code-block:: modula2
+    PROCEDURE RandomInit (seed: CARDINAL) ;
+    
+    
+    (*
+       RandomBytes - fills in an array with random values.
+    *)
+    
+.. index::
+   RandomBytes
+.. code-block:: modula2
+    PROCEDURE RandomBytes (VAR a: ARRAY OF BYTE) ;
+    
+    
+    (*
+       RandomInt - return an INTEGER in the range 0..bound-1
+    *)
+    
+.. index::
+   RandomInt
+.. code-block:: modula2
+    PROCEDURE RandomInt (bound: INTEGER) : INTEGER ;
+    
+    
+    (*
+       RandomCard - return a CARDINAL in the range 0..bound-1
+    *)
+    
+.. index::
+   RandomCard
+.. code-block:: modula2
+    PROCEDURE RandomCard (bound: CARDINAL) : CARDINAL ;
+    
+    
+    (*
+       RandomReal - return a REAL number in the range 0.0..1.0
+    *)
+    
+.. index::
+   RandomReal
+.. code-block:: modula2
+    PROCEDURE RandomReal () : REAL ;
+    
+    
+    (*
+       RandomLongReal - return a LONGREAL number in the range 0.0..1.0
+    *)
+    
+.. index::
+   RandomLongReal
+.. code-block:: modula2
+    PROCEDURE RandomLongReal () : LONGREAL ;
+    
+    
+    END Random.
+
+@c @node gm2-libs-pim/RealConversions, gm2-libs-pim/RealInOut, gm2-libs-pim/Random, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/RealConversions
+----------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE RealConversions ;
+
+    EXPORT QUALIFIED SetNoOfExponentDigits,
+                     RealToString, StringToReal,
+                     LongRealToString, StringToLongReal ;
+    
+    
+    (*
+       SetNoOfExponentDigits - sets the number of exponent digits to be
+                               used during future calls of LongRealToString
+                               and RealToString providing that the width
+                               is sufficient.
+                               If this value is set to 0 (the default) then
+                               the number digits used is the minimum necessary.
+    *)
+    
+.. index::
+   SetNoOfExponentDigits
+.. code-block:: modula2
+    PROCEDURE SetNoOfExponentDigits (places: CARDINAL) ;
+    
+    
+    (*
+       RealToString - converts a real, r, into a right justified string, str.
+                      The number of digits to the right of the decimal point
+                      is given in, digits.  The value, width, represents the
+                      maximum number of characters to be used in the string,
+                      str.
+    
+                      If digits is negative then exponent notation is used
+                      whereas if digits is positive then fixed point notation
+                      is used.
+    
+                      If, r, is less than 0.0 then a '-' preceeds the value,
+                      str.  However, if, r, is >= 0.0 a '+' is not added.
+    
+                      If the conversion of, r, to a string requires more
+                      than, width, characters then the string, str, is set
+                      to a nul string and, ok is assigned FALSE.
+    
+                      For fixed point notation the minimum width required is
+                      ABS(width)+8
+    
+                      For exponent notation the minimum width required is
+                      ABS(digits)+2+log10(magnitude).
+    
+                      if r is a NaN then the string 'nan' is returned formatted and
+                      ok will be FALSE.
+    *)
+    
+.. index::
+   RealToString
+.. code-block:: modula2
+    PROCEDURE RealToString (r: REAL; digits, width: INTEGER;
+                            VAR str: ARRAY OF CHAR; VAR ok: BOOLEAN) ;
+    
+    
+    (*
+       LongRealToString - converts a real, r, into a right justified string, str.
+                          The number of digits to the right of the decimal point
+                          is given in, digits. The value, width, represents the
+                          maximum number of characters to be used in the string,
+                          str.
+    
+                          If digits is negative then exponent notation is used
+                          whereas if digits is positive then fixed point notation
+                          is used.
+    
+                          If, r, is less than 0.0 then a '-' preceeds the value,
+                          str. However, if, r, is >= 0.0 a '+' is not added.
+    
+                          If the conversion of, r, to a string requires more
+                          than, width, characters then the string, str, is set
+                          to a nul string and, ok is assigned FALSE.
+    
+                          For fixed point notation the minimum width required is
+                          ABS(width)+8
+    
+                          For exponent notation the minimum width required is
+                          ABS(digits)+2+log10(magnitude).
+    
+                          Examples:
+                          RealToString(100.0, 10, 10, a, ok)       ->  '100.000000'
+                          RealToString(100.0, -5, 12, a, ok)       ->  '  1.00000E+2'
+    
+                          RealToString(123.456789, 10, 10, a, ok)  ->  '123.456789'
+                          RealToString(123.456789, -5, 13, a, ok)  ->  '    1.23456E+2'
+    
+                          RealToString(123.456789, -2, 15, a, ok)  ->  '          1.23E+2'
+    
+                          if r is a NaN then the string 'nan' is returned formatted and
+                          ok will be FALSE.
+    *)
+    
+.. index::
+   LongRealToString
+.. code-block:: modula2
+    PROCEDURE LongRealToString (r: LONGREAL; digits, width: INTEGER;
+                                VAR str: ARRAY OF CHAR; VAR ok: BOOLEAN) ;
+    
+    
+    (*
+       StringToReal - converts, str, into a REAL, r. The parameter, ok, is
+                      set to TRUE if the conversion was successful.
+    *)
+    
+.. index::
+   StringToReal
+.. code-block:: modula2
+    PROCEDURE StringToReal (str: ARRAY OF CHAR; VAR r: REAL; VAR ok: BOOLEAN) ;
+    
+    
+    (*
+       StringToLongReal - converts, str, into a LONGREAL, r. The parameter, ok, is
+                          set to TRUE if the conversion was successful.
+    *)
+    
+.. index::
+   StringToLongReal
+.. code-block:: modula2
+    PROCEDURE StringToLongReal (str: ARRAY OF CHAR; VAR r: LONGREAL; VAR ok: BOOLEAN) ;
+    
+    
+    END RealConversions.
+
+@c @node gm2-libs-pim/RealInOut, gm2-libs-pim/Strings, gm2-libs-pim/RealConversions, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/RealInOut
+----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE RealInOut ;
+
+    EXPORT QUALIFIED SetNoOfDecimalPlaces,
+                     ReadReal, WriteReal, WriteRealOct,
+                     ReadLongReal, WriteLongReal, WriteLongRealOct,
+                     ReadShortReal, WriteShortReal, WriteShortRealOct,
+                     Done ;
+    
+    CONST
+.. index::
+   pair: DefaultDecimalPlaces; (const)
+.. code-block:: modula2
+       DefaultDecimalPlaces = 6 ;
+    
+    VAR
+.. index::
+   pair: Done; (var)
+.. code-block:: modula2
+       Done: BOOLEAN ;
+    
+    
+    (*
+       SetNoOfDecimalPlaces - number of decimal places WriteReal and
+                              WriteLongReal should emit.  This procedure
+                              can be used to override the default
+                              DefaultDecimalPlaces constant.
+    *)
+    
+.. index::
+   SetNoOfDecimalPlaces
+.. code-block:: modula2
+    PROCEDURE SetNoOfDecimalPlaces (places: CARDINAL) ;
+    
+    
+    (*
+       ReadReal - reads a real number, legal syntaxes include:
+                  100, 100.0, 100e0, 100E0, 100E-1, E2, +1E+2, 1e+2
+    *)
+    
+.. index::
+   ReadReal
+.. code-block:: modula2
+    PROCEDURE ReadReal (VAR x: REAL) ;
+    
+    
+    (*
+       WriteReal - writes a real to the terminal. The real number
+                   is right justified and, n, is the minimum field
+                   width.
+    *)
+    
+.. index::
+   WriteReal
+.. code-block:: modula2
+    PROCEDURE WriteReal (x: REAL; n: CARDINAL) ;
+    
+    
+    (*
+       WriteRealOct - writes the real to terminal in octal words.
+    *)
+    
+.. index::
+   WriteRealOct
+.. code-block:: modula2
+    PROCEDURE WriteRealOct (x: REAL) ;
+    
+    
+    (*
+       ReadLongReal - reads a LONGREAL number, legal syntaxes include:
+                      100, 100.0, 100e0, 100E0, 100E-1, E2, +1E+2, 1e+2
+    *)
+    
+.. index::
+   ReadLongReal
+.. code-block:: modula2
+    PROCEDURE ReadLongReal (VAR x: LONGREAL) ;
+    
+    
+    (*
+       WriteLongReal - writes a LONGREAL to the terminal. The real number
+                       is right justified and, n, is the minimum field
+                       width.
+    *)
+    
+.. index::
+   WriteLongReal
+.. code-block:: modula2
+    PROCEDURE WriteLongReal (x: LONGREAL; n: CARDINAL) ;
+    
+    
+    (*
+       WriteLongRealOct - writes the LONGREAL to terminal in octal words.
+    *)
+    
+.. index::
+   WriteLongRealOct
+.. code-block:: modula2
+    PROCEDURE WriteLongRealOct (x: LONGREAL) ;
+    
+    
+    (*
+       ReadShortReal - reads a SHORTREAL number, legal syntaxes include:
+                       100, 100.0, 100e0, 100E0, 100E-1, E2, +1E+2, 1e+2
+    *)
+    
+.. index::
+   ReadShortReal
+.. code-block:: modula2
+    PROCEDURE ReadShortReal (VAR x: SHORTREAL) ;
+    
+    
+    (*
+       WriteShortReal - writes a SHORTREAL to the terminal. The real number
+                        is right justified and, n, is the minimum field
+                        width.
+    *)
+    
+.. index::
+   WriteShortReal
+.. code-block:: modula2
+    PROCEDURE WriteShortReal (x: SHORTREAL; n: CARDINAL) ;
+    
+    
+    (*
+       WriteShortRealOct - writes the SHORTREAL to terminal in octal words.
+    *)
+    
+.. index::
+   WriteShortRealOct
+.. code-block:: modula2
+    PROCEDURE WriteShortRealOct (x: SHORTREAL) ;
+    
+    
+    END RealInOut.
+
+@c @node gm2-libs-pim/Strings, gm2-libs-pim/Termbase, gm2-libs-pim/RealInOut, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/Strings
+--------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Strings ;
+
+    EXPORT QUALIFIED Assign, Insert, Delete, Pos, Copy, ConCat, Length,
+                     CompareStr ;
+    
+    (*
+       Assign - dest := source.
+    *)
+    
+.. index::
+   Assign
+.. code-block:: modula2
+    PROCEDURE Assign (VAR dest: ARRAY OF CHAR; source: ARRAY OF CHAR) ;
+    
+    
+    (*
+       Insert - insert the string, substr, into str at position, index.
+                substr, is added to the end of, str, if, index >= length(str)
+    *)
+    
+.. index::
+   Insert
+.. code-block:: modula2
+    PROCEDURE Insert (substr: ARRAY OF CHAR; VAR str: ARRAY OF CHAR;
+                      index: CARDINAL) ;
+    
+    
+    (*
+       Delete - delete len characters from, str, starting at, index.
+    *)
+    
+.. index::
+   Delete
+.. code-block:: modula2
+    PROCEDURE Delete (VAR str: ARRAY OF CHAR; index: CARDINAL; length: CARDINAL) ;
+    
+    
+    (*
+       Pos - return the first position of, substr, in, str.
+    *)
+    
+.. index::
+   Pos
+.. code-block:: modula2
+    PROCEDURE Pos (substr, str: ARRAY OF CHAR) : CARDINAL ;
+    
+    
+    (*
+       Copy - copy at most, length, characters in, substr, to, str,
+              starting at position, index.
+    *)
+    
+.. index::
+   Copy
+.. code-block:: modula2
+    PROCEDURE Copy (str: ARRAY OF CHAR;
+                    index, length: CARDINAL; VAR result: ARRAY OF CHAR) ;
+    
+    (*
+       ConCat - concatenates two strings, s1, and, s2
+                and places the result into, dest.
+    *)
+    
+.. index::
+   ConCat
+.. code-block:: modula2
+    PROCEDURE ConCat (s1, s2: ARRAY OF CHAR; VAR dest: ARRAY OF CHAR) ;
+    
+    
+    (*
+       Length - return the length of string, s.
+    *)
+    
+.. index::
+   Length
+.. code-block:: modula2
+    PROCEDURE Length (s: ARRAY OF CHAR) : CARDINAL ;
+    
+    
+    (*
+       CompareStr - compare two strings, left, and, right.
+    *)
+    
+.. index::
+   CompareStr
+.. code-block:: modula2
+    PROCEDURE CompareStr (left, right: ARRAY OF CHAR) : INTEGER ;
+    
+    
+    END Strings.
+
+@c @node gm2-libs-pim/Termbase, gm2-libs-pim/Terminal, gm2-libs-pim/Strings, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/Termbase
+---------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Termbase ;
+
+(*
+   Initially the read routines from Keyboard and the
+   write routine from Display is assigned to the Read,
+   KeyPressed and Write procedures.
+*)
+    
+    EXPORT QUALIFIED ReadProcedure, StatusProcedure, WriteProcedure,
+                     AssignRead, AssignWrite, UnAssignRead, UnAssignWrite,
+                     Read, KeyPressed, Write ;
+    
+    TYPE
+.. index::
+   pair: ReadProcedure; (type)
+.. code-block:: modula2
+       ReadProcedure = PROCEDURE (VAR CHAR) ;
+.. index::
+   pair: WriteProcedure; (type)
+.. code-block:: modula2
+       WriteProcedure = PROCEDURE (CHAR) ;
+.. index::
+   pair: StatusProcedure; (type)
+.. code-block:: modula2
+       StatusProcedure = PROCEDURE () : BOOLEAN ;
+    
+    
+    (*
+       AssignRead - assigns a read procedure and status procedure for terminal
+                    input. Done is set to TRUE if successful. Subsequent
+                    Read and KeyPressed calls are mapped onto the user supplied
+                    procedures. The previous read and status procedures are
+                    uncovered and reused after UnAssignRead is called.
+    *)
+    
+.. index::
+   AssignRead
+.. code-block:: modula2
+    PROCEDURE AssignRead (rp: ReadProcedure; sp: StatusProcedure;
+                          VAR Done: BOOLEAN) ;
+    
+    
+    (*
+       UnAssignRead - undo the last call to AssignRead and set Done to TRUE
+                      on success.
+    *)
+    
+.. index::
+   UnAssignRead
+.. code-block:: modula2
+    PROCEDURE UnAssignRead (VAR Done: BOOLEAN) ;
+    
+    
+    (*
+       Read - reads a single character using the currently active read
+              procedure.
+    *)
+    
+.. index::
+   Read
+.. code-block:: modula2
+    PROCEDURE Read (VAR ch: CHAR) ;
+    
+    
+    (*
+       KeyPressed - returns TRUE if a character is available to be read.
+    *)
+    
+.. index::
+   KeyPressed
+.. code-block:: modula2
+    PROCEDURE KeyPressed () : BOOLEAN ;
+    
+    
+    (*
+       AssignWrite - assigns a write procedure for terminal output.
+                     Done is set to TRUE if successful. Subsequent
+                     Write calls are mapped onto the user supplied
+                     procedure. The previous write procedure is
+                     uncovered and reused after UnAssignWrite is called.
+    *)
+    
+.. index::
+   AssignWrite
+.. code-block:: modula2
+    PROCEDURE AssignWrite (wp: WriteProcedure; VAR Done: BOOLEAN) ;
+    
+    
+    (*
+       UnAssignWrite - undo the last call to AssignWrite and set Done to TRUE
+                       on success.
+    *)
+    
+.. index::
+   UnAssignWrite
+.. code-block:: modula2
+    PROCEDURE UnAssignWrite (VAR Done: BOOLEAN) ;
+    
+    
+    (*
+       Write - writes a single character using the currently active write
+               procedure.
+    *)
+    
+.. index::
+   Write
+.. code-block:: modula2
+    PROCEDURE Write (VAR ch: CHAR) ;
+    
+    
+    END Termbase.
+
+@c @node gm2-libs-pim/Terminal, gm2-libs-pim/TimeDate, gm2-libs-pim/Termbase, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/Terminal
+---------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Terminal ;
+
+(*
+   It provides simple terminal input output
+   routines which all utilize the TermBase module.
+*)
+    
+    EXPORT QUALIFIED Read, KeyPressed, ReadAgain, ReadString, Write,
+                     WriteString, WriteLn ;
+    
+    
+    (*
+       Read - reads a single character.
+    *)
+    
+.. index::
+   Read
+.. code-block:: modula2
+    PROCEDURE Read (VAR ch: CHAR) ;
+    
+    
+    (*
+       KeyPressed - returns TRUE if a character can be read without blocking
+                    the caller.
+    *)
+    
+.. index::
+   KeyPressed
+.. code-block:: modula2
+    PROCEDURE KeyPressed () : BOOLEAN ;
+    
+    
+    (*
+       ReadString - reads a sequence of characters.
+                    Tabs are expanded into 8 spaces and <cr> or <lf> terminates
+                    the string.
+    *)
+    
+.. index::
+   ReadString
+.. code-block:: modula2
+    PROCEDURE ReadString (VAR s: ARRAY OF CHAR) ;
+    
+    
+    (*
+       ReadAgain - makes the last character readable again.
+    *)
+    
+.. index::
+   ReadAgain
+.. code-block:: modula2
+    PROCEDURE ReadAgain ;
+    
+    
+    (*
+       Write - writes a single character to the Termbase module.
+    *)
+    
+.. index::
+   Write
+.. code-block:: modula2
+    PROCEDURE Write (ch: CHAR) ;
+    
+    
+    (*
+       WriteString - writes out a string which is terminated by a <nul>
+                     character or the end of string HIGH(s).
+    *)
+    
+.. index::
+   WriteString
+.. code-block:: modula2
+    PROCEDURE WriteString (s: ARRAY OF CHAR) ;
+    
+    
+    (*
+       WriteLn - writes a lf character.
+    *)
+    
+.. index::
+   WriteLn
+.. code-block:: modula2
+    PROCEDURE WriteLn ;
+    
+    
+    END Terminal.
+
+@c @node gm2-libs-pim/TimeDate, , gm2-libs-pim/Terminal, PIM and Logitech 3.0 Compatible
+gm2-libs-pim/TimeDate
+---------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE TimeDate ;
+
+(*
+   Legacy compatibility - you are advised to use cleaner
+   designed modules based on 'man 3 strtime'
+   and friends for new projects as the day value here is ugly.
+   [it was mapped onto MSDOS pre 2000].
+*)
+    
+    EXPORT QUALIFIED Time, GetTime, SetTime, CompareTime, TimeToZero,
+                     TimeToString ;
+    
+    TYPE
+    (*
+       day holds:  bits 0..4 = day of month (1..31)
+                        5..8 = month of year (1..12)
+                        9..  = year - 1900
+       minute holds:    hours * 60 + minutes
+       millisec holds:  seconds * 1000 + millisec
+                        which is reset to 0 every minute
+    *)
+    
+       Time = RECORD
+                 day, minute, millisec: CARDINAL ;
+              END ;
+    
+    
+    (*
+       GetTime - returns the current date and time.
+    *)
+    
+.. index::
+   GetTime
+.. code-block:: modula2
+    PROCEDURE GetTime (VAR curTime: Time) ;
+    
+    
+    (*
+       SetTime - does nothing, but provides compatibility with
+                 the Logitech-3.0 library.
+    *)
+    
+.. index::
+   SetTime
+.. code-block:: modula2
+    PROCEDURE SetTime (curTime: Time) ;
+    
+    
+    (*
+       CompareTime - compare two dates and time which returns:
+    
+                     -1  if t1 < t2
+                      0  if t1 = t2
+                      1  if t1 > t2
+    *)
+    
+.. index::
+   CompareTime
+.. code-block:: modula2
+    PROCEDURE CompareTime (t1, t2: Time) : INTEGER ;
+    
+    
+    (*
+       TimeToZero - initializes, t, to zero.
+    *)
+    
+.. index::
+   TimeToZero
+.. code-block:: modula2
+    PROCEDURE TimeToZero (VAR t: Time) ;
+    
+    
+    (*
+       TimeToString - convert time, t, to a string.
+                      The string, s, should be at least 19 characters
+                      long and the returned string will be
+    
+                      yyyy-mm-dd hh:mm:ss
+    *)
+    
+.. index::
+   TimeToString
+.. code-block:: modula2
+    PROCEDURE TimeToString (t: Time; VAR s: ARRAY OF CHAR) ;
+    
+    
+    END TimeDate.
+
+
+@c ------------------------------------------------------------
+@c @node PIM coroutine support, M2 ISO Libraries, PIM and Logitech 3.0 Compatible, Libraries
+PIM coroutine support
+=====================
+
+@menu
+* gm2-libs-coroutines/Debug::Debug.def
+* gm2-libs-coroutines/Executive::Executive.def
+* gm2-libs-coroutines/KeyBoardLEDs::KeyBoardLEDs.def
+* gm2-libs-coroutines/SYSTEM::SYSTEM.def
+* gm2-libs-coroutines/TimerHandler::TimerHandler.def
+@end menu
+
+@c @node gm2-libs-coroutines/Debug, gm2-libs-coroutines/Executive, , PIM coroutine support
+gm2-libs-coroutines/Debug
+-------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Debug ;
+
+(*
+    Description: provides some simple debugging routines.
+*)
+    
+    EXPORT QUALIFIED Halt, DebugString, PushOutput ;
+    
+    TYPE
+.. index::
+   pair: WriteP; (type)
+.. code-block:: modula2
+       WriteP = PROCEDURE (CHAR) ;
+    
+    
+    (*
+       Halt - writes a message in the format:
+              Module:Line:Message
+    
+              It then terminates by calling HALT.
+    *)
+    
+.. index::
+   Halt
+.. code-block:: modula2
+    PROCEDURE Halt (File    : ARRAY OF CHAR;
+                    LineNo  : CARDINAL;
+                    Function,
+                    Message : ARRAY OF CHAR) ;
+    
+    
+    (*
+       DebugString - writes a string to the debugging device (Scn.Write).
+                     It interprets \n as carriage return, linefeed.
+    *)
+    
+.. index::
+   DebugString
+.. code-block:: modula2
+    PROCEDURE DebugString (a: ARRAY OF CHAR) ;
+    
+    
+    (*
+       PushOutput - pushes the output procedure, p, which is used Debug.
+    *)
+    
+.. index::
+   PushOutput
+.. code-block:: modula2
+    PROCEDURE PushOutput (p: WriteP) ;
+    
+    
+    (*
+       PopOutput - pops the current output procedure from the stack.
+    *)
+    
+.. index::
+   PopOutput
+.. code-block:: modula2
+    PROCEDURE PopOutput ;
+    
+    
+    END Debug.
+
+@c @node gm2-libs-coroutines/Executive, gm2-libs-coroutines/KeyBoardLEDs, gm2-libs-coroutines/Debug, PIM coroutine support
+gm2-libs-coroutines/Executive
+-----------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Executive ;
+
+    EXPORT QUALIFIED SEMAPHORE, DESCRIPTOR,
+                     InitProcess, KillProcess, Resume, Suspend, InitSemaphore,
+                     Wait, Signal, WaitForIO, Ps, GetCurrentProcess,
+                     RotateRunQueue, ProcessName, DebugProcess ;
+    
+    TYPE
+.. index::
+   pair: SEMAPHORE; (type)
+.. code-block:: modula2
+       SEMAPHORE ;         (* defines Dijkstra's semaphores *)
+.. index::
+   pair: DESCRIPTOR; (type)
+.. code-block:: modula2
+       DESCRIPTOR ;        (* handle onto a process         *)
+    
+    
+    (*
+       InitProcess - initializes a process which is held in the suspended
+                     state. When the process is resumed it will start executing
+                     procedure, p. The process has a maximum stack size of,
+                     StackSize, bytes and its textual name is, Name.
+                     The StackSize should be at least 5000 bytes.
+    *)
+    
+.. index::
+   InitProcess
+.. code-block:: modula2
+    PROCEDURE InitProcess (p: PROC; StackSize: CARDINAL;
+                           Name: ARRAY OF CHAR) : DESCRIPTOR ;
+    
+    
+    (*
+       KillProcess - kills the current process. Notice that if InitProcess
+                     is called again, it might reuse the DESCRIPTOR of the
+                     killed process. It is the responsibility of the caller
+                     to ensure all other processes understand this process
+                     is different.
+    *)
+    
+.. index::
+   KillProcess
+.. code-block:: modula2
+    PROCEDURE KillProcess ;
+    
+    
+    (*
+       Resume - resumes a suspended process. If all is successful then the process, p,
+                is returned. If it fails then NIL is returned.
+    *)
+    
+.. index::
+   Resume
+.. code-block:: modula2
+    PROCEDURE Resume (d: DESCRIPTOR) : DESCRIPTOR ;
+    
+    
+    (*
+       Suspend - suspend the calling process.
+                 The process can only continue running if another process
+                 Resumes it.
+    *)
+    
+.. index::
+   Suspend
+.. code-block:: modula2
+    PROCEDURE Suspend ;
+    
+    
+    (*
+       InitSemaphore - creates a semaphore whose initial value is, v, and
+                       whose name is, Name.
+    *)
+    
+.. index::
+   InitSemaphore
+.. code-block:: modula2
+    PROCEDURE InitSemaphore (v: CARDINAL; Name: ARRAY OF CHAR) : SEMAPHORE ;
+    
+    
+    (*
+       Wait - performs dijkstra's P operation on a semaphore.
+              A process which calls this procedure will
+              wait until the value of the semaphore is > 0
+              and then it will decrement this value.
+    *)
+    
+.. index::
+   Wait
+.. code-block:: modula2
+    PROCEDURE Wait (s: SEMAPHORE) ;
+    
+    
+    (*
+       Signal - performs dijkstra's V operation on a semaphore.
+                A process which calls the procedure will increment
+                the semaphores value.
+    *)
+    
+.. index::
+   Signal
+.. code-block:: modula2
+    PROCEDURE Signal (s: SEMAPHORE) ;
+    
+    
+    (*
+       WaitForIO - waits for an interrupt to occur on vector, VectorNo.
+    *)
+    
+.. index::
+   WaitForIO
+.. code-block:: modula2
+    PROCEDURE WaitForIO (VectorNo: CARDINAL) ;
+    
+    
+    (*
+       Ps - displays a process list together with process status.
+    *)
+    
+.. index::
+   Ps
+.. code-block:: modula2
+    PROCEDURE Ps ;
+    
+    
+    (*
+       GetCurrentProcess - returns the descriptor of the current running
+                           process.
+    *)
+    
+.. index::
+   GetCurrentProcess
+.. code-block:: modula2
+    PROCEDURE GetCurrentProcess () : DESCRIPTOR ;
+    
+    
+    (*
+       RotateRunQueue - rotates the process run queue.
+                        It does not call the scheduler.
+    *)
+    
+.. index::
+   RotateRunQueue
+.. code-block:: modula2
+    PROCEDURE RotateRunQueue ;
+    
+    
+    (*
+       ProcessName - displays the name of process, d, through
+                     DebugString.
+    *)
+    
+.. index::
+   ProcessName
+.. code-block:: modula2
+    PROCEDURE ProcessName (d: DESCRIPTOR) ;
+    
+    
+    (*
+       DebugProcess - gdb debug handle to enable users to debug deadlocked
+                      semaphore processes.
+    *)
+    
+.. index::
+   DebugProcess
+.. code-block:: modula2
+    PROCEDURE DebugProcess (d: DESCRIPTOR) ;
+    
+    
+    END Executive.
+
+@c @node gm2-libs-coroutines/KeyBoardLEDs, gm2-libs-coroutines/SYSTEM, gm2-libs-coroutines/Executive, PIM coroutine support
+gm2-libs-coroutines/KeyBoardLEDs
+--------------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE KeyBoardLEDs ;
+
+    
+    EXPORT QUALIFIED SwitchLeds,
+                     SwitchScroll, SwitchNum, SwitchCaps ;
+    
+    
+    (*
+       SwitchLeds - switch the keyboard LEDs to the state defined
+                    by the BOOLEAN variables. TRUE = ON.
+    *)
+    
+.. index::
+   SwitchLeds
+.. code-block:: modula2
+    PROCEDURE SwitchLeds (NumLock, CapsLock, ScrollLock: BOOLEAN) ;
+    
+    
+    (*
+       SwitchScroll - switchs the scroll LED on or off.
+    *)
+    
+.. index::
+   SwitchScroll
+.. code-block:: modula2
+    PROCEDURE SwitchScroll (Scroll: BOOLEAN) ;
+    
+    
+    (*
+       SwitchNum - switches the Num LED on or off.
+    *)
+    
+.. index::
+   SwitchNum
+.. code-block:: modula2
+    PROCEDURE SwitchNum (Num: BOOLEAN) ;
+    
+    
+    (*
+       SwitchCaps - switches the Caps LED on or off.
+    *)
+    
+.. index::
+   SwitchCaps
+.. code-block:: modula2
+    PROCEDURE SwitchCaps (Caps: BOOLEAN) ;
+    
+    
+    END KeyBoardLEDs.
+
+@c @node gm2-libs-coroutines/SYSTEM, gm2-libs-coroutines/TimerHandler, gm2-libs-coroutines/KeyBoardLEDs, PIM coroutine support
+gm2-libs-coroutines/SYSTEM
+--------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE SYSTEM ;
+
+(* This module is designed to be used on a native operating system
+   rather than an embedded system as it implements the coroutine
+   primitives TRANSFER, IOTRANSFER and
+   NEWPROCESS through the GNU Pthread library.  *)
+    
+    FROM COROUTINES IMPORT PROTECTION ;
+    
+    EXPORT QUALIFIED (* the following are built into the compiler: *)
+                     ADDRESS, WORD, BYTE, CSIZE_T, CSSIZE_T, (* @SYSTEM_DATATYPES@ *)
+                     ADR, TSIZE, ROTATE, SHIFT, THROW, TBITSIZE,
+                     (* SIZE is exported depending upon -fpim2 and
+                        -fpedantic.  *)
+                     (* The rest are implemented in SYSTEM.mod.  *)
+                     PROCESS, TRANSFER, NEWPROCESS, IOTRANSFER,
+                     LISTEN,
+                     ListenLoop, TurnInterrupts,
+                     (* Internal GM2 compiler functions.  *)
+                     ShiftVal, ShiftLeft, ShiftRight,
+                     RotateVal, RotateLeft, RotateRight ;
+    
+    
+    TYPE
+.. index::
+   pair: PROCESS; (type)
+.. code-block:: modula2
+       PROCESS  = RECORD
+                     context: INTEGER ;
+.. index::
+   pair: END; (type)
+.. code-block:: modula2
+                  END ;
+    (* all the following types are declared internally to gm2
+       @SYSTEM_TYPES@
+    *)
+    
+    
+    (*
+       TRANSFER - save the current volatile environment into, p1.
+                  Restore the volatile environment from, p2.
+    *)
+    
+.. index::
+   TRANSFER
+.. code-block:: modula2
+    PROCEDURE TRANSFER (VAR p1: PROCESS; p2: PROCESS) ;
+    
+    
+    (*
+       NEWPROCESS - p is a parameterless procedure, a, is the origin of
+                    the workspace used for the process stack and containing
+                    the volatile environment of the process.  StackSize, is
+                    the maximum size of the stack in bytes which can be used
+                    by this process.  new, is the new process.
+    *)
+    
+.. index::
+   NEWPROCESS
+.. code-block:: modula2
+    PROCEDURE NEWPROCESS (p: PROC; a: ADDRESS; StackSize: CARDINAL; VAR new: PROCESS) ;
+    
+    
+    (*
+       IOTRANSFER - saves the current volatile environment into, First,
+                    and restores volatile environment, Second.
+                    When an interrupt, InterruptNo, is encountered then
+                    the reverse takes place.  (The then current volatile
+                    environment is shelved onto Second and First is resumed).
+    
+                    NOTE: that upon interrupt the Second might not be the
+                          same process as that before the original call to
+                          IOTRANSFER.
+    *)
+    
+.. index::
+   IOTRANSFER
+.. code-block:: modula2
+    PROCEDURE IOTRANSFER (VAR First, Second: PROCESS; InterruptNo: CARDINAL) ;
+    
+    
+    (*
+       LISTEN - briefly listen for any interrupts.
+    *)
+    
+.. index::
+   LISTEN
+.. code-block:: modula2
+    PROCEDURE LISTEN ;
+    
+    
+    (*
+       ListenLoop - should be called instead of users writing:
+    
+                    LOOP
+                       LISTEN
+                    END
+    
+                    It performs the same function but yields
+                    control back to the underlying operating system
+                    via a call to pth_select.
+                    It also checks for deadlock.
+                    This function returns when an interrupt occurs ie
+                    a file descriptor becomes ready or a time event
+                    expires.  See the module RTint.
+    *)
+    
+.. index::
+   ListenLoop
+.. code-block:: modula2
+    PROCEDURE ListenLoop ;
+    
+    
+    (*
+       TurnInterrupts - switches processor interrupts to the protection
+                        level, to.  It returns the old value.
+    *)
+    
+.. index::
+   TurnInterrupts
+.. code-block:: modula2
+    PROCEDURE TurnInterrupts (to: PROTECTION) : PROTECTION ;
+    
+    
+    (*
+       all the functions below are declared internally to gm2
+       ====================================================
+    
+.. index::
+   ADR
+.. code-block:: modula2
+    PROCEDURE ADR (VAR v: <anytype>): ADDRESS;
+      (* Returns the address of variable v. *)
+    
+.. index::
+   SIZE
+.. code-block:: modula2
+    PROCEDURE SIZE (v: <type>) : ZType;
+      (* Returns the number of BYTES used to store a v of
+         any specified <type>.  Only available if -fpim2 is used.
+      *)
+    
+.. index::
+   TSIZE
+.. code-block:: modula2
+    PROCEDURE TSIZE (<type>) : CARDINAL;
+      (* Returns the number of BYTES used to store a value of the
+         specified <type>.
+      *)
+    
+.. index::
+   ROTATE
+.. code-block:: modula2
+    PROCEDURE ROTATE (val: <a set type>;
+                      num: INTEGER): <type of first parameter>;
+      (* Returns a bit sequence obtained from val by rotating up or down
+         (left or right) by the absolute value of num.  The direction is
+         down if the sign of num is negative, otherwise the direction is up.
+      *)
+    
+.. index::
+   SHIFT
+.. code-block:: modula2
+    PROCEDURE SHIFT (val: <a set type>;
+                     num: INTEGER): <type of first parameter>;
+      (* Returns a bit sequence obtained from val by shifting up or down
+         (left or right) by the absolute value of num, introducing
+         zeros as necessary.  The direction is down if the sign of
+         num is negative, otherwise the direction is up.
+      *)
+    
+.. index::
+   THROW
+.. code-block:: modula2
+    PROCEDURE THROW (i: INTEGER) ;
+      (*
+         THROW is a GNU extension and was not part of the PIM or ISO
+         standards.  It throws an exception which will be caught by the EXCEPT
+         block (assuming it exists).  This is a compiler builtin function which
+         interfaces to the GCC exception handling runtime system.
+         GCC uses the term throw, hence the naming distinction between
+         the GCC builtin and the Modula-2 runtime library procedure Raise.
+         The later library procedure Raise will call SYSTEM.THROW after
+         performing various housekeeping activities.
+      *)
+    
+.. index::
+   TBITSIZE
+.. code-block:: modula2
+    PROCEDURE TBITSIZE (<type>) : CARDINAL ;
+      (* Returns the minimum number of bits necessary to represent
+         <type>.  This procedure function is only useful for determining
+         the number of bits used for any type field within a packed RECORD.
+         It is not particularly useful elsewhere since <type> might be
+         optimized for speed, for example a BOOLEAN could occupy a WORD.
+      *)
+    *)
+    
+    (* The following procedures are invoked by GNU Modula-2 to
+       shift non word sized set types.  They are not strictly part
+       of the core PIM Modula-2, however they are used
+       to implement the SHIFT procedure defined above,
+       which are in turn used by the Logitech compatible libraries.
+    
+       Users will access these procedures by using the procedure
+       SHIFT above and GNU Modula-2 will map SHIFT onto one of
+       the following procedures.
+    *)
+    
+    (*
+       ShiftVal - is a runtime procedure whose job is to implement
+                  the SHIFT procedure of ISO SYSTEM. GNU Modula-2 will
+                  inline a SHIFT of a single WORD sized set and will
+                  only call this routine for larger sets.
+    *)
+    
+.. index::
+   ShiftVal
+.. code-block:: modula2
+    PROCEDURE ShiftVal (VAR s, d: ARRAY OF BITSET;
+                        SetSizeInBits: CARDINAL;
+                        ShiftCount: INTEGER) ;
+    
+    
+    (*
+       ShiftLeft - performs the shift left for a multi word set.
+                   This procedure might be called by the back end of
+                   GNU Modula-2 depending whether amount is known at
+                   compile time.
+    *)
+    
+.. index::
+   ShiftLeft
+.. code-block:: modula2
+    PROCEDURE ShiftLeft (VAR s, d: ARRAY OF BITSET;
+                         SetSizeInBits: CARDINAL;
+                         ShiftCount: CARDINAL) ;
+    
+    (*
+       ShiftRight - performs the shift left for a multi word set.
+                    This procedure might be called by the back end of
+                    GNU Modula-2 depending whether amount is known at
+                    compile time.
+    *)
+    
+.. index::
+   ShiftRight
+.. code-block:: modula2
+    PROCEDURE ShiftRight (VAR s, d: ARRAY OF BITSET;
+                         SetSizeInBits: CARDINAL;
+                         ShiftCount: CARDINAL) ;
+    
+    
+    (*
+       RotateVal - is a runtime procedure whose job is to implement
+                   the ROTATE procedure of ISO SYSTEM.  GNU Modula-2 will
+                   inline a ROTATE of a single WORD (or less)
+                   sized set and will only call this routine for
+                   larger sets.
+    *)
+    
+.. index::
+   RotateVal
+.. code-block:: modula2
+    PROCEDURE RotateVal (VAR s, d: ARRAY OF BITSET;
+                         SetSizeInBits: CARDINAL;
+                         RotateCount: INTEGER) ;
+    
+    
+    (*
+       RotateLeft - performs the rotate left for a multi word set.
+                    This procedure might be called by the back end of
+                    GNU Modula-2 depending whether amount is known
+                    at compile time.
+    *)
+    
+.. index::
+   RotateLeft
+.. code-block:: modula2
+    PROCEDURE RotateLeft (VAR s, d: ARRAY OF BITSET;
+                          SetSizeInBits: CARDINAL;
+                          RotateCount: CARDINAL) ;
+    
+    
+    (*
+       RotateRight - performs the rotate right for a multi word set.
+                     This procedure might be called by the back end of
+                     GNU Modula-2 depending whether amount is known at
+                     compile time.
+    *)
+    
+.. index::
+   RotateRight
+.. code-block:: modula2
+    PROCEDURE RotateRight (VAR s, d: ARRAY OF BITSET;
+                           SetSizeInBits: CARDINAL;
+                           RotateCount: CARDINAL) ;
+    
+    
+    END SYSTEM.
+
+@c @node gm2-libs-coroutines/TimerHandler, , gm2-libs-coroutines/SYSTEM, PIM coroutine support
+gm2-libs-coroutines/TimerHandler
+--------------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE TimerHandler ;
+
+(* It also provides the Executive with a basic round robin scheduler.  *)
+    
+    EXPORT QUALIFIED TicksPerSecond, GetTicks,
+                     EVENT,
+                     Sleep, ArmEvent, WaitOn, Cancel, ReArmEvent ;
+    
+    
+    CONST
+.. index::
+   pair: TicksPerSecond; (const)
+.. code-block:: modula2
+       TicksPerSecond =   25 ;  (* Number of ticks per second.  *)
+    
+    TYPE
+.. index::
+   pair: EVENT; (type)
+.. code-block:: modula2
+       EVENT ;
+    
+    
+    (*
+       GetTicks - returns the number of ticks since boottime.
+    *)
+    
+.. index::
+   GetTicks
+.. code-block:: modula2
+    PROCEDURE GetTicks () : CARDINAL ;
+    
+    
+    (*
+       Sleep - suspends the current process for a time, t.
+               The time is measured in ticks.
+    *)
+    
+.. index::
+   Sleep
+.. code-block:: modula2
+    PROCEDURE Sleep (t: CARDINAL) ;
+    
+    
+    (*
+       ArmEvent - initializes an event, e, to occur at time, t.
+                  The time, t, is measured in ticks.
+                  The event is NOT placed onto the event queue.
+    *)
+    
+.. index::
+   ArmEvent
+.. code-block:: modula2
+    PROCEDURE ArmEvent (t: CARDINAL) : EVENT ;
+    
+    
+    (*
+       WaitOn - places event, e, onto the event queue and then the calling
+                process suspends. It is resumed up by either the event
+                expiring or the event, e, being cancelled.
+                TRUE is returned if the event was cancelled
+                FALSE is returned if the event expires.
+                The event, e, is always assigned to NIL when the function
+                finishes.
+    *)
+    
+.. index::
+   WaitOn
+.. code-block:: modula2
+    PROCEDURE WaitOn (VAR e: EVENT) : BOOLEAN ;
+    
+    
+    (*
+       Cancel - cancels the event, e, on the event queue and makes
+                the appropriate process runnable again.
+                TRUE is returned if the event was cancelled and
+                FALSE is returned is the event was not found or
+                      no process was waiting on this event.
+    *)
+    
+.. index::
+   Cancel
+.. code-block:: modula2
+    PROCEDURE Cancel (e: EVENT) : BOOLEAN ;
+    
+    
+    (*
+       ReArmEvent - removes an event, e, from the event queue. A new time
+                    is given to this event and it is then re-inserted onto the
+                    event queue in the correct place.
+                    TRUE is returned if this occurred
+                    FALSE is returned if the event was not found.
+    *)
+    
+.. index::
+   ReArmEvent
+.. code-block:: modula2
+    PROCEDURE ReArmEvent (e: EVENT; t: CARDINAL) : BOOLEAN ;
+    
+    
+    END TimerHandler.
+
+
+@c ------------------------------------------------------------
+@c @node M2 ISO Libraries, , PIM coroutine support, Libraries
+M2 ISO Libraries
+================
+
+@menu
+* gm2-libs-iso/COROUTINES::COROUTINES.def
+* gm2-libs-iso/ChanConsts::ChanConsts.def
+* gm2-libs-iso/CharClass::CharClass.def
+* gm2-libs-iso/ClientSocket::ClientSocket.def
+* gm2-libs-iso/ComplexMath::ComplexMath.def
+* gm2-libs-iso/ConvStringLong::ConvStringLong.def
+* gm2-libs-iso/ConvStringReal::ConvStringReal.def
+* gm2-libs-iso/ConvTypes::ConvTypes.def
+* gm2-libs-iso/EXCEPTIONS::EXCEPTIONS.def
+* gm2-libs-iso/ErrnoCategory::ErrnoCategory.def
+* gm2-libs-iso/GeneralUserExceptions::GeneralUserExceptions.def
+* gm2-libs-iso/IOChan::IOChan.def
+* gm2-libs-iso/IOConsts::IOConsts.def
+* gm2-libs-iso/IOLink::IOLink.def
+* gm2-libs-iso/IOResult::IOResult.def
+* gm2-libs-iso/LongComplexMath::LongComplexMath.def
+* gm2-libs-iso/LongConv::LongConv.def
+* gm2-libs-iso/LongIO::LongIO.def
+* gm2-libs-iso/LongMath::LongMath.def
+* gm2-libs-iso/LongStr::LongStr.def
+* gm2-libs-iso/LongWholeIO::LongWholeIO.def
+* gm2-libs-iso/LowLong::LowLong.def
+* gm2-libs-iso/LowReal::LowReal.def
+* gm2-libs-iso/LowShort::LowShort.def
+* gm2-libs-iso/M2EXCEPTION::M2EXCEPTION.def
+* gm2-libs-iso/M2RTS::M2RTS.def
+* gm2-libs-iso/MemStream::MemStream.def
+* gm2-libs-iso/Preemptive::Preemptive.def
+* gm2-libs-iso/Processes::Processes.def
+* gm2-libs-iso/ProgramArgs::ProgramArgs.def
+* gm2-libs-iso/RTco::RTco.def
+* gm2-libs-iso/RTdata::RTdata.def
+* gm2-libs-iso/RTentity::RTentity.def
+* gm2-libs-iso/RTfio::RTfio.def
+* gm2-libs-iso/RTgen::RTgen.def
+* gm2-libs-iso/RTgenif::RTgenif.def
+* gm2-libs-iso/RTio::RTio.def
+* gm2-libs-iso/RandomNumber::RandomNumber.def
+* gm2-libs-iso/RawIO::RawIO.def
+* gm2-libs-iso/RealConv::RealConv.def
+* gm2-libs-iso/RealIO::RealIO.def
+* gm2-libs-iso/RealMath::RealMath.def
+* gm2-libs-iso/RealStr::RealStr.def
+* gm2-libs-iso/RndFile::RndFile.def
+* gm2-libs-iso/SIOResult::SIOResult.def
+* gm2-libs-iso/SLongIO::SLongIO.def
+* gm2-libs-iso/SLongWholeIO::SLongWholeIO.def
+* gm2-libs-iso/SRawIO::SRawIO.def
+* gm2-libs-iso/SRealIO::SRealIO.def
+* gm2-libs-iso/SShortIO::SShortIO.def
+* gm2-libs-iso/SShortWholeIO::SShortWholeIO.def
+* gm2-libs-iso/STextIO::STextIO.def
+* gm2-libs-iso/SWholeIO::SWholeIO.def
+* gm2-libs-iso/SYSTEM::SYSTEM.def
+* gm2-libs-iso/Semaphores::Semaphores.def
+* gm2-libs-iso/SeqFile::SeqFile.def
+* gm2-libs-iso/ShortComplexMath::ShortComplexMath.def
+* gm2-libs-iso/ShortIO::ShortIO.def
+* gm2-libs-iso/ShortWholeIO::ShortWholeIO.def
+* gm2-libs-iso/SimpleCipher::SimpleCipher.def
+* gm2-libs-iso/StdChans::StdChans.def
+* gm2-libs-iso/Storage::Storage.def
+* gm2-libs-iso/StreamFile::StreamFile.def
+* gm2-libs-iso/StringChan::StringChan.def
+* gm2-libs-iso/Strings::Strings.def
+* gm2-libs-iso/SysClock::SysClock.def
+* gm2-libs-iso/TERMINATION::TERMINATION.def
+* gm2-libs-iso/TermFile::TermFile.def
+* gm2-libs-iso/TextIO::TextIO.def
+* gm2-libs-iso/WholeConv::WholeConv.def
+* gm2-libs-iso/WholeIO::WholeIO.def
+* gm2-libs-iso/WholeStr::WholeStr.def
+* gm2-libs-iso/wrapsock::wrapsock.def
+* gm2-libs-iso/wraptime::wraptime.def
+@end menu
+
+@c @node gm2-libs-iso/COROUTINES, gm2-libs-iso/ChanConsts, , M2 ISO Libraries
+gm2-libs-iso/COROUTINES
+-----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE COROUTINES;
+
+(* Facilities for coroutines and the handling of interrupts *)
+    
+    IMPORT SYSTEM ;
+    
+    
+    CONST
+.. index::
+   pair: UnassignedPriority; (const)
+.. code-block:: modula2
+      UnassignedPriority = 0 ;
+    
+    TYPE
+.. index::
+   pair: COROUTINE; (type)
+.. code-block:: modula2
+      COROUTINE ; (* Values of this type are created dynamically by NEWCOROUTINE
+                     and identify the coroutine in subsequent operations *)
+.. index::
+   pair: INTERRUPTSOURCE; (type)
+.. code-block:: modula2
+      INTERRUPTSOURCE = CARDINAL ;
+.. index::
+   pair: PROTECTION; (type)
+.. code-block:: modula2
+      PROTECTION = [UnassignedPriority..7] ;
+    
+    
+.. index::
+   NEWCOROUTINE
+.. code-block:: modula2
+    PROCEDURE NEWCOROUTINE (procBody: PROC;
+                            workspace: SYSTEM.ADDRESS;
+                            size: CARDINAL;
+                            VAR cr: COROUTINE;
+                            [initProtection: PROTECTION = UnassignedPriority]);
+      (* Creates a new coroutine whose body is given by procBody, and
+         returns the identity of the coroutine in cr. workspace is a
+         pointer to the work space allocated to the coroutine; size
+         specifies the size of this workspace in terms of SYSTEM.LOC.
+    
+         The optarg, initProtection, may contain a single parameter which
+         specifies the initial protection level of the coroutine.
+      *)
+    
+.. index::
+   TRANSFER
+.. code-block:: modula2
+    PROCEDURE TRANSFER (VAR from: COROUTINE; to: COROUTINE);
+      (* Returns the identity of the calling coroutine in from, and
+         transfers control to the coroutine specified by to.
+      *)
+    
+.. index::
+   IOTRANSFER
+.. code-block:: modula2
+    PROCEDURE IOTRANSFER (VAR from: COROUTINE; to: COROUTINE);
+      (* Returns the identity of the calling coroutine in from and
+         transfers control to the coroutine specified by to.  On
+         occurrence of an interrupt, associated with the caller, control
+         is transferred back to the caller, and the identity of the
+         interrupted coroutine is returned in from.  The calling coroutine
+         must be associated with a source of interrupts.
+      *)
+    
+.. index::
+   ATTACH
+.. code-block:: modula2
+    PROCEDURE ATTACH (source: INTERRUPTSOURCE);
+      (* Associates the specified source of interrupts with the calling
+         coroutine. *)
+    
+.. index::
+   DETACH
+.. code-block:: modula2
+    PROCEDURE DETACH (source: INTERRUPTSOURCE);
+      (* Dissociates the specified source of interrupts from the calling
+         coroutine. *)
+    
+.. index::
+   IsATTACHED
+.. code-block:: modula2
+    PROCEDURE IsATTACHED (source: INTERRUPTSOURCE): BOOLEAN;
+      (* Returns TRUE if and only if the specified source of interrupts is
+         currently associated with a coroutine; otherwise returns FALSE.
+      *)
+    
+.. index::
+   HANDLER
+.. code-block:: modula2
+    PROCEDURE HANDLER (source: INTERRUPTSOURCE): COROUTINE;
+      (* Returns the coroutine, if any, that is associated with the source
+         of interrupts. The result is undefined if IsATTACHED(source) =
+         FALSE.
+      *)
+    
+.. index::
+   CURRENT
+.. code-block:: modula2
+    PROCEDURE CURRENT (): COROUTINE;
+      (* Returns the identity of the calling coroutine. *)
+    
+.. index::
+   LISTEN
+.. code-block:: modula2
+    PROCEDURE LISTEN (p: PROTECTION);
+      (* Momentarily changes the protection of the calling coroutine to
+         p. *)
+    
+.. index::
+   PROT
+.. code-block:: modula2
+    PROCEDURE PROT (): PROTECTION;
+      (* Returns the protection of the calling coroutine. *)
+    
+    
+    (*
+       TurnInterrupts - switches processor interrupts to the protection
+                        level, to.  It returns the old value.
+    *)
+    
+.. index::
+   TurnInterrupts
+.. code-block:: modula2
+    PROCEDURE TurnInterrupts (to: PROTECTION) : PROTECTION ;
+    
+    
+    (*
+       ListenLoop - should be called instead of users writing:
+    
+                    LOOP
+                       LISTEN
+                    END
+    
+                    It performs the same function but yields
+                    control back to the underlying operating system.
+                    It also checks for deadlock.
+                    Note that this function does return when an interrupt occurs.
+                    (File descriptor becomes ready or time event expires).
+    *)
+    
+.. index::
+   ListenLoop
+.. code-block:: modula2
+    PROCEDURE ListenLoop ;
+    
+    
+    END COROUTINES.
+
+@c @node gm2-libs-iso/ChanConsts, gm2-libs-iso/CharClass, gm2-libs-iso/COROUTINES, M2 ISO Libraries
+gm2-libs-iso/ChanConsts
+-----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE ChanConsts;
+
+  (* Common types and values for channel open requests and results *)
+    
+    TYPE
+.. index::
+   pair: ChanFlags; (type)
+.. code-block:: modula2
+      ChanFlags =        (* Request flags possibly given when a channel is opened *)
+      ( readFlag,        (* input operations are requested/available *)
+        writeFlag,       (* output operations are requested/available *)
+        oldFlag,         (* a file may/must/did exist before the channel is opened *)
+        textFlag,        (* text operations are requested/available *)
+        rawFlag,         (* raw operations are requested/available *)
+        interactiveFlag, (* interactive use is requested/applies *)
+        echoFlag         (* echoing by interactive device on removal of characters from input
+                            stream requested/applies *)
+      );
+    
+.. index::
+   pair: FlagSet; (type)
+.. code-block:: modula2
+      FlagSet = SET OF ChanFlags;
+    
+      (* Singleton values of FlagSet, to allow for example, read + write *)
+    
+    CONST
+.. index::
+   pair: read; (const)
+.. code-block:: modula2
+      read = FlagSet{readFlag};   (* input operations are requested/available *)
+.. index::
+   pair: write; (const)
+.. code-block:: modula2
+      write = FlagSet{writeFlag}; (* output operations are requested/available *)
+.. index::
+   pair: old; (const)
+.. code-block:: modula2
+      old = FlagSet{oldFlag};     (* a file may/must/did exist before the channel is opened *)
+.. index::
+   pair: text; (const)
+.. code-block:: modula2
+      text = FlagSet{textFlag};   (* text operations are requested/available *)
+.. index::
+   pair: raw; (const)
+.. code-block:: modula2
+      raw = FlagSet{rawFlag};     (* raw operations are requested/available *)
+.. index::
+   pair: interactive; (const)
+.. code-block:: modula2
+      interactive = FlagSet{interactiveFlag}; (* interactive use is requested/applies *)
+.. index::
+   pair: echo; (const)
+.. code-block:: modula2
+      echo = FlagSet{echoFlag};   (* echoing by interactive device on removal of characters from
+                                     input stream requested/applies *)
+    
+    TYPE
+.. index::
+   pair: OpenResults; (type)
+.. code-block:: modula2
+      OpenResults =        (* Possible results of open requests *)
+        (opened,           (* the open succeeded as requested *)
+         wrongNameFormat,  (* given name is in the wrong format for the implementation *)
+         wrongFlags,       (* given flags include a value that does not apply to the device *)
+         tooManyOpen,      (* this device cannot support any more open channels *)
+         outOfChans,       (* no more channels can be allocated *)
+         wrongPermissions, (* file or directory permissions do not allow request *)
+         noRoomOnDevice,   (* storage limits on the device prevent the open *)
+         noSuchFile,       (* a needed file does not exist *)
+         fileExists,       (* a file of the given name already exists when a new one is required *)
+         wrongFileType,    (* the file is of the wrong type to support the required operations *)
+         noTextOperations, (* text operations have been requested, but are not supported *)
+         noRawOperations,  (* raw operations have been requested, but are not supported *)
+         noMixedOperations,(* text and raw operations have been requested, but they
+                              are not supported in combination *)
+         alreadyOpen,      (* the source/destination is already open for operations not supported
+                              in combination with the requested operations *)
+         otherProblem      (* open failed for some other reason *)
+        );
+    
+    END ChanConsts.
+    
+
+@c @node gm2-libs-iso/CharClass, gm2-libs-iso/ClientSocket, gm2-libs-iso/ChanConsts, M2 ISO Libraries
+gm2-libs-iso/CharClass
+----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE CharClass;
+
+  (* Classification of values of the type CHAR *)
+    
+.. index::
+   IsNumeric
+.. code-block:: modula2
+    PROCEDURE IsNumeric (ch: CHAR): BOOLEAN;
+      (* Returns TRUE if and only if ch is classified as a numeric character *)
+    
+.. index::
+   IsLetter
+.. code-block:: modula2
+    PROCEDURE IsLetter (ch: CHAR): BOOLEAN;
+      (* Returns TRUE if and only if ch is classified as a letter *)
+    
+.. index::
+   IsUpper
+.. code-block:: modula2
+    PROCEDURE IsUpper (ch: CHAR): BOOLEAN;
+      (* Returns TRUE if and only if ch is classified as an upper case letter *)
+    
+.. index::
+   IsLower
+.. code-block:: modula2
+    PROCEDURE IsLower (ch: CHAR): BOOLEAN;
+      (* Returns TRUE if and only if ch is classified as a lower case letter *)
+    
+.. index::
+   IsControl
+.. code-block:: modula2
+    PROCEDURE IsControl (ch: CHAR): BOOLEAN;
+      (* Returns TRUE if and only if ch represents a control function *)
+    
+.. index::
+   IsWhiteSpace
+.. code-block:: modula2
+    PROCEDURE IsWhiteSpace (ch: CHAR): BOOLEAN;
+      (* Returns TRUE if and only if ch represents a space character or a format effector *)
+    
+    END CharClass.
+    
+
+@c @node gm2-libs-iso/ClientSocket, gm2-libs-iso/ComplexMath, gm2-libs-iso/CharClass, M2 ISO Libraries
+gm2-libs-iso/ClientSocket
+-------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE ClientSocket ;
+
+    FROM IOChan IMPORT ChanId ;
+    FROM ChanConsts IMPORT FlagSet, OpenResults ;
+    
+    
+    (*
+       OpenSocket - opens a TCP client connection to host:port.
+    *)
+    
+.. index::
+   OpenSocket
+.. code-block:: modula2
+    PROCEDURE OpenSocket (VAR cid: ChanId;
+                          host: ARRAY OF CHAR; port: CARDINAL;
+                          f: FlagSet; VAR res: OpenResults) ;
+    
+    (*
+       Close - if the channel identified by cid is not open to
+               a socket stream, the exception wrongDevice is
+               raised; otherwise closes the channel, and assigns
+               the value identifying the invalid channel to cid.
+    *)
+    
+.. index::
+   Close
+.. code-block:: modula2
+    PROCEDURE Close (VAR cid: ChanId) ;
+    
+    
+    (*
+       IsSocket - tests if the channel identified by cid is open as
+                  a client socket stream.
+    *)
+    
+.. index::
+   IsSocket
+.. code-block:: modula2
+    PROCEDURE IsSocket (cid: ChanId) : BOOLEAN ;
+    
+    
+    END ClientSocket.
+
+@c @node gm2-libs-iso/ComplexMath, gm2-libs-iso/ConvStringLong, gm2-libs-iso/ClientSocket, M2 ISO Libraries
+gm2-libs-iso/ComplexMath
+------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE ComplexMath;
+
+  (* Mathematical functions for the type COMPLEX *)
+    
+    CONST
+.. index::
+   pair: i; (const)
+.. code-block:: modula2
+      i =    CMPLX (0.0, 1.0);
+.. index::
+   pair: one; (const)
+.. code-block:: modula2
+      one =  CMPLX (1.0, 0.0);
+.. index::
+   pair: zero; (const)
+.. code-block:: modula2
+      zero = CMPLX (0.0, 0.0);
+    
+.. index::
+   abs
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ abs (z: COMPLEX): REAL;
+      (* Returns the length of z *)
+    
+.. index::
+   arg
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ arg (z: COMPLEX): REAL;
+      (* Returns the angle that z subtends to the positive real axis *)
+    
+.. index::
+   conj
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ conj (z: COMPLEX): COMPLEX;
+      (* Returns the complex conjugate of z *)
+    
+.. index::
+   power
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ power (base: COMPLEX; exponent: REAL): COMPLEX;
+      (* Returns the value of the number base raised to the power exponent *)
+    
+.. index::
+   sqrt
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sqrt (z: COMPLEX): COMPLEX;
+      (* Returns the principal square root of z *)
+    
+.. index::
+   exp
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ exp (z: COMPLEX): COMPLEX;
+      (* Returns the complex exponential of z *)
+    
+.. index::
+   ln
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ln (z: COMPLEX): COMPLEX;
+      (* Returns the principal value of the natural logarithm of z *)
+    
+.. index::
+   sin
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sin (z: COMPLEX): COMPLEX;
+      (* Returns the sine of z *)
+    
+.. index::
+   cos
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cos (z: COMPLEX): COMPLEX;
+      (* Returns the cosine of z *)
+    
+.. index::
+   tan
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ tan (z: COMPLEX): COMPLEX;
+      (* Returns the tangent of z *)
+    
+.. index::
+   arcsin
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ arcsin (z: COMPLEX): COMPLEX;
+      (* Returns the arcsine of z *)
+    
+.. index::
+   arccos
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ arccos (z: COMPLEX): COMPLEX;
+      (* Returns the arccosine of z *)
+    
+.. index::
+   arctan
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ arctan (z: COMPLEX): COMPLEX;
+      (* Returns the arctangent of z *)
+    
+.. index::
+   polarToComplex
+.. code-block:: modula2
+    PROCEDURE polarToComplex (abs, arg: REAL): COMPLEX;
+      (* Returns the complex number with the specified polar coordinates *)
+    
+.. index::
+   scalarMult
+.. code-block:: modula2
+    PROCEDURE scalarMult (scalar: REAL; z: COMPLEX): COMPLEX;
+      (* Returns the scalar product of scalar with z *)
+    
+.. index::
+   IsCMathException
+.. code-block:: modula2
+    PROCEDURE IsCMathException (): BOOLEAN;
+      (* Returns TRUE if the current coroutine is in the exceptional
+         execution state because of the raising of an exception in a
+         routine from this module; otherwise returns FALSE.
+      *)
+    
+    END ComplexMath.
+    
+
+@c @node gm2-libs-iso/ConvStringLong, gm2-libs-iso/ConvStringReal, gm2-libs-iso/ComplexMath, M2 ISO Libraries
+gm2-libs-iso/ConvStringLong
+---------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE ConvStringLong ;
+
+    FROM DynamicStrings IMPORT String ;
+    
+    
+    (*
+       RealToFloatString - converts a real with, sigFigs, into a string
+                           and returns the result as a string.
+    *)
+    
+.. index::
+   RealToFloatString
+.. code-block:: modula2
+    PROCEDURE RealToFloatString (real: LONGREAL; sigFigs: CARDINAL) : String ;
+    
+    
+    (*
+       RealToEngString - converts the value of real to floating-point
+                         string form, with sigFigs significant figures.
+                         The number is scaled with one to three digits
+                         in the whole number part and with an exponent
+                         that is a multiple of three.
+    *)
+    
+.. index::
+   RealToEngString
+.. code-block:: modula2
+    PROCEDURE RealToEngString (real: LONGREAL; sigFigs: CARDINAL) : String ;
+    
+    
+    (*
+       RealToFixedString - returns the number of characters in the fixed-point
+                           string representation of real rounded to the given
+                           place relative to the decimal point.
+    *)
+    
+.. index::
+   RealToFixedString
+.. code-block:: modula2
+    PROCEDURE RealToFixedString (real: LONGREAL; place: INTEGER) : String ;
+    
+    
+    END ConvStringLong.
+
+@c @node gm2-libs-iso/ConvStringReal, gm2-libs-iso/ConvTypes, gm2-libs-iso/ConvStringLong, M2 ISO Libraries
+gm2-libs-iso/ConvStringReal
+---------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE ConvStringReal ;
+
+    FROM DynamicStrings IMPORT String ;
+    
+    
+    (*
+       RealToFloatString - converts a real with, sigFigs, into a string
+                           and returns the result as a string.
+    *)
+    
+.. index::
+   RealToFloatString
+.. code-block:: modula2
+    PROCEDURE RealToFloatString (real: REAL; sigFigs: CARDINAL) : String ;
+    
+    
+    (*
+       RealToEngString - converts the value of real to floating-point
+                         string form, with sigFigs significant figures.
+                         The number is scaled with one to three digits
+                         in the whole number part and with an exponent
+                         that is a multiple of three.
+    *)
+    
+.. index::
+   RealToEngString
+.. code-block:: modula2
+    PROCEDURE RealToEngString (real: REAL; sigFigs: CARDINAL) : String ;
+    
+    
+    (*
+       RealToFixedString - returns the number of characters in the fixed-point
+                           string representation of real rounded to the given
+                           place relative to the decimal point.
+    *)
+    
+.. index::
+   RealToFixedString
+.. code-block:: modula2
+    PROCEDURE RealToFixedString (real: REAL; place: INTEGER) : String ;
+    
+    
+    END ConvStringReal.
+
+@c @node gm2-libs-iso/ConvTypes, gm2-libs-iso/EXCEPTIONS, gm2-libs-iso/ConvStringReal, M2 ISO Libraries
+gm2-libs-iso/ConvTypes
+----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE ConvTypes;
+
+  (* Common types used in the string conversion modules *)
+    
+    TYPE
+.. index::
+   pair: ConvResults; (type)
+.. code-block:: modula2
+      ConvResults =     (* Values of this type are used to express the format of a string *)
+      (
+        strAllRight,    (* the string format is correct for the corresponding conversion *)
+        strOutOfRange,  (* the string is well-formed but the value cannot be represented *)
+        strWrongFormat, (* the string is in the wrong format for the conversion *)
+        strEmpty        (* the given string is empty *)
+      );
+    
+.. index::
+   pair: ScanClass; (type)
+.. code-block:: modula2
+      ScanClass =  (* Values of this type are used to classify input to finite state scanners *)
+      (
+        padding,   (* a leading or padding character at this point in the scan - ignore it *)
+        valid,     (* a valid character at this point in the scan - accept it *)
+        invalid,   (* an invalid character at this point in the scan - reject it *)
+        terminator (* a terminating character at this point in the scan (not part of token) *)
+      );
+    
+.. index::
+   pair: ScanState; (type)
+.. code-block:: modula2
+      ScanState =  (* The type of lexical scanning control procedures *)
+        PROCEDURE (CHAR, VAR ScanClass, VAR ScanState);
+    
+    END ConvTypes.
+    
+
+@c @node gm2-libs-iso/EXCEPTIONS, gm2-libs-iso/ErrnoCategory, gm2-libs-iso/ConvTypes, M2 ISO Libraries
+gm2-libs-iso/EXCEPTIONS
+-----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE EXCEPTIONS;
+
+(* Provides facilities for raising user exceptions
+   and for making enquiries concerning the current execution state.
+*)
+    
+    TYPE
+      ExceptionSource;   (* values of this type are used within library
+                            modules to identify the source of raised
+                            exceptions *)
+.. index::
+   pair: ExceptionNumber; (type)
+.. code-block:: modula2
+      ExceptionNumber = CARDINAL;
+    
+.. index::
+   AllocateSource
+.. code-block:: modula2
+    PROCEDURE AllocateSource(VAR newSource: ExceptionSource);
+      (* Allocates a unique value of type ExceptionSource *)
+    
+.. index::
+   RAISE
+.. code-block:: modula2
+    PROCEDURE RAISE (source: ExceptionSource;
+                     number: ExceptionNumber; message: ARRAY OF CHAR);
+      (* Associates the given values of source, number and message with
+         the current context and raises an exception.
+      *)
+    
+.. index::
+   CurrentNumber
+.. code-block:: modula2
+    PROCEDURE CurrentNumber (source: ExceptionSource): ExceptionNumber;
+      (* If the current coroutine is in the exceptional execution state
+         because of the raising of an exception from source, returns
+         the corresponding number, and otherwise raises an exception.
+      *)
+    
+.. index::
+   GetMessage
+.. code-block:: modula2
+    PROCEDURE GetMessage (VAR text: ARRAY OF CHAR);
+      (* If the current coroutine is in the exceptional execution state,
+         returns the possibly truncated string associated with the
+         current context.  Otherwise, in normal execution state,
+         returns the empty string.
+      *)
+    
+.. index::
+   IsCurrentSource
+.. code-block:: modula2
+    PROCEDURE IsCurrentSource (source: ExceptionSource): BOOLEAN;
+      (* If the current coroutine is in the exceptional execution state
+         because of the raising of an exception from source, returns
+         TRUE, and otherwise returns FALSE.
+      *)
+    
+.. index::
+   IsExceptionalExecution
+.. code-block:: modula2
+    PROCEDURE IsExceptionalExecution (): BOOLEAN;
+      (* If the current coroutine is in the exceptional execution state
+         because of the raising of an exception, returns TRUE, and
+         otherwise returns FALSE.
+      *)
+    
+    END EXCEPTIONS.
+
+@c @node gm2-libs-iso/ErrnoCategory, gm2-libs-iso/GeneralUserExceptions, gm2-libs-iso/EXCEPTIONS, M2 ISO Libraries
+gm2-libs-iso/ErrnoCategory
+--------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE ErrnoCategory ;
+
+(*
+   provides an interface to errno (if the system
+   supports it) which determines whether the current
+   errno is a hard or soft error.  These distinctions
+   are needed by the ISO Modula-2 libraries.  Not all
+   errno values are tested, only those which could be
+   related to a device.
+*)
+    
+    IMPORT ChanConsts ;
+    
+    
+    (*
+       IsErrnoHard - returns TRUE if the value of errno is associated with
+                     a hard device error.
+    *)
+    
+.. index::
+   IsErrnoHard
+.. code-block:: modula2
+    PROCEDURE IsErrnoHard (e: INTEGER) : BOOLEAN ;
+    
+    
+    (*
+       IsErrnoSoft - returns TRUE if the value of errno is associated with
+                     a soft device error.
+    *)
+    
+.. index::
+   IsErrnoSoft
+.. code-block:: modula2
+    PROCEDURE IsErrnoSoft (e: INTEGER) : BOOLEAN ;
+    
+    
+    (*
+       UnAvailable - returns TRUE if the value of errno indicates that
+                     the resource or device is unavailable for some
+                     reason.
+    *)
+    
+.. index::
+   UnAvailable
+.. code-block:: modula2
+    PROCEDURE UnAvailable (e: INTEGER) : BOOLEAN ;
+    
+    
+    (*
+       GetOpenResults - maps errno onto the ISO Modula-2 enumerated
+                        type, OpenResults.
+    *)
+    
+.. index::
+   GetOpenResults
+.. code-block:: modula2
+    PROCEDURE GetOpenResults (e: INTEGER) : ChanConsts.OpenResults ;
+    
+    
+    END ErrnoCategory.
+
+@c @node gm2-libs-iso/GeneralUserExceptions, gm2-libs-iso/IOChan, gm2-libs-iso/ErrnoCategory, M2 ISO Libraries
+gm2-libs-iso/GeneralUserExceptions
+----------------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE GeneralUserExceptions;
+
+(* Provides facilities for general user-defined exceptions *)
+    
+    TYPE
+.. index::
+   pair: GeneralExceptions; (type)
+.. code-block:: modula2
+      GeneralExceptions = (problem, disaster);
+    
+.. index::
+   RaiseGeneralException
+.. code-block:: modula2
+    PROCEDURE RaiseGeneralException (exception: GeneralExceptions;
+                                     text: ARRAY OF CHAR);
+      (* Raises exception using text as the associated message *)
+    
+.. index::
+   IsGeneralException
+.. code-block:: modula2
+    PROCEDURE IsGeneralException (): BOOLEAN;
+      (* Returns TRUE if the current coroutine is in the exceptional
+         execution state because of the raising of an exception from
+         GeneralExceptions; otherwise returns FALSE.
+      *)
+    
+.. index::
+   GeneralException
+.. code-block:: modula2
+    PROCEDURE GeneralException(): GeneralExceptions;
+      (* If the current coroutine is in the exceptional execution
+         state because of the raising of an exception from
+         GeneralExceptions, returns the corresponding enumeration value,
+         and otherwise raises an exception.
+      *)
+    
+    END GeneralUserExceptions.
+
+@c @node gm2-libs-iso/IOChan, gm2-libs-iso/IOConsts, gm2-libs-iso/GeneralUserExceptions, M2 ISO Libraries
+gm2-libs-iso/IOChan
+-------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE IOChan;
+
+  (* Types and procedures forming the interface to channels for
+     device-independent data transfer modules
+  *)
+    
+    IMPORT IOConsts, ChanConsts, SYSTEM;
+    
+    TYPE
+      ChanId; (* Values of this type are used to identify channels *)
+    
+      (* There is one pre-defined value identifying an invalid channel
+         on which no data transfer operations are available.  It may
+         be used to initialize variables of type ChanId.
+      *)
+    
+.. index::
+   InvalidChan
+.. code-block:: modula2
+    PROCEDURE InvalidChan (): ChanId;
+      (* Returns the value identifying the invalid channel. *)
+    
+      (* For each of the following operations, if the device supports
+         the operation on the channel, the behaviour of the procedure
+         conforms with the description below.  The full behaviour is
+         defined for each device module.  If the device does not
+         support the operation on the channel, the behaviour of the
+         procedure is to raise the exception notAvailable.
+      *)
+    
+      (* Text operations - these perform any required translation between the
+         internal and external representation of text.
+      *)
+    
+.. index::
+   Look
+.. code-block:: modula2
+    PROCEDURE Look (cid: ChanId; VAR ch: CHAR; VAR res: IOConsts.ReadResults);
+      (* If there is a character as the next item in the input stream
+         cid, assigns its value to ch without removing it from the stream;
+         otherwise the value of ch is not defined.  res (and the stored
+         read result) are set to the value allRight, endOfLine, or endOfInput.
+      *)
+    
+.. index::
+   Skip
+.. code-block:: modula2
+    PROCEDURE Skip (cid: ChanId);
+      (* If the input stream cid has ended, the exception skipAtEnd
+         is raised; otherwise the next character or line mark in cid is
+         removed, and the stored read result is set to the value
+         allRight.
+      *)
+    
+.. index::
+   SkipLook
+.. code-block:: modula2
+    PROCEDURE SkipLook (cid: ChanId; VAR ch: CHAR; VAR res: IOConsts.ReadResults);
+      (* If the input stream cid has ended, the exception skipAtEnd is
+         raised; otherwise the next character or line mark in cid is
+         removed.  If there is a character as the next item in cid
+         stream, assigns its value to ch without removing it from the
+         stream.  Otherwise, the value of ch is not defined.  res
+         (and the stored read result) are set to the value allRight,
+         endOfLine, or endOfInput.
+      *)
+    
+.. index::
+   WriteLn
+.. code-block:: modula2
+    PROCEDURE WriteLn (cid: ChanId);
+      (* Writes a line mark over the channel cid. *)
+    
+.. index::
+   TextRead
+.. code-block:: modula2
+    PROCEDURE TextRead (cid: ChanId; to: SYSTEM.ADDRESS; maxChars: CARDINAL;
+                        VAR charsRead: CARDINAL);
+      (* Reads at most maxChars characters from the current line in cid,
+         and assigns corresponding values to successive components of
+         an ARRAY OF CHAR variable for which the address of the first
+         component is to. The number of characters read is assigned to charsRead.
+         The stored read result is set to allRight, endOfLine, or endOfInput.
+      *)
+    
+.. index::
+   TextWrite
+.. code-block:: modula2
+    PROCEDURE TextWrite (cid: ChanId; from: SYSTEM.ADDRESS;
+                         charsToWrite: CARDINAL);
+      (* Writes a number of characters given by the value of charsToWrite,
+         from successive components of an ARRAY OF CHAR variable for which
+         the address of the first component is from, to the channel cid.
+      *)
+    
+      (* Direct raw operations  - these do not effect translation between
+         the internal and external representation of data
+      *)
+    
+.. index::
+   RawRead
+.. code-block:: modula2
+    PROCEDURE RawRead (cid: ChanId; to: SYSTEM.ADDRESS; maxLocs: CARDINAL;
+                       VAR locsRead: CARDINAL);
+      (* Reads at most maxLocs items from cid, and assigns corresponding
+         values to successive components of an ARRAY OF LOC variable for
+         which the address of the first component is to. The number of
+         characters read is assigned to charsRead. The stored read result
+         is set to the value allRight, or endOfInput.
+      *)
+    
+.. index::
+   RawWrite
+.. code-block:: modula2
+    PROCEDURE RawWrite (cid: ChanId; from: SYSTEM.ADDRESS; locsToWrite: CARDINAL);
+      (* Writes a number of items given by the value of charsToWrite,
+         from successive components of an ARRAY OF LOC variable for
+         which the address of the first component is from, to the channel cid.
+      *)
+    
+      (* Common operations *)
+    
+.. index::
+   GetName
+.. code-block:: modula2
+    PROCEDURE GetName (cid: ChanId; VAR s: ARRAY OF CHAR);
+      (* Copies to s a name associated with the channel cid, possibly truncated
+         (depending on the capacity of s).
+      *)
+    
+.. index::
+   Reset
+.. code-block:: modula2
+    PROCEDURE Reset (cid: ChanId);
+      (* Resets the channel cid to a state defined by the device module. *)
+    
+.. index::
+   Flush
+.. code-block:: modula2
+    PROCEDURE Flush (cid: ChanId);
+      (* Flushes any data buffered by the device module out to the channel cid. *)
+    
+      (* Access to read results *)
+    
+.. index::
+   SetReadResult
+.. code-block:: modula2
+    PROCEDURE SetReadResult (cid: ChanId; res: IOConsts.ReadResults);
+      (* Sets the read result value for the channel cid to the value res. *)
+    
+.. index::
+   ReadResult
+.. code-block:: modula2
+    PROCEDURE ReadResult (cid: ChanId): IOConsts.ReadResults;
+      (* Returns the stored read result value for the channel cid.
+         (This is initially the value notKnown).
+      *)
+    
+      (* Users can discover which flags actually apply to a channel *)
+    
+.. index::
+   CurrentFlags
+.. code-block:: modula2
+    PROCEDURE CurrentFlags (cid: ChanId): ChanConsts.FlagSet;
+      (* Returns the set of flags that currently apply to the channel cid. *)
+    
+      (* The following exceptions are defined for this module and its clients *)
+    
+    TYPE
+.. index::
+   pair: ChanExceptions; (type)
+.. code-block:: modula2
+      ChanExceptions =
+        (wrongDevice,      (* device specific operation on wrong device *)
+         notAvailable,     (* operation attempted that is not available on that
+                              channel *)
+         skipAtEnd,        (* attempt to skip data from a stream that has ended *)
+         softDeviceError,  (* device specific recoverable error *)
+         hardDeviceError,  (* device specific non-recoverable error *)
+         textParseError,   (* input data does not correspond to a character or
+                              line mark - optional detection *)
+         notAChannel       (* given value does not identify a channel -
+                              optional detection *)
+        );
+    
+.. index::
+   IsChanException
+.. code-block:: modula2
+    PROCEDURE IsChanException (): BOOLEAN;
+      (* Returns TRUE if the current coroutine is in the exceptional
+         execution state because of the raising of an exception from
+         ChanExceptions; otherwise returns FALSE.
+      *)
+    
+.. index::
+   ChanException
+.. code-block:: modula2
+    PROCEDURE ChanException (): ChanExceptions;
+      (* If the current coroutine is in the exceptional execution state
+         because of the raising of an exception from ChanExceptions,
+         returns the corresponding enumeration value, and otherwise
+         raises an exception.
+      *)
+    
+      (* When a device procedure detects a device error, it raises the
+         exception softDeviceError or hardDeviceError.  If these
+         exceptions are handled, the following facilities may be
+         used to discover an implementation-defined error number for
+         the channel.
+      *)
+    
+    TYPE
+.. index::
+   pair: DeviceErrNum; (type)
+.. code-block:: modula2
+      DeviceErrNum = INTEGER;
+    
+.. index::
+   DeviceError
+.. code-block:: modula2
+    PROCEDURE DeviceError (cid: ChanId): DeviceErrNum;
+      (* If a device error exception has been raised for the channel cid,
+         returns the error number stored by the device module.
+      *)
+    
+    END IOChan.
+
+@c @node gm2-libs-iso/IOConsts, gm2-libs-iso/IOLink, gm2-libs-iso/IOChan, M2 ISO Libraries
+gm2-libs-iso/IOConsts
+---------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE IOConsts;
+
+  (* Types and constants for input/output modules *)
+    
+    TYPE
+.. index::
+   pair: ReadResults; (type)
+.. code-block:: modula2
+      ReadResults =  (* This type is used to classify the result of an input operation *)
+      (
+        notKnown,    (* no read result is set *)
+        allRight,    (* data is as expected or as required *)
+        outOfRange,  (* data cannot be represented *)
+        wrongFormat, (* data not in expected format *)
+        endOfLine,   (* end of line seen before expected data *)
+        endOfInput   (* end of input seen before expected data *)
+      );
+    
+    END IOConsts.
+    
+
+@c @node gm2-libs-iso/IOLink, gm2-libs-iso/IOResult, gm2-libs-iso/IOConsts, M2 ISO Libraries
+gm2-libs-iso/IOLink
+-------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE IOLink;
+
+(* Types and procedures for the standard implementation of channels *)
+    
+    IMPORT IOChan, IOConsts, ChanConsts, SYSTEM;
+    
+    TYPE
+      DeviceId;
+        (* Values of this type are used to identify new device modules,
+           and are normally obtained by them during their initialization.
+        *)
+    
+.. index::
+   AllocateDeviceId
+.. code-block:: modula2
+    PROCEDURE AllocateDeviceId (VAR did: DeviceId);
+      (* Allocates a unique value of type DeviceId, and assigns this
+         value to did. *)
+    
+.. index::
+   MakeChan
+.. code-block:: modula2
+    PROCEDURE MakeChan (did: DeviceId; VAR cid: IOChan.ChanId);
+      (* Attempts to make a new channel for the device module identified
+         by did. If no more channels can be made, the identity of
+         the invalid channel is assigned to cid.  Otherwise, the identity
+         of a new channel is assigned to cid.
+      *)
+    
+.. index::
+   UnMakeChan
+.. code-block:: modula2
+    PROCEDURE UnMakeChan (did: DeviceId; VAR cid: IOChan.ChanId);
+      (* If the device module identified by did is not the module that
+         made the channel identified by cid, the exception wrongDevice is
+         raised; otherwise the channel is deallocated, and the value
+         identifying the invalid channel is assigned to cid.
+      *)
+    
+    TYPE
+.. index::
+   pair: DeviceTablePtr; (type)
+.. code-block:: modula2
+      DeviceTablePtr = POINTER TO DeviceTable;
+        (* Values of this type are used to refer to device tables *)
+    
+    TYPE
+.. index::
+   pair: LookProc; (type)
+.. code-block:: modula2
+      LookProc      = PROCEDURE (DeviceTablePtr, VAR CHAR, VAR IOConsts.ReadResults) ;
+.. index::
+   pair: SkipProc; (type)
+.. code-block:: modula2
+      SkipProc      = PROCEDURE (DeviceTablePtr) ;
+.. index::
+   pair: SkipLookProc; (type)
+.. code-block:: modula2
+      SkipLookProc  = PROCEDURE (DeviceTablePtr, VAR CHAR, VAR IOConsts.ReadResults) ;
+.. index::
+   pair: WriteLnProc; (type)
+.. code-block:: modula2
+      WriteLnProc   = PROCEDURE (DeviceTablePtr) ;
+.. index::
+   pair: TextReadProc; (type)
+.. code-block:: modula2
+      TextReadProc  = PROCEDURE (DeviceTablePtr, SYSTEM.ADDRESS, CARDINAL, VAR CARDINAL) ;
+.. index::
+   pair: TextWriteProc; (type)
+.. code-block:: modula2
+      TextWriteProc = PROCEDURE (DeviceTablePtr, SYSTEM.ADDRESS, CARDINAL) ;
+.. index::
+   pair: RawReadProc; (type)
+.. code-block:: modula2
+      RawReadProc   = PROCEDURE (DeviceTablePtr, SYSTEM.ADDRESS, CARDINAL, VAR CARDINAL) ;
+.. index::
+   pair: RawWriteProc; (type)
+.. code-block:: modula2
+      RawWriteProc  = PROCEDURE (DeviceTablePtr, SYSTEM.ADDRESS, CARDINAL) ;
+.. index::
+   pair: GetNameProc; (type)
+.. code-block:: modula2
+      GetNameProc   = PROCEDURE (DeviceTablePtr, VAR ARRAY OF CHAR) ;
+.. index::
+   pair: ResetProc; (type)
+.. code-block:: modula2
+      ResetProc     = PROCEDURE (DeviceTablePtr) ;
+.. index::
+   pair: FlushProc; (type)
+.. code-block:: modula2
+      FlushProc     = PROCEDURE (DeviceTablePtr) ;
+.. index::
+   pair: FreeProc; (type)
+.. code-block:: modula2
+      FreeProc      = PROCEDURE (DeviceTablePtr) ;
+         (* Carry out the operations involved in closing the corresponding
+            channel, including flushing buffers, but do not unmake the
+            channel.
+         *)
+    
+    
+    TYPE
+.. index::
+   pair: DeviceData; (type)
+.. code-block:: modula2
+      DeviceData = SYSTEM.ADDRESS;
+    
+.. index::
+   pair: DeviceTable; (type)
+.. code-block:: modula2
+      DeviceTable =
+        RECORD                         (* Initialized by MakeChan to: *)
+          cd: DeviceData;              (* the value NIL *)
+          did: DeviceId;               (* the value given in the call of MakeChan *)
+          cid: IOChan.ChanId;          (* the identity of the channel *)
+          result: IOConsts.ReadResults;(* the value notKnown *)
+          errNum: IOChan.DeviceErrNum; (* undefined *)
+          flags: ChanConsts.FlagSet;   (* ChanConsts.FlagSet{} *)
+          doLook: LookProc;            (* raise exception notAvailable *)
+          doSkip: SkipProc;            (* raise exception notAvailable *)
+          doSkipLook: SkipLookProc;    (* raise exception notAvailable *)
+          doLnWrite: WriteLnProc;      (* raise exception notAvailable *)
+          doTextRead: TextReadProc;    (* raise exception notAvailable *)
+          doTextWrite: TextWriteProc;  (* raise exception notAvailable *)
+          doRawRead: RawReadProc;      (* raise exception notAvailable *)
+          doRawWrite: RawWriteProc;    (* raise exception notAvailable *)
+          doGetName: GetNameProc;      (* return the empty string *)
+          doReset: ResetProc;          (* do nothing *)
+          doFlush: FlushProc;          (* do nothing *)
+          doFree: FreeProc;            (* do nothing *)
+        END;
+    
+    
+      (* The pointer to the device table for a channel is obtained using the
+         following procedure: *)
+    
+    (*
+       If the device module identified by did is not the module that made
+       the channel identified by cid, the exception wrongDevice is raised.
+    *)
+    
+.. index::
+   DeviceTablePtrValue
+.. code-block:: modula2
+    PROCEDURE DeviceTablePtrValue (cid: IOChan.ChanId; did: DeviceId): DeviceTablePtr;
+    
+    
+    (*
+       Tests if the device module identified by did is the module
+       that made the channel identified by cid.
+    *)
+    
+.. index::
+   IsDevice
+.. code-block:: modula2
+    PROCEDURE IsDevice (cid: IOChan.ChanId; did: DeviceId) : BOOLEAN;
+    
+    
+    TYPE
+.. index::
+   pair: DevExceptionRange; (type)
+.. code-block:: modula2
+      DevExceptionRange = IOChan.ChanExceptions;
+    
+    (*
+      ISO standard states defines
+    
+      DevExceptionRange = [IOChan.notAvailable ..  IOChan.textParseError];
+    
+      however this must be a bug as other modules need to raise
+      IOChan.wrongDevice exceptions.
+    *)
+    
+.. index::
+   RAISEdevException
+.. code-block:: modula2
+    PROCEDURE RAISEdevException (cid: IOChan.ChanId; did: DeviceId;
+                                 x: DevExceptionRange; s: ARRAY OF CHAR);
+    
+      (* If the device module identified by did is not the module that made the channel
+         identified by cid, the exception wrongDevice is raised; otherwise the given exception
+         is raised, and the string value in s is included in the exception message.
+      *)
+    
+.. index::
+   IsIOException
+.. code-block:: modula2
+    PROCEDURE IsIOException () : BOOLEAN;
+      (* Returns TRUE if the current coroutine is in the exceptional execution state
+         because of the raising af an exception from ChanExceptions;
+         otherwise FALSE.
+      *)
+    
+.. index::
+   IOException
+.. code-block:: modula2
+    PROCEDURE IOException () : IOChan.ChanExceptions;
+      (* If the current coroutine is in the exceptional execution state because of the
+         raising af an exception from ChanExceptions, returns the corresponding
+         enumeration value, and otherwise raises an exception.
+      *)
+    
+    END IOLink.
+
+@c @node gm2-libs-iso/IOResult, gm2-libs-iso/LongComplexMath, gm2-libs-iso/IOLink, M2 ISO Libraries
+gm2-libs-iso/IOResult
+---------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE IOResult;
+
+  (* Read results for specified channels *)
+    
+    IMPORT IOConsts, IOChan;
+    
+    TYPE
+.. index::
+   pair: ReadResults; (type)
+.. code-block:: modula2
+      ReadResults = IOConsts.ReadResults;
+    
+      (*
+.. index::
+   pair: ReadResults; (type)
+.. code-block:: modula2
+        ReadResults =  (* This type is used to classify the result of an input operation *)
+        (
+          notKnown,    (* no read result is set *)
+          allRight,    (* data is as expected or as required *)
+          outOfRange,  (* data cannot be represented *)
+          wrongFormat, (* data not in expected format *)
+          endOfLine,   (* end of line seen before expected data *)
+          endOfInput   (* end of input seen before expected data *)
+        );
+      *)
+    
+.. index::
+   ReadResult
+.. code-block:: modula2
+    PROCEDURE ReadResult (cid: IOChan.ChanId): ReadResults;
+      (* Returns the result for the last read operation on the channel cid. *)
+    
+    END IOResult.
+    
+
+@c @node gm2-libs-iso/LongComplexMath, gm2-libs-iso/LongConv, gm2-libs-iso/IOResult, M2 ISO Libraries
+gm2-libs-iso/LongComplexMath
+----------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE LongComplexMath;
+
+  (* Mathematical functions for the type LONGCOMPLEX *)
+    
+    CONST
+.. index::
+   pair: i; (const)
+.. code-block:: modula2
+      i =    CMPLX (0.0, 1.0);
+.. index::
+   pair: one; (const)
+.. code-block:: modula2
+      one =  CMPLX (1.0, 0.0);
+.. index::
+   pair: zero; (const)
+.. code-block:: modula2
+      zero = CMPLX (0.0, 0.0);
+    
+.. index::
+   abs
+.. code-block:: modula2
+    PROCEDURE abs (z: LONGCOMPLEX): LONGREAL;
+      (* Returns the length of z *)
+    
+.. index::
+   arg
+.. code-block:: modula2
+    PROCEDURE arg (z: LONGCOMPLEX): LONGREAL;
+      (* Returns the angle that z subtends to the positive real axis *)
+    
+.. index::
+   conj
+.. code-block:: modula2
+    PROCEDURE conj (z: LONGCOMPLEX): LONGCOMPLEX;
+      (* Returns the complex conjugate of z *)
+    
+.. index::
+   power
+.. code-block:: modula2
+    PROCEDURE power (base: LONGCOMPLEX; exponent: LONGREAL): LONGCOMPLEX;
+      (* Returns the value of the number base raised to the power exponent *)
+    
+.. index::
+   sqrt
+.. code-block:: modula2
+    PROCEDURE sqrt (z: LONGCOMPLEX): LONGCOMPLEX;
+      (* Returns the principal square root of z *)
+    
+.. index::
+   exp
+.. code-block:: modula2
+    PROCEDURE exp (z: LONGCOMPLEX): LONGCOMPLEX;
+      (* Returns the complex exponential of z *)
+    
+.. index::
+   ln
+.. code-block:: modula2
+    PROCEDURE ln (z: LONGCOMPLEX): LONGCOMPLEX;
+      (* Returns the principal value of the natural logarithm of z *)
+    
+.. index::
+   sin
+.. code-block:: modula2
+    PROCEDURE sin (z: LONGCOMPLEX): LONGCOMPLEX;
+      (* Returns the sine of z *)
+    
+.. index::
+   cos
+.. code-block:: modula2
+    PROCEDURE cos (z: LONGCOMPLEX): LONGCOMPLEX;
+      (* Returns the cosine of z *)
+    
+.. index::
+   tan
+.. code-block:: modula2
+    PROCEDURE tan (z: LONGCOMPLEX): LONGCOMPLEX;
+      (* Returns the tangent of z *)
+    
+.. index::
+   arcsin
+.. code-block:: modula2
+    PROCEDURE arcsin (z: LONGCOMPLEX): LONGCOMPLEX;
+      (* Returns the arcsine of z *)
+    
+.. index::
+   arccos
+.. code-block:: modula2
+    PROCEDURE arccos (z: LONGCOMPLEX): LONGCOMPLEX;
+      (* Returns the arccosine of z *)
+    
+.. index::
+   arctan
+.. code-block:: modula2
+    PROCEDURE arctan (z: LONGCOMPLEX): LONGCOMPLEX;
+      (* Returns the arctangent of z *)
+    
+.. index::
+   polarToComplex
+.. code-block:: modula2
+    PROCEDURE polarToComplex (abs, arg: LONGREAL): LONGCOMPLEX;
+      (* Returns the complex number with the specified polar coordinates *)
+    
+.. index::
+   scalarMult
+.. code-block:: modula2
+    PROCEDURE scalarMult (scalar: LONGREAL; z: LONGCOMPLEX): LONGCOMPLEX;
+      (* Returns the scalar product of scalar with z *)
+    
+.. index::
+   IsCMathException
+.. code-block:: modula2
+    PROCEDURE IsCMathException (): BOOLEAN;
+      (* Returns TRUE if the current coroutine is in the exceptional execution state
+         because of the raising of an exception in a routine from this module; otherwise
+         returns FALSE.
+      *)
+    
+    END LongComplexMath.
+    
+
+@c @node gm2-libs-iso/LongConv, gm2-libs-iso/LongIO, gm2-libs-iso/LongComplexMath, M2 ISO Libraries
+gm2-libs-iso/LongConv
+---------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE LongConv;
+
+  (* Low-level LONGREAL/string conversions *)
+    
+    IMPORT
+      ConvTypes;
+    
+    TYPE
+.. index::
+   pair: ConvResults; (type)
+.. code-block:: modula2
+      ConvResults = ConvTypes.ConvResults; (* strAllRight, strOutOfRange,
+                                              strWrongFormat, strEmpty *)
+    
+.. index::
+   ScanReal
+.. code-block:: modula2
+    PROCEDURE ScanReal (inputCh: CHAR; VAR chClass: ConvTypes.ScanClass;
+                        VAR nextState: ConvTypes.ScanState);
+      (* Represents the start state of a finite state scanner for real
+         numbers - assigns class of inputCh to chClass and a procedure
+         representing the next state to nextState.
+      *)
+    
+.. index::
+   FormatReal
+.. code-block:: modula2
+    PROCEDURE FormatReal (str: ARRAY OF CHAR): ConvResults;
+      (* Returns the format of the string value for conversion to LONGREAL. *)
+    
+.. index::
+   ValueReal
+.. code-block:: modula2
+    PROCEDURE ValueReal (str: ARRAY OF CHAR): LONGREAL;
+      (* Returns the value corresponding to the real number string value
+         str if str is well-formed; otherwise raises the LongConv exception.
+      *)
+    
+.. index::
+   LengthFloatReal
+.. code-block:: modula2
+    PROCEDURE LengthFloatReal (real: LONGREAL; sigFigs: CARDINAL): CARDINAL;
+      (* Returns the number of characters in the floating-point string
+         representation of real with sigFigs significant figures.
+      *)
+    
+.. index::
+   LengthEngReal
+.. code-block:: modula2
+    PROCEDURE LengthEngReal (real: LONGREAL; sigFigs: CARDINAL): CARDINAL;
+      (* Returns the number of characters in the floating-point engineering
+         string representation of real with sigFigs significant figures.
+      *)
+    
+.. index::
+   LengthFixedReal
+.. code-block:: modula2
+    PROCEDURE LengthFixedReal (real: LONGREAL; place: INTEGER): CARDINAL;
+      (* Returns the number of characters in the fixed-point string
+         representation of real rounded to the given place relative to the
+         decimal point.
+      *)
+    
+.. index::
+   IsRConvException
+.. code-block:: modula2
+    PROCEDURE IsRConvException (): BOOLEAN;
+      (* Returns TRUE if the current coroutine is in the exceptional
+         execution state because of the raising of an exception in a
+         routine from this module; otherwise returns FALSE.
+      *)
+    
+    END LongConv.
+    
+
+@c @node gm2-libs-iso/LongIO, gm2-libs-iso/LongMath, gm2-libs-iso/LongConv, M2 ISO Libraries
+gm2-libs-iso/LongIO
+-------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE LongIO;
+
+  (* Input and output of long real numbers in decimal text form
+     over specified channels.  The read result is of the type
+     IOConsts.ReadResults.
+  *)
+    
+    IMPORT IOChan;
+    
+      (* The text form of a signed fixed-point real number is
+           ["+" | "-"], decimal digit, {decimal digit}, [".",
+           {decimal digit}]
+    
+         The text form of a signed floating-point real number is
+           signed fixed-point real number,
+           "E", ["+" | "-"], decimal digit, {decimal digit}
+      *)
+    
+.. index::
+   ReadReal
+.. code-block:: modula2
+    PROCEDURE ReadReal (cid: IOChan.ChanId; VAR real: LONGREAL);
+      (* Skips leading spaces, and removes any remaining characters
+         from cid that form part of a signed fixed or floating
+         point number.  The value of this number is assigned to real.
+         The read result is set to the value allRight, outOfRange,
+         wrongFormat, endOfLine, or endOfInput.
+      *)
+    
+.. index::
+   WriteFloat
+.. code-block:: modula2
+    PROCEDURE WriteFloat (cid: IOChan.ChanId; real: LONGREAL;
+                          sigFigs: CARDINAL; width: CARDINAL);
+      (* Writes the value of real to cid in floating-point text form,
+         with sigFigs significant figures, in a field of the given
+         minimum width.
+      *)
+    
+.. index::
+   WriteEng
+.. code-block:: modula2
+    PROCEDURE WriteEng (cid: IOChan.ChanId; real: LONGREAL;
+                        sigFigs: CARDINAL; width: CARDINAL);
+      (* As for WriteFloat, except that the number is scaled with
+         one to three digits in the whole number part, and with an
+         exponent that is a multiple of three.
+      *)
+    
+.. index::
+   WriteFixed
+.. code-block:: modula2
+    PROCEDURE WriteFixed (cid: IOChan.ChanId; real: LONGREAL;
+                          place: INTEGER; width: CARDINAL);
+      (* Writes the value of real to cid in fixed-point text form,
+         rounded to the given place relative to the decimal point,
+         in a field of the given minimum width.
+      *)
+    
+.. index::
+   WriteReal
+.. code-block:: modula2
+    PROCEDURE WriteReal (cid: IOChan.ChanId; real: LONGREAL;
+                         width: CARDINAL);
+      (* Writes the value of real to cid, as WriteFixed if the
+         sign and magnitude can be shown in the given width, or
+         otherwise as WriteFloat.  The number of places or
+         significant digits depends on the given width.
+      *)
+    
+    END LongIO.
+    
+
+@c @node gm2-libs-iso/LongMath, gm2-libs-iso/LongStr, gm2-libs-iso/LongIO, M2 ISO Libraries
+gm2-libs-iso/LongMath
+---------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE LongMath;
+
+  (* Mathematical functions for the type LONGREAL *)
+    
+    CONST
+.. index::
+   pair: pi; (const)
+.. code-block:: modula2
+      pi   = 3.1415926535897932384626433832795028841972;
+.. index::
+   pair: exp1; (const)
+.. code-block:: modula2
+      exp1 = 2.7182818284590452353602874713526624977572;
+    
+.. index::
+   sqrt
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sqrt (x: LONGREAL): LONGREAL;
+      (* Returns the positive square root of x *)
+    
+.. index::
+   exp
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ exp (x: LONGREAL): LONGREAL;
+      (* Returns the exponential of x *)
+    
+.. index::
+   ln
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ln (x: LONGREAL): LONGREAL;
+      (* Returns the natural logarithm of x *)
+    
+      (* The angle in all trigonometric functions is measured in radians *)
+    
+.. index::
+   sin
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sin (x: LONGREAL): LONGREAL;
+      (* Returns the sine of x *)
+    
+.. index::
+   cos
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cos (x: LONGREAL): LONGREAL;
+      (* Returns the cosine of x *)
+    
+.. index::
+   tan
+.. code-block:: modula2
+    PROCEDURE tan (x: LONGREAL): LONGREAL;
+      (* Returns the tangent of x *)
+    
+.. index::
+   arcsin
+.. code-block:: modula2
+    PROCEDURE arcsin (x: LONGREAL): LONGREAL;
+      (* Returns the arcsine of x *)
+    
+.. index::
+   arccos
+.. code-block:: modula2
+    PROCEDURE arccos (x: LONGREAL): LONGREAL;
+      (* Returns the arccosine of x *)
+    
+.. index::
+   arctan
+.. code-block:: modula2
+    PROCEDURE arctan (x: LONGREAL): LONGREAL;
+      (* Returns the arctangent of x *)
+    
+.. index::
+   power
+.. code-block:: modula2
+    PROCEDURE power (base, exponent: LONGREAL): LONGREAL;
+      (* Returns the value of the number base raised to the power exponent *)
+    
+.. index::
+   round
+.. code-block:: modula2
+    PROCEDURE round (x: LONGREAL): INTEGER;
+      (* Returns the value of x rounded to the nearest integer *)
+    
+.. index::
+   IsRMathException
+.. code-block:: modula2
+    PROCEDURE IsRMathException (): BOOLEAN;
+      (* Returns TRUE if the current coroutine is in the exceptional
+         execution state because of the raising of an exception in a
+         routine from this module; otherwise returns FALSE.
+      *)
+    
+    END LongMath.
+    
+
+@c @node gm2-libs-iso/LongStr, gm2-libs-iso/LongWholeIO, gm2-libs-iso/LongMath, M2 ISO Libraries
+gm2-libs-iso/LongStr
+--------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE LongStr;
+
+  (* LONGREAL/string conversions *)
+    
+    IMPORT
+       ConvTypes;
+    
+    TYPE
+       (* strAllRight, strOutOfRange, strWrongFormat, strEmpty *)
+.. index::
+   pair: ConvResults; (type)
+.. code-block:: modula2
+       ConvResults = ConvTypes.ConvResults;
+    
+    (* the string form of a signed fixed-point real number is
+         ["+" | "-"], decimal digit, {decimal digit}, [".",
+         {decimal digit}]
+    *)
+    
+    (* the string form of a signed floating-point real number is
+         signed fixed-point real number, "E", ["+" | "-"],
+         decimal digit, {decimal digit}
+    *)
+    
+.. index::
+   StrToReal
+.. code-block:: modula2
+    PROCEDURE StrToReal (str: ARRAY OF CHAR; VAR real: LONGREAL;
+                         VAR res: ConvResults);
+      (* Ignores any leading spaces in str. If the subsequent characters
+         in str are in the format of a signed real number, assigns a
+         corresponding value to real.  Assigns a value indicating the
+         format of str to res.
+      *)
+    
+.. index::
+   RealToFloat
+.. code-block:: modula2
+    PROCEDURE RealToFloat (real: LONGREAL; sigFigs: CARDINAL;
+                           VAR str: ARRAY OF CHAR);
+      (* Converts the value of real to floating-point string form, with
+         sigFigs significant figures, and copies the possibly truncated
+         result to str.
+      *)
+    
+.. index::
+   RealToEng
+.. code-block:: modula2
+    PROCEDURE RealToEng (real: LONGREAL; sigFigs: CARDINAL;
+                         VAR str: ARRAY OF CHAR);
+      (* Converts the value of real to floating-point string form, with
+         sigFigs significant figures, and copies the possibly truncated
+         result to str. The number is scaled with one to three digits
+         in the whole number part and with an exponent that is a
+         multiple of three.
+      *)
+    
+.. index::
+   RealToFixed
+.. code-block:: modula2
+    PROCEDURE RealToFixed (real: LONGREAL; place: INTEGER;
+                           VAR str: ARRAY OF CHAR);
+      (* Converts the value of real to fixed-point string form, rounded
+         to the given place relative to the decimal point, and copies
+         the possibly truncated result to str.
+      *)
+    
+.. index::
+   RealToStr
+.. code-block:: modula2
+    PROCEDURE RealToStr (real: LONGREAL; VAR str: ARRAY OF CHAR);
+      (* Converts the value of real as RealToFixed if the sign and
+         magnitude can be shown within the capacity of str, or
+         otherwise as RealToFloat, and copies the possibly truncated
+         result to str. The number of places or significant digits
+         depend on the capacity of str.
+      *)
+    
+    END LongStr.
+    
+
+@c @node gm2-libs-iso/LongWholeIO, gm2-libs-iso/LowLong, gm2-libs-iso/LongStr, M2 ISO Libraries
+gm2-libs-iso/LongWholeIO
+------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE LongWholeIO;
+
+  (* Input and output of whole numbers in decimal text form
+     over specified channels.  The read result is of the
+     type IOConsts.ReadResults.
+  *)
+    
+    IMPORT IOChan;
+    
+      (* The text form of a signed whole number is
+           ["+" | "-"], decimal digit, {decimal digit}
+    
+         The text form of an unsigned whole number is
+           decimal digit, {decimal digit}
+      *)
+    
+.. index::
+   ReadInt
+.. code-block:: modula2
+    PROCEDURE ReadInt (cid: IOChan.ChanId; VAR int: LONGINT);
+      (* Skips leading spaces, and removes any remaining characters
+         from cid that form part of a signed whole number.  The
+         value of this number is assigned to int.  The read result
+         is set to the value allRight, outOfRange, wrongFormat,
+         endOfLine, or endOfInput.
+      *)
+    
+.. index::
+   WriteInt
+.. code-block:: modula2
+    PROCEDURE WriteInt (cid: IOChan.ChanId; int: LONGINT;
+                        width: CARDINAL);
+      (* Writes the value of int to cid in text form, in a field of
+         the given minimum width. *)
+    
+.. index::
+   ReadCard
+.. code-block:: modula2
+    PROCEDURE ReadCard (cid: IOChan.ChanId; VAR card: LONGCARD);
+      (* Skips leading spaces, and removes any remaining characters
+         from cid that form part of an unsigned whole number.  The
+         value of this number is assigned to card. The read result
+         is set to the value allRight, outOfRange, wrongFormat,
+         endOfLine, or endOfInput.
+      *)
+    
+.. index::
+   WriteCard
+.. code-block:: modula2
+    PROCEDURE WriteCard (cid: IOChan.ChanId; card: LONGCARD;
+                         width: CARDINAL);
+      (* Writes the value of card to cid in text form, in a field
+         of the given minimum width. *)
+    
+    END LongWholeIO.
+
+@c @node gm2-libs-iso/LowLong, gm2-libs-iso/LowReal, gm2-libs-iso/LongWholeIO, M2 ISO Libraries
+gm2-libs-iso/LowLong
+--------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE LowLong;
+
+  (* Access to underlying properties of the type LONGREAL *)
+    
+    CONST
+.. index::
+   pair: radix; (const)
+.. code-block:: modula2
+      radix      = __ATTRIBUTE__ __BUILTIN__ (( <LONGREAL, radix> )) ;      (* ZType *)
+.. index::
+   pair: places; (const)
+.. code-block:: modula2
+      places     = __ATTRIBUTE__ __BUILTIN__ (( <LONGREAL, places> )) ;     (* ZType *)
+.. index::
+   pair: expoMin; (const)
+.. code-block:: modula2
+      expoMin    = __ATTRIBUTE__ __BUILTIN__ (( <LONGREAL, expoMin> )) ;    (* ZType *)
+.. index::
+   pair: expoMax; (const)
+.. code-block:: modula2
+      expoMax    = __ATTRIBUTE__ __BUILTIN__ (( <LONGREAL, expoMax> )) ;    (* ZType *)
+.. index::
+   pair: large; (const)
+.. code-block:: modula2
+      large      = __ATTRIBUTE__ __BUILTIN__ (( <LONGREAL, large> )) ;      (* RType *)
+.. index::
+   pair: small; (const)
+.. code-block:: modula2
+      small      = __ATTRIBUTE__ __BUILTIN__ (( <LONGREAL, small> )) ;      (* RType *)
+.. index::
+   pair: IEC559; (const)
+.. code-block:: modula2
+      IEC559     = __ATTRIBUTE__ __BUILTIN__ (( <LONGREAL, IEC559> )) ;     (* BOOLEAN *)
+.. index::
+   pair: LIA1; (const)
+.. code-block:: modula2
+      LIA1       = __ATTRIBUTE__ __BUILTIN__ (( <LONGREAL, LIA1> )) ;       (* BOOLEAN *)
+.. index::
+   pair: ISO; (const)
+.. code-block:: modula2
+      ISO        = __ATTRIBUTE__ __BUILTIN__ (( <LONGREAL, ISO> )) ;        (* BOOLEAN *)
+.. index::
+   pair: IEEE; (const)
+.. code-block:: modula2
+      IEEE       = __ATTRIBUTE__ __BUILTIN__ (( <LONGREAL, IEEE> )) ;       (* BOOLEAN *)
+.. index::
+   pair: rounds; (const)
+.. code-block:: modula2
+      rounds     = __ATTRIBUTE__ __BUILTIN__ (( <LONGREAL, rounds> )) ;     (* BOOLEAN *)
+.. index::
+   pair: gUnderflow; (const)
+.. code-block:: modula2
+      gUnderflow = __ATTRIBUTE__ __BUILTIN__ (( <LONGREAL, gUnderflow> )) ; (* BOOLEAN *)
+.. index::
+   pair: exception; (const)
+.. code-block:: modula2
+      exception  = __ATTRIBUTE__ __BUILTIN__ (( <LONGREAL, exception> )) ;  (* BOOLEAN *)
+.. index::
+   pair: extend; (const)
+.. code-block:: modula2
+      extend     = __ATTRIBUTE__ __BUILTIN__ (( <LONGREAL, extend> )) ;     (* BOOLEAN *)
+.. index::
+   pair: nModes; (const)
+.. code-block:: modula2
+      nModes     = __ATTRIBUTE__ __BUILTIN__ (( <LONGREAL, nModes> )) ;     (* ZType *)
+    
+    TYPE
+.. index::
+   pair: Modes; (type)
+.. code-block:: modula2
+      Modes = PACKEDSET OF [0 .. nModes-1];
+    
+.. index::
+   exponent
+.. code-block:: modula2
+    PROCEDURE exponent (x: LONGREAL): INTEGER;
+      (* Returns the exponent value of x *)
+    
+.. index::
+   fraction
+.. code-block:: modula2
+    PROCEDURE fraction (x: LONGREAL): LONGREAL;
+      (* Returns the significand (or significant part) of x *)
+    
+.. index::
+   sign
+.. code-block:: modula2
+    PROCEDURE sign (x: LONGREAL): LONGREAL;
+      (* Returns the signum of x *)
+    
+.. index::
+   succ
+.. code-block:: modula2
+    PROCEDURE succ (x: LONGREAL): LONGREAL;
+      (* Returns the next value of the type LONGREAL greater than x *)
+    
+.. index::
+   ulp
+.. code-block:: modula2
+    PROCEDURE ulp (x: LONGREAL): LONGREAL;
+      (* Returns the value of a unit in the last place of x *)
+    
+.. index::
+   pred
+.. code-block:: modula2
+    PROCEDURE pred (x: LONGREAL): LONGREAL;
+      (* Returns the previous value of the type LONGREAL less than x *)
+    
+.. index::
+   intpart
+.. code-block:: modula2
+    PROCEDURE intpart (x: LONGREAL): LONGREAL;
+      (* Returns the integer part of x *)
+    
+.. index::
+   fractpart
+.. code-block:: modula2
+    PROCEDURE fractpart (x: LONGREAL): LONGREAL;
+      (* Returns the fractional part of x *)
+    
+.. index::
+   scale
+.. code-block:: modula2
+    PROCEDURE scale (x: LONGREAL; n: INTEGER): LONGREAL;
+      (* Returns the value of x * radix ** n *)
+    
+.. index::
+   trunc
+.. code-block:: modula2
+    PROCEDURE trunc (x: LONGREAL; n: INTEGER): LONGREAL;
+      (* Returns the value of the first n places of x *)
+    
+.. index::
+   round
+.. code-block:: modula2
+    PROCEDURE round (x: LONGREAL; n: INTEGER): LONGREAL;
+      (* Returns the value of x rounded to the first n places *)
+    
+.. index::
+   synthesize
+.. code-block:: modula2
+    PROCEDURE synthesize (expart: INTEGER; frapart: LONGREAL): LONGREAL;
+      (* Returns a value of the type LONGREAL constructed from the given expart and frapart *)
+    
+.. index::
+   setMode
+.. code-block:: modula2
+    PROCEDURE setMode (m: Modes);
+      (* Sets status flags appropriate to the underlying implementation of the type LONGREAL *)
+    
+.. index::
+   currentMode
+.. code-block:: modula2
+    PROCEDURE currentMode (): Modes;
+      (* Returns the current status flags in the form set by setMode *)
+    
+.. index::
+   IsLowException
+.. code-block:: modula2
+    PROCEDURE IsLowException (): BOOLEAN;
+      (* Returns TRUE if the current coroutine is in the exceptional execution state
+         because of the raising of an exception in a routine from this module; otherwise
+         returns FALSE.
+      *)
+    
+    END LowLong.
+    
+
+@c @node gm2-libs-iso/LowReal, gm2-libs-iso/LowShort, gm2-libs-iso/LowLong, M2 ISO Libraries
+gm2-libs-iso/LowReal
+--------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE LowReal;
+
+  (* Access to underlying properties of the type REAL *)
+    
+    CONST
+.. index::
+   pair: radix; (const)
+.. code-block:: modula2
+      radix      = __ATTRIBUTE__ __BUILTIN__ (( <REAL, radix> )) ;      (* ZType *)
+.. index::
+   pair: places; (const)
+.. code-block:: modula2
+      places     = __ATTRIBUTE__ __BUILTIN__ (( <REAL, places> )) ;     (* ZType *)
+.. index::
+   pair: expoMin; (const)
+.. code-block:: modula2
+      expoMin    = __ATTRIBUTE__ __BUILTIN__ (( <REAL, expoMin> )) ;    (* ZType *)
+.. index::
+   pair: expoMax; (const)
+.. code-block:: modula2
+      expoMax    = __ATTRIBUTE__ __BUILTIN__ (( <REAL, expoMax> )) ;    (* ZType *)
+.. index::
+   pair: large; (const)
+.. code-block:: modula2
+      large      = __ATTRIBUTE__ __BUILTIN__ (( <REAL, large> )) ;      (* RType *)
+.. index::
+   pair: small; (const)
+.. code-block:: modula2
+      small      = __ATTRIBUTE__ __BUILTIN__ (( <REAL, small> )) ;      (* RType *)
+.. index::
+   pair: IEC559; (const)
+.. code-block:: modula2
+      IEC559     = __ATTRIBUTE__ __BUILTIN__ (( <REAL, IEC559> )) ;     (* BOOLEAN *)
+.. index::
+   pair: LIA1; (const)
+.. code-block:: modula2
+      LIA1       = __ATTRIBUTE__ __BUILTIN__ (( <REAL, LIA1> )) ;       (* BOOLEAN *)
+.. index::
+   pair: ISO; (const)
+.. code-block:: modula2
+      ISO        = __ATTRIBUTE__ __BUILTIN__ (( <REAL, ISO> )) ;        (* BOOLEAN *)
+.. index::
+   pair: IEEE; (const)
+.. code-block:: modula2
+      IEEE       = __ATTRIBUTE__ __BUILTIN__ (( <REAL, IEEE> )) ;       (* BOOLEAN *)
+.. index::
+   pair: rounds; (const)
+.. code-block:: modula2
+      rounds     = __ATTRIBUTE__ __BUILTIN__ (( <REAL, rounds> )) ;     (* BOOLEAN *)
+.. index::
+   pair: gUnderflow; (const)
+.. code-block:: modula2
+      gUnderflow = __ATTRIBUTE__ __BUILTIN__ (( <REAL, gUnderflow> )) ; (* BOOLEAN *)
+.. index::
+   pair: exception; (const)
+.. code-block:: modula2
+      exception  = __ATTRIBUTE__ __BUILTIN__ (( <REAL, exception> )) ;  (* BOOLEAN *)
+.. index::
+   pair: extend; (const)
+.. code-block:: modula2
+      extend     = __ATTRIBUTE__ __BUILTIN__ (( <REAL, extend> )) ;     (* BOOLEAN *)
+.. index::
+   pair: nModes; (const)
+.. code-block:: modula2
+      nModes     = __ATTRIBUTE__ __BUILTIN__ (( <REAL, nModes> )) ;     (* ZType *)
+    
+    TYPE
+.. index::
+   pair: Modes; (type)
+.. code-block:: modula2
+      Modes = PACKEDSET OF [0..nModes-1];
+    
+.. index::
+   exponent
+.. code-block:: modula2
+    PROCEDURE exponent (x: REAL): INTEGER;
+      (* Returns the exponent value of x *)
+    
+.. index::
+   fraction
+.. code-block:: modula2
+    PROCEDURE fraction (x: REAL): REAL;
+      (* Returns the significand (or significant part) of x *)
+    
+.. index::
+   sign
+.. code-block:: modula2
+    PROCEDURE sign (x: REAL): REAL;
+      (* Returns the signum of x *)
+    
+.. index::
+   succ
+.. code-block:: modula2
+    PROCEDURE succ (x: REAL): REAL;
+      (* Returns the next value of the type REAL greater than x *)
+    
+.. index::
+   ulp
+.. code-block:: modula2
+    PROCEDURE ulp (x: REAL): REAL;
+      (* Returns the value of a unit in the last place of x *)
+    
+.. index::
+   pred
+.. code-block:: modula2
+    PROCEDURE pred (x: REAL): REAL;
+      (* Returns the previous value of the type REAL less than x *)
+    
+.. index::
+   intpart
+.. code-block:: modula2
+    PROCEDURE intpart (x: REAL): REAL;
+      (* Returns the integer part of x *)
+    
+.. index::
+   fractpart
+.. code-block:: modula2
+    PROCEDURE fractpart (x: REAL): REAL;
+      (* Returns the fractional part of x *)
+    
+.. index::
+   scale
+.. code-block:: modula2
+    PROCEDURE scale (x: REAL; n: INTEGER): REAL;
+      (* Returns the value of x * radix ** n *)
+    
+.. index::
+   trunc
+.. code-block:: modula2
+    PROCEDURE trunc (x: REAL; n: INTEGER): REAL;
+      (* Returns the value of the first n places of x *)
+    
+.. index::
+   round
+.. code-block:: modula2
+    PROCEDURE round (x: REAL; n: INTEGER): REAL;
+      (* Returns the value of x rounded to the first n places *)
+    
+.. index::
+   synthesize
+.. code-block:: modula2
+    PROCEDURE synthesize (expart: INTEGER; frapart: REAL): REAL;
+      (* Returns a value of the type REAL constructed from the given expart and frapart *)
+    
+.. index::
+   setMode
+.. code-block:: modula2
+    PROCEDURE setMode (m: Modes);
+      (* Sets status flags appropriate to the underlying implementation of the type REAL *)
+    
+.. index::
+   currentMode
+.. code-block:: modula2
+    PROCEDURE currentMode (): Modes;
+      (* Returns the current status flags in the form set by setMode *)
+    
+.. index::
+   IsLowException
+.. code-block:: modula2
+    PROCEDURE IsLowException (): BOOLEAN;
+      (* Returns TRUE if the current coroutine is in the exceptional execution state
+         because of the raising of an exception in a routine from this module; otherwise
+         returns FALSE.
+      *)
+    
+    END LowReal.
+    
+
+@c @node gm2-libs-iso/LowShort, gm2-libs-iso/M2EXCEPTION, gm2-libs-iso/LowReal, M2 ISO Libraries
+gm2-libs-iso/LowShort
+---------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE LowShort;
+
+  (* Access to underlying properties of the type SHORTREAL *)
+    
+    CONST
+.. index::
+   pair: radix; (const)
+.. code-block:: modula2
+      radix      = __ATTRIBUTE__ __BUILTIN__ (( <SHORTREAL, radix> )) ;      (* ZType *)
+.. index::
+   pair: places; (const)
+.. code-block:: modula2
+      places     = __ATTRIBUTE__ __BUILTIN__ (( <SHORTREAL, places> )) ;     (* ZType *)
+.. index::
+   pair: expoMin; (const)
+.. code-block:: modula2
+      expoMin    = __ATTRIBUTE__ __BUILTIN__ (( <SHORTREAL, expoMin> )) ;    (* ZType *)
+.. index::
+   pair: expoMax; (const)
+.. code-block:: modula2
+      expoMax    = __ATTRIBUTE__ __BUILTIN__ (( <SHORTREAL, expoMax> )) ;    (* ZType *)
+.. index::
+   pair: large; (const)
+.. code-block:: modula2
+      large      = __ATTRIBUTE__ __BUILTIN__ (( <SHORTREAL, large> )) ;      (* RType *)
+.. index::
+   pair: small; (const)
+.. code-block:: modula2
+      small      = __ATTRIBUTE__ __BUILTIN__ (( <SHORTREAL, small> )) ;      (* RType *)
+.. index::
+   pair: IEC559; (const)
+.. code-block:: modula2
+      IEC559     = __ATTRIBUTE__ __BUILTIN__ (( <SHORTREAL, IEC559> )) ;     (* BOOLEAN *)
+.. index::
+   pair: LIA1; (const)
+.. code-block:: modula2
+      LIA1       = __ATTRIBUTE__ __BUILTIN__ (( <SHORTREAL, LIA1> )) ;       (* BOOLEAN *)
+.. index::
+   pair: ISO; (const)
+.. code-block:: modula2
+      ISO        = __ATTRIBUTE__ __BUILTIN__ (( <SHORTREAL, ISO> )) ;        (* BOOLEAN *)
+.. index::
+   pair: IEEE; (const)
+.. code-block:: modula2
+      IEEE       = __ATTRIBUTE__ __BUILTIN__ (( <SHORTREAL, IEEE> )) ;       (* BOOLEAN *)
+.. index::
+   pair: rounds; (const)
+.. code-block:: modula2
+      rounds     = __ATTRIBUTE__ __BUILTIN__ (( <SHORTREAL, rounds> )) ;     (* BOOLEAN *)
+.. index::
+   pair: gUnderflow; (const)
+.. code-block:: modula2
+      gUnderflow = __ATTRIBUTE__ __BUILTIN__ (( <SHORTREAL, gUnderflow> )) ; (* BOOLEAN *)
+.. index::
+   pair: exception; (const)
+.. code-block:: modula2
+      exception  = __ATTRIBUTE__ __BUILTIN__ (( <SHORTREAL, exception> )) ;  (* BOOLEAN *)
+.. index::
+   pair: extend; (const)
+.. code-block:: modula2
+      extend     = __ATTRIBUTE__ __BUILTIN__ (( <SHORTREAL, extend> )) ;     (* BOOLEAN *)
+.. index::
+   pair: nModes; (const)
+.. code-block:: modula2
+      nModes     = __ATTRIBUTE__ __BUILTIN__ (( <SHORTREAL, nModes> )) ;     (* ZType *)
+    
+    TYPE
+.. index::
+   pair: Modes; (type)
+.. code-block:: modula2
+      Modes = PACKEDSET OF [0 .. nModes-1];
+    
+.. index::
+   exponent
+.. code-block:: modula2
+    PROCEDURE exponent (x: SHORTREAL): INTEGER;
+      (* Returns the exponent value of x *)
+    
+.. index::
+   fraction
+.. code-block:: modula2
+    PROCEDURE fraction (x: SHORTREAL): SHORTREAL;
+      (* Returns the significand (or significant part) of x *)
+    
+.. index::
+   sign
+.. code-block:: modula2
+    PROCEDURE sign (x: SHORTREAL): SHORTREAL;
+      (* Returns the signum of x *)
+    
+.. index::
+   succ
+.. code-block:: modula2
+    PROCEDURE succ (x: SHORTREAL): SHORTREAL;
+      (* Returns the next value of the type SHORTREAL greater than x *)
+    
+.. index::
+   ulp
+.. code-block:: modula2
+    PROCEDURE ulp (x: SHORTREAL): SHORTREAL;
+      (* Returns the value of a unit in the last place of x *)
+    
+.. index::
+   pred
+.. code-block:: modula2
+    PROCEDURE pred (x: SHORTREAL): SHORTREAL;
+      (* Returns the previous value of the type SHORTREAL less than x *)
+    
+.. index::
+   intpart
+.. code-block:: modula2
+    PROCEDURE intpart (x: SHORTREAL): SHORTREAL;
+      (* Returns the integer part of x *)
+    
+.. index::
+   fractpart
+.. code-block:: modula2
+    PROCEDURE fractpart (x: SHORTREAL): SHORTREAL;
+      (* Returns the fractional part of x *)
+    
+.. index::
+   scale
+.. code-block:: modula2
+    PROCEDURE scale (x: SHORTREAL; n: INTEGER): SHORTREAL;
+      (* Returns the value of x * radix ** n *)
+    
+.. index::
+   trunc
+.. code-block:: modula2
+    PROCEDURE trunc (x: SHORTREAL; n: INTEGER): SHORTREAL;
+      (* Returns the value of the first n places of x *)
+    
+.. index::
+   round
+.. code-block:: modula2
+    PROCEDURE round (x: SHORTREAL; n: INTEGER): SHORTREAL;
+      (* Returns the value of x rounded to the first n places *)
+    
+.. index::
+   synthesize
+.. code-block:: modula2
+    PROCEDURE synthesize (expart: INTEGER; frapart: SHORTREAL): SHORTREAL;
+      (* Returns a value of the type SHORTREAL constructed from the given expart and frapart *)
+    
+.. index::
+   setMode
+.. code-block:: modula2
+    PROCEDURE setMode (m: Modes);
+      (* Sets status flags appropriate to the underlying implementation of the type SHORTREAL *)
+    
+.. index::
+   currentMode
+.. code-block:: modula2
+    PROCEDURE currentMode (): Modes;
+      (* Returns the current status flags in the form set by setMode *)
+    
+.. index::
+   IsLowException
+.. code-block:: modula2
+    PROCEDURE IsLowException (): BOOLEAN;
+      (* Returns TRUE if the current coroutine is in the exceptional execution state
+         because of the raising of an exception in a routine from this module; otherwise
+         returns FALSE.
+      *)
+    
+    END LowShort.
+
+@c @node gm2-libs-iso/M2EXCEPTION, gm2-libs-iso/M2RTS, gm2-libs-iso/LowShort, M2 ISO Libraries
+gm2-libs-iso/M2EXCEPTION
+------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE M2EXCEPTION;
+
+(* Provides facilities for identifying language exceptions *)
+    
+    TYPE
+.. index::
+   pair: M2Exceptions; (type)
+.. code-block:: modula2
+      M2Exceptions =
+        (indexException,     rangeException,         caseSelectException,  invalidLocation,
+         functionException,  wholeValueException,    wholeDivException,    realValueException,
+         realDivException,   complexValueException,  complexDivException,  protException,
+         sysException,       coException,            exException
+        );
+    
+.. index::
+   M2Exception
+.. code-block:: modula2
+    PROCEDURE M2Exception (): M2Exceptions;
+      (* If the current coroutine is in the exceptional execution state because of the raising
+         of a language exception, returns the corresponding enumeration value, and otherwise
+         raises an exception.
+      *)
+    
+.. index::
+   IsM2Exception
+.. code-block:: modula2
+    PROCEDURE IsM2Exception (): BOOLEAN;
+      (* If the current coroutine is in the exceptional execution state because of the raising
+         of a language exception, returns TRUE, and otherwise returns FALSE.
+      *)
+    
+    END M2EXCEPTION.
+
+@c @node gm2-libs-iso/M2RTS, gm2-libs-iso/MemStream, gm2-libs-iso/M2EXCEPTION, M2 ISO Libraries
+gm2-libs-iso/M2RTS
+------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE M2RTS ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    
+    
+    TYPE
+.. index::
+   pair: ArgCVEnvP; (type)
+.. code-block:: modula2
+       ArgCVEnvP = PROCEDURE (INTEGER, ADDRESS, ADDRESS) ;
+    
+    
+.. index::
+   ConstructModules
+.. code-block:: modula2
+    PROCEDURE ConstructModules (applicationmodule: ADDRESS;
+                                argc: INTEGER; argv, envp: ADDRESS) ;
+    
+.. index::
+   DeconstructModules
+.. code-block:: modula2
+    PROCEDURE DeconstructModules (applicationmodule: ADDRESS;
+                                  argc: INTEGER; argv, envp: ADDRESS) ;
+    
+    
+    (*
+       RegisterModule - adds module name to the list of outstanding
+                        modules which need to have their dependencies
+                        explored to determine initialization order.
+    *)
+    
+.. index::
+   RegisterModule
+.. code-block:: modula2
+    PROCEDURE RegisterModule (name: ADDRESS;
+                              init, fini:  ArgCVEnvP;
+                              dependencies: PROC) ;
+    
+    
+    (*
+       RequestDependant - used to specify that modulename is dependant upon
+                          module dependantmodule.
+    *)
+    
+.. index::
+   RequestDependant
+.. code-block:: modula2
+    PROCEDURE RequestDependant (modulename, dependantmodule: ADDRESS) ;
+    
+    
+    (*
+       ExecuteTerminationProcedures - calls each installed termination
+                                      procedure in reverse order.
+    *)
+    
+.. index::
+   ExecuteTerminationProcedures
+.. code-block:: modula2
+    PROCEDURE ExecuteTerminationProcedures ;
+    
+    
+    (*
+       InstallTerminationProcedure - installs a procedure, p, which will
+                                     be called when the procedure
+                                     ExecuteTerminationProcedures
+                                     is invoked.  It returns TRUE is the
+                                     procedure is installed.
+    *)
+    
+.. index::
+   InstallTerminationProcedure
+.. code-block:: modula2
+    PROCEDURE InstallTerminationProcedure (p: PROC) : BOOLEAN ;
+    
+    
+    (*
+       ExecuteInitialProcedures - executes the initial procedures installed
+                                  by InstallInitialProcedure.
+    *)
+    
+.. index::
+   ExecuteInitialProcedures
+.. code-block:: modula2
+    PROCEDURE ExecuteInitialProcedures ;
+    
+    
+    (*
+       InstallInitialProcedure - installs a procedure to be executed just
+                                 before the BEGIN code section of the main
+                                 program module.
+    *)
+    
+.. index::
+   InstallInitialProcedure
+.. code-block:: modula2
+    PROCEDURE InstallInitialProcedure (p: PROC) : BOOLEAN ;
+    
+    
+    (*
+       HALT - terminate the current program.  The procedure
+              ExecuteTerminationProcedures
+              is called before the program is stopped.  The parameter
+              exitcode is optional.  If the parameter is not supplied
+              HALT will call libc 'abort', otherwise it will exit with
+              the code supplied.  Supplying a parameter to HALT has the
+              same effect as calling ExitOnHalt with the same code and
+              then calling HALT with no parameter.
+    *)
+    
+.. index::
+   HALT
+.. code-block:: modula2
+    PROCEDURE HALT ([exitcode: INTEGER = -1]) ;
+    
+    
+    (*
+       Halt - provides a more user friendly version of HALT, which takes
+              four parameters to aid debugging.
+    *)
+    
+.. index::
+   Halt
+.. code-block:: modula2
+    PROCEDURE Halt (file: ARRAY OF CHAR; line: CARDINAL;
+                    function: ARRAY OF CHAR; description: ARRAY OF CHAR) ;
+    
+    
+    (*
+       ExitOnHalt - if HALT is executed then call exit with the exit code, e.
+    *)
+    
+.. index::
+   ExitOnHalt
+.. code-block:: modula2
+    PROCEDURE ExitOnHalt (e: INTEGER) ;
+    
+    
+    (*
+       ErrorMessage - emits an error message to stderr and then calls exit (1).
+    *)
+    
+.. index::
+   ErrorMessage
+.. code-block:: modula2
+    PROCEDURE ErrorMessage (message: ARRAY OF CHAR;
+                            file: ARRAY OF CHAR;
+                            line: CARDINAL;
+                            function: ARRAY OF CHAR) ;
+    
+    
+    (*
+       IsTerminating - Returns true if any coroutine has started program termination
+                       and false otherwise.
+    *)
+    
+.. index::
+   IsTerminating
+.. code-block:: modula2
+    PROCEDURE IsTerminating () : BOOLEAN ;
+    
+    
+    (*
+       HasHalted - Returns true if a call to HALT has been made and false
+                   otherwise.
+    *)
+    
+.. index::
+   HasHalted
+.. code-block:: modula2
+    PROCEDURE HasHalted () : BOOLEAN ;
+    
+    
+    (*
+       Length - returns the length of a string, a. This is called whenever
+                the user calls LENGTH and the parameter cannot be calculated
+                at compile time.
+    *)
+    
+.. index::
+   Length
+.. code-block:: modula2
+    PROCEDURE Length (a: ARRAY OF CHAR) : CARDINAL ;
+    
+    
+    (*
+       The following are the runtime exception handler routines.
+    *)
+    
+.. index::
+   AssignmentException
+.. code-block:: modula2
+    PROCEDURE AssignmentException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   ReturnException
+.. code-block:: modula2
+    PROCEDURE ReturnException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   IncException
+.. code-block:: modula2
+    PROCEDURE IncException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   DecException
+.. code-block:: modula2
+    PROCEDURE DecException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   InclException
+.. code-block:: modula2
+    PROCEDURE InclException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   ExclException
+.. code-block:: modula2
+    PROCEDURE ExclException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   ShiftException
+.. code-block:: modula2
+    PROCEDURE ShiftException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   RotateException
+.. code-block:: modula2
+    PROCEDURE RotateException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   StaticArraySubscriptException
+.. code-block:: modula2
+    PROCEDURE StaticArraySubscriptException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   DynamicArraySubscriptException
+.. code-block:: modula2
+    PROCEDURE DynamicArraySubscriptException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   ForLoopBeginException
+.. code-block:: modula2
+    PROCEDURE ForLoopBeginException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   ForLoopToException
+.. code-block:: modula2
+    PROCEDURE ForLoopToException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   ForLoopEndException
+.. code-block:: modula2
+    PROCEDURE ForLoopEndException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   PointerNilException
+.. code-block:: modula2
+    PROCEDURE PointerNilException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   NoReturnException
+.. code-block:: modula2
+    PROCEDURE NoReturnException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   CaseException
+.. code-block:: modula2
+    PROCEDURE CaseException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   WholeNonPosDivException
+.. code-block:: modula2
+    PROCEDURE WholeNonPosDivException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   WholeNonPosModException
+.. code-block:: modula2
+    PROCEDURE WholeNonPosModException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   WholeZeroDivException
+.. code-block:: modula2
+    PROCEDURE WholeZeroDivException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   WholeZeroRemException
+.. code-block:: modula2
+    PROCEDURE WholeZeroRemException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   WholeValueException
+.. code-block:: modula2
+    PROCEDURE WholeValueException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   RealValueException
+.. code-block:: modula2
+    PROCEDURE RealValueException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   ParameterException
+.. code-block:: modula2
+    PROCEDURE ParameterException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+.. index::
+   NoException
+.. code-block:: modula2
+    PROCEDURE NoException (filename: ADDRESS; line, column: CARDINAL; scope, message: ADDRESS) ;
+    
+    
+    END M2RTS.
+
+@c @node gm2-libs-iso/MemStream, gm2-libs-iso/Preemptive, gm2-libs-iso/M2RTS, M2 ISO Libraries
+gm2-libs-iso/MemStream
+----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE MemStream ;
+
+(*
+    Description: provides an ISO module which can write to a memory
+                 buffer or read from a memory buffer.
+*)
+    
+    FROM IOChan IMPORT ChanId ;
+    FROM ChanConsts IMPORT FlagSet, OpenResults ;
+    FROM SYSTEM IMPORT ADDRESS, LOC ;
+    
+    
+    (*
+       Attempts to obtain and open a channel connected to a contigeous
+       buffer in memory.  The write flag is implied; without the raw
+       flag, text is implied.  If successful, assigns to cid the identity of
+       the opened channel, assigns the value opened to res.
+       If a channel cannot be opened as required,
+       the value of res indicates the reason, and cid identifies the
+       invalid channel.
+    
+       The parameters, buffer, length and used maybe updated as
+       data is written.  The buffer maybe reallocated
+       and its address might alter, however the parameters will
+       always reflect the current active buffer.  When this
+       channel is closed the buffer is deallocated and
+       buffer will be set to NIL, length and used will be set to
+       zero.
+    *)
+    
+.. index::
+   OpenWrite
+.. code-block:: modula2
+    PROCEDURE OpenWrite (VAR cid: ChanId; flags: FlagSet;
+                         VAR res: OpenResults;
+                         VAR buffer: ADDRESS;
+                         VAR length: CARDINAL;
+                         VAR used: CARDINAL;
+                         deallocOnClose: BOOLEAN) ;
+    
+    
+    (*
+       Attempts to obtain and open a channel connected to a contigeous
+       buffer in memory.  The read and old flags are implied; without
+       the raw flag, text is implied.  If successful, assigns to cid the
+       identity of the opened channel, assigns the value opened to res, and
+       selects input mode, with the read position corresponding to the start
+       of the buffer.  If a channel cannot be opened as required, the value of
+       res indicates the reason, and cid identifies the invalid channel.
+    *)
+    
+.. index::
+   OpenRead
+.. code-block:: modula2
+    PROCEDURE OpenRead (VAR cid: ChanId; flags: FlagSet;
+                        VAR res: OpenResults;
+                        buffer: ADDRESS; length: CARDINAL;
+                        deallocOnClose: BOOLEAN) ;
+    
+    
+    (*
+       Close - if the channel identified by cid is not open to
+               a memory stream, the exception wrongDevice is
+               raised; otherwise closes the channel, and assigns
+               the value identifying the invalid channel to cid.
+    *)
+    
+.. index::
+   Close
+.. code-block:: modula2
+    PROCEDURE Close (VAR cid: ChanId) ;
+    
+    
+    (*
+       Rewrite - assigns the buffer index to zero.  Subsequent
+                 writes will overwrite the previous buffer contents.
+    *)
+    
+.. index::
+   Rewrite
+.. code-block:: modula2
+    PROCEDURE Rewrite (cid: ChanId) ;
+    
+    
+    (*
+       Reread - assigns the buffer index to zero.  Subsequent
+                reads will read the previous buffer contents.
+    *)
+    
+.. index::
+   Reread
+.. code-block:: modula2
+    PROCEDURE Reread (cid: ChanId) ;
+    
+    
+    (*
+       IsMem - tests if the channel identified by cid is open as
+               a memory stream.
+    *)
+    
+.. index::
+   IsMem
+.. code-block:: modula2
+    PROCEDURE IsMem (cid: ChanId) : BOOLEAN ;
+    
+    
+    END MemStream.
+
+@c @node gm2-libs-iso/Preemptive, gm2-libs-iso/Processes, gm2-libs-iso/MemStream, M2 ISO Libraries
+gm2-libs-iso/Preemptive
+-----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Preemptive ;
+
+    
+    (*
+       initPreemptive - if microsecs > 0 then turn on preemptive scheduling.
+                        if microsecs = 0 then preemptive scheduling is turned off.
+    *)
+    
+.. index::
+   initPreemptive
+.. code-block:: modula2
+    PROCEDURE initPreemptive (seconds, microsecs: CARDINAL) ;
+    
+    
+    END Preemptive.
+
+@c @node gm2-libs-iso/Processes, gm2-libs-iso/ProgramArgs, gm2-libs-iso/Preemptive, M2 ISO Libraries
+gm2-libs-iso/Processes
+----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE Processes;
+
+  (* This module allows concurrent algorithms to be expressed using
+     processes. A process is a unit of a program that has the
+     potential to run in parallel with other processes.
+  *)
+    
+    IMPORT SYSTEM;
+    
+    TYPE
+      ProcessId;                      (* Used to identify processes *)
+.. index::
+   pair: Parameter; (type)
+.. code-block:: modula2
+      Parameter     = SYSTEM.ADDRESS; (* Used to pass data between processes *)
+.. index::
+   pair: Body; (type)
+.. code-block:: modula2
+      Body          = PROC;           (* Used as the type of a process body *)
+.. index::
+   pair: Urgency; (type)
+.. code-block:: modula2
+      Urgency       = INTEGER;        (* Used by the internal scheduler *)
+.. index::
+   pair: Sources; (type)
+.. code-block:: modula2
+      Sources       = CARDINAL;       (* Used to identify event sources *)
+.. index::
+   pair: ProcessesExceptions; (type)
+.. code-block:: modula2
+      ProcessesExceptions =           (* Exceptions raised by this module *)
+        (passiveProgram, processError);
+    
+    (* The following procedures create processes and switch control between
+       them. *)
+    
+.. index::
+   Create
+.. code-block:: modula2
+    PROCEDURE Create (procBody: Body; extraSpace: CARDINAL; procUrg: Urgency;
+                      procParams: Parameter; VAR procId: ProcessId);
+      (* Creates a new process with procBody as its body, and with urgency
+         and parameters given by procUrg and procParams.  At least as
+         much workspace (in units of SYSTEM.LOC) as is specified by
+         extraSpace is allocated to the process.
+         An identity for the new process is returned in procId.
+         The process is created in the passive state; it will not run
+         until activated.
+      *)
+    
+.. index::
+   Start
+.. code-block:: modula2
+    PROCEDURE Start (procBody: Body; extraSpace: CARDINAL; procUrg: Urgency;
+                     procParams: Parameter; VAR procId: ProcessId);
+      (* Creates a new process, with parameters as for Create.
+         The process is created in the ready state; it is eligible to
+         run immediately.
+      *)
+    
+.. index::
+   StopMe
+.. code-block:: modula2
+    PROCEDURE StopMe ();
+      (* Terminates the calling process.
+         The process must not be associated with a source of events.
+      *)
+    
+.. index::
+   SuspendMe
+.. code-block:: modula2
+    PROCEDURE SuspendMe ();
+      (* Causes the calling process to enter the passive state.  The
+         procedure only returns when the calling process is again
+         activated by another process.
+      *)
+    
+.. index::
+   Activate
+.. code-block:: modula2
+    PROCEDURE Activate (procId: ProcessId);
+      (* Causes the process identified by procId to enter the ready
+         state, and thus to become eligible to run again.
+      *)
+    
+.. index::
+   SuspendMeAndActivate
+.. code-block:: modula2
+    PROCEDURE SuspendMeAndActivate (procId: ProcessId);
+      (* Executes an atomic sequence of SuspendMe() and
+         Activate(procId). *)
+    
+.. index::
+   Switch
+.. code-block:: modula2
+    PROCEDURE Switch (procId: ProcessId; VAR info: Parameter);
+      (* Causes the calling process to enter the passive state; the
+         process identified by procId becomes the currently executing
+         process.  info is used to pass parameter information from the
+         calling to the activated process.  On return, info will
+         contain information from the process that chooses to switch
+         back to this one (or will be NIL if Activate or
+         SuspendMeAndActivate are used instead of Switch).
+      *)
+    
+.. index::
+   Wait
+.. code-block:: modula2
+    PROCEDURE Wait ();
+      (* Causes the calling process to enter the waiting state.
+         The procedure will return when the calling process is
+         activated by another process, or when one of its associated
+         eventSources has generated an event.
+      *)
+    
+    (* The following procedures allow the association of processes
+       with sources of external events.
+    *)
+    
+.. index::
+   Attach
+.. code-block:: modula2
+    PROCEDURE Attach (eventSource: Sources);
+      (* Associates the specified eventSource with the calling
+         process. *)
+    
+.. index::
+   Detach
+.. code-block:: modula2
+    PROCEDURE Detach (eventSource: Sources);
+      (* Dissociates the specified eventSource from the program. *)
+    
+.. index::
+   IsAttached
+.. code-block:: modula2
+    PROCEDURE IsAttached (eventSource: Sources): BOOLEAN;
+      (* Returns TRUE if and only if the specified eventSource is
+         currently associated with one of the processes of the
+         program.
+      *)
+    
+.. index::
+   Handler
+.. code-block:: modula2
+    PROCEDURE Handler (eventSource: Sources): ProcessId;
+      (* Returns the identity of the process, if any, that is
+         associated with the specified eventSource.
+      *)
+    
+    (* The following procedures allow processes to obtain their
+       identity, parameters, and urgency.
+    *)
+    
+.. index::
+   Me
+.. code-block:: modula2
+    PROCEDURE Me (): ProcessId;
+      (* Returns the identity of the calling process (as assigned
+         when the process was first created).
+      *)
+    
+.. index::
+   MyParam
+.. code-block:: modula2
+    PROCEDURE MyParam (): Parameter;
+      (* Returns the value specified as procParams when the calling
+         process was created. *)
+    
+.. index::
+   UrgencyOf
+.. code-block:: modula2
+    PROCEDURE UrgencyOf (procId: ProcessId): Urgency;
+      (* Returns the urgency established when the process identified
+         by procId was first created.
+      *)
+    
+    (* The following procedure provides facilities for exception
+       handlers. *)
+    
+.. index::
+   ProcessesException
+.. code-block:: modula2
+    PROCEDURE ProcessesException (): ProcessesExceptions;
+      (* If the current coroutine is in the exceptional execution state
+         because of the raising of a language exception, returns the
+         corresponding enumeration value, and otherwise raises an
+         exception.
+      *)
+    
+.. index::
+   IsProcessesException
+.. code-block:: modula2
+    PROCEDURE IsProcessesException (): BOOLEAN;
+      (* Returns TRUE if the current coroutine is in the exceptional
+         execution state because of the raising of an exception in
+         a routine from this module; otherwise returns FALSE.
+      *)
+    
+    (*
+       Reschedule - rotates the ready queue and transfers to the process
+                    with the highest run priority.
+    *)
+    
+.. index::
+   Reschedule
+.. code-block:: modula2
+    PROCEDURE Reschedule ;
+    
+    
+    (*
+       displayProcesses -
+    *)
+    
+.. index::
+   displayProcesses
+.. code-block:: modula2
+    PROCEDURE displayProcesses (message: ARRAY OF CHAR) ;
+    
+    
+    END Processes.
+
+@c @node gm2-libs-iso/ProgramArgs, gm2-libs-iso/RTco, gm2-libs-iso/Processes, M2 ISO Libraries
+gm2-libs-iso/ProgramArgs
+------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE ProgramArgs;
+
+  (* Access to program arguments *)
+    
+    IMPORT IOChan;
+    
+    TYPE
+.. index::
+   pair: ChanId; (type)
+.. code-block:: modula2
+      ChanId = IOChan.ChanId;
+    
+.. index::
+   ArgChan
+.. code-block:: modula2
+    PROCEDURE ArgChan (): ChanId;
+      (* Returns a value that identifies a channel for reading
+         program arguments *)
+    
+.. index::
+   IsArgPresent
+.. code-block:: modula2
+    PROCEDURE IsArgPresent (): BOOLEAN;
+      (* Tests if there is a current argument to read from.  If not,
+         read <= IOChan.CurrentFlags() will be FALSE, and attempting
+         to read from the argument channel will raise the exception
+         notAvailable.
+      *)
+    
+.. index::
+   NextArg
+.. code-block:: modula2
+    PROCEDURE NextArg ();
+      (* If there is another argument, causes subsequent input from the
+         argument device to come from the start of the next argument.
+         Otherwise there is no argument to read from, and a call of
+         IsArgPresent will return FALSE.
+      *)
+    
+    END ProgramArgs.
+
+@c @node gm2-libs-iso/RTco, gm2-libs-iso/RTdata, gm2-libs-iso/ProgramArgs, M2 ISO Libraries
+gm2-libs-iso/RTco
+-----------------
+
+.. code-block:: modula2
+    DEFINITION MODULE RTco ;
+
+    FROM SYSTEM IMPORT ADDRESS ;
+    
+    
+    (* init initializes the module and allows the application to lazily invoke threads.  *)
+    
+.. index::
+   init
+.. code-block:: modula2
+    PROCEDURE init () : INTEGER ;
+    
+.. index::
+   initThread
+.. code-block:: modula2
+    PROCEDURE initThread (p: PROC; stackSize: CARDINAL; interruptLevel: CARDINAL) : INTEGER ;
+    
+.. index::
+   initSemaphore
+.. code-block:: modula2
+    PROCEDURE initSemaphore (value: CARDINAL) : INTEGER ;
+    
+.. index::
+   wait
+.. code-block:: modula2
+    PROCEDURE wait (semaphore: INTEGER) ;
+    
+.. index::
+   signal
+.. code-block:: modula2
+    PROCEDURE signal (semaphore: INTEGER) ;
+    
+.. index::
+   transfer
+.. code-block:: modula2
+    PROCEDURE transfer (VAR p1: INTEGER; p2: INTEGER) ;
+    
+.. index::
+   waitThread
+.. code-block:: modula2
+    PROCEDURE waitThread (tid: INTEGER) ;
+    
+.. index::
+   signalThread
+.. code-block:: modula2
+    PROCEDURE signalThread (tid: INTEGER) ;
+    
+.. index::
+   currentThread
+.. code-block:: modula2
+    PROCEDURE currentThread () : INTEGER ;
+    
+    
+    (* currentInterruptLevel returns the interrupt level of the current thread.  *)
+    
+.. index::
+   currentInterruptLevel
+.. code-block:: modula2
+    PROCEDURE currentInterruptLevel () : CARDINAL ;
+    
+    
+    (* turninterrupts returns the old interrupt level and assigns the interrupt level
+       to newLevel.  *)
+    
+.. index::
+   turnInterrupts
+.. code-block:: modula2
+    PROCEDURE turnInterrupts (newLevel: CARDINAL) : CARDINAL ;
+    
+    
+    (*
+       select access to the select system call which will be thread safe.
+       This is typically called from the idle process to wait for an interrupt.
+    *)
+    
+.. index::
+   select
+.. code-block:: modula2
+    PROCEDURE select (p1: INTEGER;
+                      p2: ADDRESS;
+                      p3: ADDRESS;
+                      p4: ADDRESS;
+                      p5: ADDRESS) : INTEGER ;
+    
+    
+    END RTco.
+
+@c @node gm2-libs-iso/RTdata, gm2-libs-iso/RTentity, gm2-libs-iso/RTco, M2 ISO Libraries
+gm2-libs-iso/RTdata
+-------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE RTdata ;
+
+(*
+    Description: provides a mechanism whereby devices can store
+                 data attached to a device.
+*)
+    
+    FROM SYSTEM IMPORT ADDRESS ;
+    FROM IOLink IMPORT DeviceTablePtr ;
+    
+    TYPE
+.. index::
+   pair: ModuleId; (type)
+.. code-block:: modula2
+       ModuleId ;
+.. index::
+   pair: FreeProcedure; (type)
+.. code-block:: modula2
+       FreeProcedure = PROCEDURE (ADDRESS) ;
+    
+    
+    (*
+       MakeModuleId - creates a unique module Id.
+    *)
+    
+.. index::
+   MakeModuleId
+.. code-block:: modula2
+    PROCEDURE MakeModuleId (VAR m: ModuleId) ;
+    
+    
+    (*
+       InitData - adds, datum, to the device, d.  The datum
+                  is associated with ModuleID, m.
+    *)
+    
+.. index::
+   InitData
+.. code-block:: modula2
+    PROCEDURE InitData (d: DeviceTablePtr; m: ModuleId;
+                        datum: ADDRESS; f: FreeProcedure) ;
+    
+    
+    (*
+       GetData - returns the datum assocated with ModuleId, m.
+    *)
+    
+.. index::
+   GetData
+.. code-block:: modula2
+    PROCEDURE GetData (d: DeviceTablePtr; m: ModuleId) : ADDRESS ;
+    
+    
+    (*
+       KillData - destroys the datum associated with ModuleId, m,
+                  in device, d.  It invokes the free procedure
+                  given during InitData.
+    *)
+    
+.. index::
+   KillData
+.. code-block:: modula2
+    PROCEDURE KillData (d: DeviceTablePtr; m: ModuleId) ;
+    
+    
+    END RTdata.
+
+@c @node gm2-libs-iso/RTentity, gm2-libs-iso/RTfio, gm2-libs-iso/RTdata, M2 ISO Libraries
+gm2-libs-iso/RTentity
+---------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE RTentity ;
+
+(*
+    Description: provides a set of routines for maintaining an
+                 efficient mechanism to group opaque (or pointer)
+                 data structures together.  Internally the
+                 entities are grouped together using a binary
+                 tree.  It does not use Storage - and instead
+                 uses malloc, free from libc as Storage uses the
+                 module to detect erroneous deallocations.
+*)
+    
+    IMPORT SYSTEM ;
+    
+    TYPE
+.. index::
+   pair: Group; (type)
+.. code-block:: modula2
+       Group ;
+    
+    
+.. index::
+   InitGroup
+.. code-block:: modula2
+    PROCEDURE InitGroup () : Group ;
+.. index::
+   KillGroup
+.. code-block:: modula2
+    PROCEDURE KillGroup (g: Group) : Group ;
+.. index::
+   GetKey
+.. code-block:: modula2
+    PROCEDURE GetKey (g: Group; a: SYSTEM.ADDRESS) : CARDINAL ;
+.. index::
+   PutKey
+.. code-block:: modula2
+    PROCEDURE PutKey (g: Group; a: SYSTEM.ADDRESS; key: CARDINAL) ;
+.. index::
+   DelKey
+.. code-block:: modula2
+    PROCEDURE DelKey (g: Group; a: SYSTEM.ADDRESS) ;
+.. index::
+   IsIn
+.. code-block:: modula2
+    PROCEDURE IsIn (g: Group; a: SYSTEM.ADDRESS) : BOOLEAN ;
+    
+    
+    END RTentity.
+
+@c @node gm2-libs-iso/RTfio, gm2-libs-iso/RTgen, gm2-libs-iso/RTentity, M2 ISO Libraries
+gm2-libs-iso/RTfio
+------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE RTfio ;
+
+(*
+    Description: provides default FIO based methods for the RTgenif
+                 procedures.  These will be used by StreamFile,
+                 SeqFile, StdChans, TermFile and RndFile.
+*)
+    
+    FROM SYSTEM IMPORT ADDRESS ;
+    FROM IOLink IMPORT DeviceTablePtr;
+    FROM RTgenif IMPORT GenDevIF ;
+    
+    
+    (*
+       doreadchar - returns a CHAR from the file associated with, g.
+    *)
+    
+.. index::
+   doreadchar
+.. code-block:: modula2
+    PROCEDURE doreadchar (g: GenDevIF; d: DeviceTablePtr) : CHAR ;
+    
+    
+    (*
+       dounreadchar - pushes a CHAR back onto the file associated
+                      with, g.
+    *)
+    
+.. index::
+   dounreadchar
+.. code-block:: modula2
+    PROCEDURE dounreadchar (g: GenDevIF; d: DeviceTablePtr; ch: CHAR) : CHAR ;
+    
+    
+    (*
+       dogeterrno - returns the errno relating to the generic device.
+    *)
+    
+.. index::
+   dogeterrno
+.. code-block:: modula2
+    PROCEDURE dogeterrno (g: GenDevIF; d: DeviceTablePtr) : INTEGER ;
+    
+    
+    (*
+       dorbytes - reads upto, max, bytes setting, actual, and
+                  returning FALSE if an error (not due to eof)
+                  occurred.
+    *)
+    
+.. index::
+   dorbytes
+.. code-block:: modula2
+    PROCEDURE dorbytes (g: GenDevIF;
+                        d: DeviceTablePtr;
+                        to: ADDRESS;
+                        max: CARDINAL;
+                        VAR actual: CARDINAL) : BOOLEAN ;
+    
+    (*
+       dowbytes - writes up to, nBytes.  It returns FALSE
+                  if an error occurred and it sets actual
+                  to the amount of data written.
+    *)
+    
+.. index::
+   dowbytes
+.. code-block:: modula2
+    PROCEDURE dowbytes (g: GenDevIF;
+                        d: DeviceTablePtr;
+                        from: ADDRESS;
+                        nBytes: CARDINAL;
+                        VAR actual: CARDINAL) : BOOLEAN ;
+    
+    
+    (*
+       dowriteln - attempt to write an end of line marker to the
+                   file and returns TRUE if successful.
+    *)
+    
+.. index::
+   dowriteln
+.. code-block:: modula2
+    PROCEDURE dowriteln (g: GenDevIF; d: DeviceTablePtr) : BOOLEAN ;
+    
+    
+    (*
+       iseof - returns TRUE if end of file has been seen.
+    *)
+    
+.. index::
+   iseof
+.. code-block:: modula2
+    PROCEDURE iseof (g: GenDevIF; d: DeviceTablePtr) : BOOLEAN ;
+    
+    
+    (*
+       iseoln - returns TRUE if end of line has been seen.
+    *)
+    
+.. index::
+   iseoln
+.. code-block:: modula2
+    PROCEDURE iseoln (g: GenDevIF; d: DeviceTablePtr) : BOOLEAN ;
+    
+    
+    (*
+       iserror - returns TRUE if an error was seen on the device.
+                 Note that reaching EOF is not classified as an
+                 error.
+    *)
+    
+.. index::
+   iserror
+.. code-block:: modula2
+    PROCEDURE iserror (g: GenDevIF; d: DeviceTablePtr) : BOOLEAN ;
+    
+    
+    END RTfio.
+
+@c @node gm2-libs-iso/RTgen, gm2-libs-iso/RTgenif, gm2-libs-iso/RTfio, M2 ISO Libraries
+gm2-libs-iso/RTgen
+------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE RTgen ;
+
+(*
+    Description: provides a generic device interface between
+                 ISO channels and the underlying PIM style
+                 FIO procedure calls.
+*)
+    
+    FROM RTgenif IMPORT GenDevIF ;
+    FROM IOLink IMPORT DeviceId, DeviceTablePtr;
+    FROM IOConsts IMPORT ReadResults ;
+    FROM SYSTEM IMPORT ADDRESS ;
+    
+    
+    TYPE
+.. index::
+   pair: ChanDev; (type)
+.. code-block:: modula2
+       ChanDev ;
+.. index::
+   pair: DeviceType; (type)
+.. code-block:: modula2
+       DeviceType = (seqfile, streamfile, programargs, stdchans, term, socket, rndfile) ;
+    
+    
+    (*
+       InitChanDev - initialize and return a ChanDev.
+    *)
+    
+.. index::
+   InitChanDev
+.. code-block:: modula2
+    PROCEDURE InitChanDev (t: DeviceType; d: DeviceId; g: GenDevIF) : ChanDev ;
+    
+    
+    (*
+       KillChanDev - deallocates, g.
+    *)
+    
+.. index::
+   KillChanDev
+.. code-block:: modula2
+    PROCEDURE KillChanDev (g: GenDevIF) : GenDevIF ;
+    
+    
+    (*
+       RaiseEOFinLook - returns TRUE if the Look procedure
+                        should raise an exception if it
+                        sees end of file.
+    *)
+    
+.. index::
+   RaiseEOFinLook
+.. code-block:: modula2
+    PROCEDURE RaiseEOFinLook (g: ChanDev) : BOOLEAN ;
+    
+    
+    (*
+       RaiseEOFinSkip - returns TRUE if the Skip procedure
+                        should raise an exception if it
+                        sees end of file.
+    *)
+    
+.. index::
+   RaiseEOFinSkip
+.. code-block:: modula2
+    PROCEDURE RaiseEOFinSkip (g: ChanDev) : BOOLEAN ;
+    
+    
+.. index::
+   doLook
+.. code-block:: modula2
+    PROCEDURE doLook (g: ChanDev;
+                      d: DeviceTablePtr;
+                      VAR ch: CHAR;
+                      VAR r: ReadResults) ;
+    
+.. index::
+   doSkip
+.. code-block:: modula2
+    PROCEDURE doSkip (g: ChanDev;
+                      d: DeviceTablePtr) ;
+    
+.. index::
+   doSkipLook
+.. code-block:: modula2
+    PROCEDURE doSkipLook (g: ChanDev;
+                          d: DeviceTablePtr;
+                          VAR ch: CHAR;
+                          VAR r: ReadResults) ;
+    
+.. index::
+   doWriteLn
+.. code-block:: modula2
+    PROCEDURE doWriteLn (g: ChanDev;
+                         d: DeviceTablePtr) ;
+    
+.. index::
+   doReadText
+.. code-block:: modula2
+    PROCEDURE doReadText (g: ChanDev;
+                          d: DeviceTablePtr;
+                          to: ADDRESS;
+                          maxChars: CARDINAL;
+                          VAR charsRead: CARDINAL) ;
+    
+.. index::
+   doWriteText
+.. code-block:: modula2
+    PROCEDURE doWriteText (g: ChanDev;
+                           d: DeviceTablePtr;
+                           from: ADDRESS;
+                           charsToWrite: CARDINAL) ;
+    
+.. index::
+   doReadLocs
+.. code-block:: modula2
+    PROCEDURE doReadLocs (g: ChanDev;
+                          d: DeviceTablePtr;
+                          to: ADDRESS;
+                          maxLocs: CARDINAL;
+                          VAR locsRead: CARDINAL) ;
+    
+.. index::
+   doWriteLocs
+.. code-block:: modula2
+    PROCEDURE doWriteLocs (g: ChanDev;
+                           d: DeviceTablePtr;
+                           from: ADDRESS;
+                           locsToWrite: CARDINAL) ;
+    
+    (*
+       checkErrno - checks a number of errno conditions and raises
+                    appropriate ISO exceptions if they occur.
+    *)
+    
+.. index::
+   checkErrno
+.. code-block:: modula2
+    PROCEDURE checkErrno (g: ChanDev; d: DeviceTablePtr) ;
+    
+    
+    END RTgen.
+
+@c @node gm2-libs-iso/RTgenif, gm2-libs-iso/RTio, gm2-libs-iso/RTgen, M2 ISO Libraries
+gm2-libs-iso/RTgenif
+--------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE RTgenif ;
+
+(*
+    Description: provides a generic interface mechanism used
+                 by RTgen.  This is not an ISO module but rather
+                 a runtime support module.
+*)
+    
+    FROM SYSTEM IMPORT ADDRESS ;
+    FROM IOLink IMPORT DeviceId, DeviceTablePtr ;
+    
+    TYPE
+.. index::
+   pair: GenDevIF; (type)
+.. code-block:: modula2
+       GenDevIF ;
+.. index::
+   pair: readchar; (type)
+.. code-block:: modula2
+       readchar   = PROCEDURE (GenDevIF, DeviceTablePtr) : CHAR ;
+.. index::
+   pair: unreadchar; (type)
+.. code-block:: modula2
+       unreadchar = PROCEDURE (GenDevIF, DeviceTablePtr, CHAR) : CHAR ;
+.. index::
+   pair: geterrno; (type)
+.. code-block:: modula2
+       geterrno   = PROCEDURE (GenDevIF, DeviceTablePtr) : INTEGER ;
+.. index::
+   pair: readbytes; (type)
+.. code-block:: modula2
+       readbytes  = PROCEDURE (GenDevIF, DeviceTablePtr, ADDRESS, CARDINAL, VAR CARDINAL) : BOOLEAN ;
+.. index::
+   pair: writebytes; (type)
+.. code-block:: modula2
+       writebytes = PROCEDURE (GenDevIF, DeviceTablePtr, ADDRESS, CARDINAL, VAR CARDINAL) : BOOLEAN ;
+.. index::
+   pair: writeln; (type)
+.. code-block:: modula2
+       writeln    = PROCEDURE (GenDevIF, DeviceTablePtr) : BOOLEAN ;
+.. index::
+   pair: iseof; (type)
+.. code-block:: modula2
+       iseof      = PROCEDURE (GenDevIF, DeviceTablePtr) : BOOLEAN ;
+.. index::
+   pair: iseoln; (type)
+.. code-block:: modula2
+       iseoln     = PROCEDURE (GenDevIF, DeviceTablePtr) : BOOLEAN ;
+.. index::
+   pair: iserror; (type)
+.. code-block:: modula2
+       iserror    = PROCEDURE (GenDevIF, DeviceTablePtr) : BOOLEAN ;
+    
+    
+    (*
+       InitGenDevIF - initializes a generic device.
+    *)
+    
+.. index::
+   InitGenDevIF
+.. code-block:: modula2
+    PROCEDURE InitGenDevIF (d     : DeviceId;
+                            rc    : readchar;
+                            urc   : unreadchar;
+                            geterr: geterrno;
+                            rbytes: readbytes;
+                            wbytes: writebytes;
+                            wl    : writeln;
+                            eof   : iseof;
+                            eoln  : iseoln;
+                            iserr : iserror) : GenDevIF ;
+    
+    
+    (*
+       getDID - returns the device id this generic interface.
+    *)
+    
+.. index::
+   getDID
+.. code-block:: modula2
+    PROCEDURE getDID (g: GenDevIF) : DeviceId ;
+    
+    
+    (*
+       doReadChar - returns the next character from the generic
+                    device.
+    *)
+    
+.. index::
+   doReadChar
+.. code-block:: modula2
+    PROCEDURE doReadChar (g: GenDevIF; d: DeviceTablePtr) : CHAR ;
+    
+    
+    (*
+       doUnReadChar - pushes back a character to the generic device.
+    *)
+    
+.. index::
+   doUnReadChar
+.. code-block:: modula2
+    PROCEDURE doUnReadChar (g: GenDevIF; d: DeviceTablePtr; ch: CHAR) : CHAR ;
+    
+    
+    (*
+       doGetErrno - returns the errno relating to the generic device.
+    *)
+    
+.. index::
+   doGetErrno
+.. code-block:: modula2
+    PROCEDURE doGetErrno (g: GenDevIF; d: DeviceTablePtr) : INTEGER ;
+    
+    
+    (*
+       doRBytes - attempts to read, n, bytes from the generic device.
+                  It set the actual amount read and returns a boolean
+                  to determine whether an error occurred.
+    *)
+    
+.. index::
+   doRBytes
+.. code-block:: modula2
+    PROCEDURE doRBytes (g: GenDevIF; d: DeviceTablePtr;
+                        to: ADDRESS; max: CARDINAL;
+                        VAR actual: CARDINAL) : BOOLEAN ;
+    
+    
+    (*
+       doWBytes - attempts to write, n, bytes to the generic device.
+                  It sets the actual amount written and returns a
+                  boolean to determine whether an error occurred.
+    *)
+    
+.. index::
+   doWBytes
+.. code-block:: modula2
+    PROCEDURE doWBytes (g: GenDevIF; d: DeviceTablePtr;
+                        from: ADDRESS; max: CARDINAL;
+                        VAR actual: CARDINAL) : BOOLEAN ;
+    
+    
+    (*
+       doWrLn - writes an end of line marker and returns
+                TRUE if successful.
+    *)
+    
+.. index::
+   doWrLn
+.. code-block:: modula2
+    PROCEDURE doWrLn (g: GenDevIF; d: DeviceTablePtr) : BOOLEAN ;
+    
+    
+    (*
+       isEOF - returns true if the end of file was reached.
+    *)
+    
+.. index::
+   isEOF
+.. code-block:: modula2
+    PROCEDURE isEOF (g: GenDevIF; d: DeviceTablePtr) : BOOLEAN ;
+    
+    
+    (*
+       isEOLN - returns true if the end of line was reached.
+    *)
+    
+.. index::
+   isEOLN
+.. code-block:: modula2
+    PROCEDURE isEOLN (g: GenDevIF; d: DeviceTablePtr) : BOOLEAN ;
+    
+    
+    (*
+       isError - returns true if an error was seen in the device.
+    *)
+    
+.. index::
+   isError
+.. code-block:: modula2
+    PROCEDURE isError (g: GenDevIF; d: DeviceTablePtr) : BOOLEAN ;
+    
+    
+    (*
+       KillGenDevIF - deallocates a generic device.
+    *)
+    
+.. index::
+   KillGenDevIF
+.. code-block:: modula2
+    PROCEDURE KillGenDevIF (g: GenDevIF) : GenDevIF ;
+    
+    
+    END RTgenif.
+
+@c @node gm2-libs-iso/RTio, gm2-libs-iso/RandomNumber, gm2-libs-iso/RTgenif, M2 ISO Libraries
+gm2-libs-iso/RTio
+-----------------
+
+.. code-block:: modula2
+    DEFINITION MODULE RTio ;
+
+(*
+    Description: provides low level routines for creating and destroying
+                 ChanIds.  This is necessary to allow multiple modules
+                 to create, ChanId values, where ChanId is an opaque
+                 type.
+*)
+    
+    IMPORT FIO, IOLink ;
+    
+    TYPE
+.. index::
+   pair: ChanId; (type)
+.. code-block:: modula2
+       ChanId ;
+    
+    
+    (*
+       InitChanId - return a new ChanId.
+    *)
+    
+.. index::
+   InitChanId
+.. code-block:: modula2
+    PROCEDURE InitChanId () : ChanId ;
+    
+    
+    (*
+       KillChanId - deallocate a ChanId.
+    *)
+    
+.. index::
+   KillChanId
+.. code-block:: modula2
+    PROCEDURE KillChanId (c: ChanId) : ChanId ;
+    
+    
+    (*
+       NilChanId - return a NIL pointer.
+    *)
+    
+.. index::
+   NilChanId
+.. code-block:: modula2
+    PROCEDURE NilChanId () : ChanId ;
+    
+    
+    (*
+       GetDeviceId - returns the device id, from, c.
+    *)
+    
+.. index::
+   GetDeviceId
+.. code-block:: modula2
+    PROCEDURE GetDeviceId (c: ChanId) : IOLink.DeviceId ;
+    
+    
+    (*
+       SetDeviceId - sets the device id in, c.
+    *)
+    
+.. index::
+   SetDeviceId
+.. code-block:: modula2
+    PROCEDURE SetDeviceId (c: ChanId; d: IOLink.DeviceId) ;
+    
+    
+    (*
+       GetDevicePtr - returns the device table ptr, from, c.
+    *)
+    
+.. index::
+   GetDevicePtr
+.. code-block:: modula2
+    PROCEDURE GetDevicePtr (c: ChanId) : IOLink.DeviceTablePtr ;
+    
+    
+    (*
+       SetDevicePtr - sets the device table ptr in, c.
+    *)
+    
+.. index::
+   SetDevicePtr
+.. code-block:: modula2
+    PROCEDURE SetDevicePtr (c: ChanId; p: IOLink.DeviceTablePtr) ;
+    
+    
+    (*
+       GetFile - returns the file field from, c.
+    *)
+    
+.. index::
+   GetFile
+.. code-block:: modula2
+    PROCEDURE GetFile (c: ChanId) : FIO.File ;
+    
+    
+    (*
+       SetFile - sets the file field in, c.
+    *)
+    
+.. index::
+   SetFile
+.. code-block:: modula2
+    PROCEDURE SetFile (c: ChanId; f: FIO.File) ;
+    
+    
+    END RTio.
+
+@c @node gm2-libs-iso/RandomNumber, gm2-libs-iso/RawIO, gm2-libs-iso/RTio, M2 ISO Libraries
+gm2-libs-iso/RandomNumber
+-------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE RandomNumber ;
+
+(*
+    Description: provides primitives for obtaining random numbers on
+                 pervasive data types.
+*)
+    
+    FROM SYSTEM IMPORT BYTE ;
+    EXPORT QUALIFIED Randomize, RandomInit, RandomBytes,
+                     RandomCard, RandomShortCard, RandomLongCard,
+                     RandomInt, RandomShortInt, RandomLongInt,
+                     RandomReal, RandomLongReal, RandomShortReal ;
+    
+    
+    (*
+       Randomize - initialize the random number generator with a seed
+                   based on the microseconds.
+    *)
+    
+.. index::
+   Randomize
+.. code-block:: modula2
+    PROCEDURE Randomize ;
+    
+    
+    (*
+       RandomInit - initialize the random number generator with value, seed.
+    *)
+    
+.. index::
+   RandomInit
+.. code-block:: modula2
+    PROCEDURE RandomInit (seed: CARDINAL) ;
+    
+    
+    (*
+       RandomBytes - fills in an array with random values.
+    *)
+    
+.. index::
+   RandomBytes
+.. code-block:: modula2
+    PROCEDURE RandomBytes (VAR a: ARRAY OF BYTE) ;
+    
+    
+    (*
+       RandomInt - return an INTEGER in the range [low .. high].
+    *)
+    
+.. index::
+   RandomInt
+.. code-block:: modula2
+    PROCEDURE RandomInt (low, high: INTEGER) : INTEGER ;
+    
+    
+    (*
+       RandomShortInt - return an SHORTINT in the range [low..high].
+    *)
+    
+.. index::
+   RandomShortInt
+.. code-block:: modula2
+    PROCEDURE RandomShortInt (low, high: SHORTINT) : SHORTINT ;
+    
+    
+    (*
+       RandomLongInt - return an LONGINT in the range [low..high].
+    *)
+    
+.. index::
+   RandomLongInt
+.. code-block:: modula2
+    PROCEDURE RandomLongInt (low, high: LONGINT) : LONGINT ;
+    
+    
+    (*
+       RandomShortCard - return a SHORTCARD in the range [low..high].
+    *)
+    
+.. index::
+   RandomShortCard
+.. code-block:: modula2
+    PROCEDURE RandomShortCard (low, high: CARDINAL) : CARDINAL ;
+    
+    
+    (*
+       RandomCard - return a CARDINAL in the range [low..high].
+    *)
+    
+.. index::
+   RandomCard
+.. code-block:: modula2
+    PROCEDURE RandomCard (low, high: CARDINAL) : CARDINAL ;
+    
+    
+    (*
+       RandomLongCard - return an LONGCARD in the range [low..high].
+    *)
+    
+.. index::
+   RandomLongCard
+.. code-block:: modula2
+    PROCEDURE RandomLongCard (low, high: LONGCARD) : LONGCARD ;
+    
+    
+    (*
+       RandomReal - return a REAL number in the range 0.0..1.0
+    *)
+    
+.. index::
+   RandomReal
+.. code-block:: modula2
+    PROCEDURE RandomReal () : REAL ;
+    
+    
+    (*
+       RandomShortReal - return a SHORTREAL number in the range 0.0..1.0
+    *)
+    
+.. index::
+   RandomShortReal
+.. code-block:: modula2
+    PROCEDURE RandomShortReal () : SHORTREAL ;
+    
+    
+    (*
+       RandomLongReal - return a LONGREAL number in the range 0.0..1.0
+    *)
+    
+.. index::
+   RandomLongReal
+.. code-block:: modula2
+    PROCEDURE RandomLongReal () : LONGREAL ;
+    
+    
+    END RandomNumber.
+
+@c @node gm2-libs-iso/RawIO, gm2-libs-iso/RealConv, gm2-libs-iso/RandomNumber, M2 ISO Libraries
+gm2-libs-iso/RawIO
+------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE RawIO;
+
+  (* Reading and writing data over specified channels using raw
+     operations, that is, with no conversion or interpretation.
+     The read result is of the type IOConsts.ReadResults.
+  *)
+    
+    IMPORT IOChan, SYSTEM;
+    
+.. index::
+   Read
+.. code-block:: modula2
+    PROCEDURE Read (cid: IOChan.ChanId; VAR to: ARRAY OF SYSTEM.LOC);
+      (* Reads storage units from cid, and assigns them to
+         successive components of to. The read result is set
+         to the value allRight, wrongFormat, or endOfInput.
+      *)
+    
+.. index::
+   Write
+.. code-block:: modula2
+    PROCEDURE Write (cid: IOChan.ChanId; from: ARRAY OF SYSTEM.LOC);
+      (* Writes storage units to cid from successive components
+         of from. *)
+    
+    END RawIO.
+    
+
+@c @node gm2-libs-iso/RealConv, gm2-libs-iso/RealIO, gm2-libs-iso/RawIO, M2 ISO Libraries
+gm2-libs-iso/RealConv
+---------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE RealConv;
+
+  (* Low-level REAL/string conversions *)
+    
+    IMPORT
+      ConvTypes;
+    
+    TYPE
+      (* strAllRight, strOutOfRange, strWrongFormat, strEmpty *)
+.. index::
+   pair: ConvResults; (type)
+.. code-block:: modula2
+      ConvResults = ConvTypes.ConvResults;
+    
+.. index::
+   ScanReal
+.. code-block:: modula2
+    PROCEDURE ScanReal (inputCh: CHAR; VAR chClass: ConvTypes.ScanClass;
+                        VAR nextState: ConvTypes.ScanState);
+      (* Represents the start state of a finite state scanner for real
+         numbers - assigns class of inputCh to chClass and a procedure
+         representing the next state to nextState.
+       *)
+    
+.. index::
+   FormatReal
+.. code-block:: modula2
+    PROCEDURE FormatReal (str: ARRAY OF CHAR): ConvResults;
+      (* Returns the format of the string value for conversion to REAL. *)
+    
+.. index::
+   ValueReal
+.. code-block:: modula2
+    PROCEDURE ValueReal (str: ARRAY OF CHAR): REAL;
+      (* Returns the value corresponding to the real number string value
+         str if str is well-formed; otherwise raises the RealConv
+         exception.
+      *)
+    
+.. index::
+   LengthFloatReal
+.. code-block:: modula2
+    PROCEDURE LengthFloatReal (real: REAL; sigFigs: CARDINAL): CARDINAL;
+      (* Returns the number of characters in the floating-point string
+         representation of real with sigFigs significant figures.
+      *)
+    
+.. index::
+   LengthEngReal
+.. code-block:: modula2
+    PROCEDURE LengthEngReal (real: REAL; sigFigs: CARDINAL): CARDINAL;
+      (* Returns the number of characters in the floating-point engineering
+         string representation of real with sigFigs significant figures.
+      *)
+    
+.. index::
+   LengthFixedReal
+.. code-block:: modula2
+    PROCEDURE LengthFixedReal (real: REAL; place: INTEGER): CARDINAL;
+      (* Returns the number of characters in the fixed-point string
+         representation of real rounded to the given place relative to the
+         decimal point.
+      *)
+    
+.. index::
+   IsRConvException
+.. code-block:: modula2
+    PROCEDURE IsRConvException (): BOOLEAN;
+      (* Returns TRUE if the current coroutine is in the exceptional
+         execution state because of the raising of an exception in a
+         routine from this module; otherwise returns FALSE.
+      *)
+    
+    END RealConv.
+
+@c @node gm2-libs-iso/RealIO, gm2-libs-iso/RealMath, gm2-libs-iso/RealConv, M2 ISO Libraries
+gm2-libs-iso/RealIO
+-------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE RealIO;
+
+  (* Input and output of real numbers in decimal text form
+     over specified channels.  The read result is of the
+     type IOConsts.ReadResults.
+  *)
+    
+    IMPORT IOChan;
+    
+      (* The text form of a signed fixed-point real number is
+           ["+" | "-"], decimal digit, {decimal digit},
+           [".", {decimal digit}]
+    
+         The text form of a signed floating-point real number is
+           signed fixed-point real number,
+           "E", ["+" | "-"], decimal digit, {decimal digit}
+      *)
+    
+.. index::
+   ReadReal
+.. code-block:: modula2
+    PROCEDURE ReadReal (cid: IOChan.ChanId; VAR real: REAL);
+      (* Skips leading spaces, and removes any remaining characters
+         from cid that form part of a signed fixed or floating
+         point number.  The value of this number is assigned to real.
+         The read result is set to the value allRight, outOfRange,
+         wrongFormat, endOfLine, or endOfInput.
+      *)
+    
+.. index::
+   WriteFloat
+.. code-block:: modula2
+    PROCEDURE WriteFloat (cid: IOChan.ChanId; real: REAL;
+                          sigFigs: CARDINAL; width: CARDINAL);
+      (* Writes the value of real to cid in floating-point text form,
+         with sigFigs significant figures, in a field of the given
+         minimum width.
+      *)
+    
+.. index::
+   WriteEng
+.. code-block:: modula2
+    PROCEDURE WriteEng (cid: IOChan.ChanId; real: REAL;
+                        sigFigs: CARDINAL; width: CARDINAL);
+      (* As for WriteFloat, except that the number is scaled with
+         one to three digits in the whole number part, and with an
+         exponent that is a multiple of three.
+      *)
+    
+.. index::
+   WriteFixed
+.. code-block:: modula2
+    PROCEDURE WriteFixed (cid: IOChan.ChanId; real: REAL;
+                          place: INTEGER; width: CARDINAL);
+      (* Writes the value of real to cid in fixed-point text form,
+         rounded to the given place relative to the decimal point,
+         in a field of the given minimum width.
+      *)
+    
+.. index::
+   WriteReal
+.. code-block:: modula2
+    PROCEDURE WriteReal (cid: IOChan.ChanId;
+                         real: REAL; width: CARDINAL);
+      (* Writes the value of real to cid, as WriteFixed if the sign
+         and magnitude can be shown in the given width, or otherwise
+         as WriteFloat.  The number of places or significant digits
+         depends on the given width.
+      *)
+    
+    END RealIO.
+
+@c @node gm2-libs-iso/RealMath, gm2-libs-iso/RealStr, gm2-libs-iso/RealIO, M2 ISO Libraries
+gm2-libs-iso/RealMath
+---------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE RealMath;
+
+  (* Mathematical functions for the type REAL *)
+    
+    CONST
+.. index::
+   pair: pi; (const)
+.. code-block:: modula2
+      pi   = 3.1415926535897932384626433832795028841972;
+.. index::
+   pair: exp1; (const)
+.. code-block:: modula2
+      exp1 = 2.7182818284590452353602874713526624977572;
+    
+.. index::
+   sqrt
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sqrt (x: REAL): REAL;
+      (* Returns the positive square root of x *)
+    
+.. index::
+   exp
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ exp (x: REAL): REAL;
+      (* Returns the exponential of x *)
+    
+.. index::
+   ln
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ ln (x: REAL): REAL;
+      (* Returns the natural logarithm of x *)
+    
+      (* The angle in all trigonometric functions is measured in radians *)
+    
+.. index::
+   sin
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ sin (x: REAL): REAL;
+      (* Returns the sine of x *)
+    
+.. index::
+   cos
+.. code-block:: modula2
+    PROCEDURE __BUILTIN__ cos (x: REAL): REAL;
+      (* Returns the cosine of x *)
+    
+.. index::
+   tan
+.. code-block:: modula2
+    PROCEDURE tan (x: REAL): REAL;
+      (* Returns the tangent of x *)
+    
+.. index::
+   arcsin
+.. code-block:: modula2
+    PROCEDURE arcsin (x: REAL): REAL;
+      (* Returns the arcsine of x *)
+    
+.. index::
+   arccos
+.. code-block:: modula2
+    PROCEDURE arccos (x: REAL): REAL;
+      (* Returns the arccosine of x *)
+    
+.. index::
+   arctan
+.. code-block:: modula2
+    PROCEDURE arctan (x: REAL): REAL;
+      (* Returns the arctangent of x *)
+    
+.. index::
+   power
+.. code-block:: modula2
+    PROCEDURE power (base, exponent: REAL) : REAL;
+      (* Returns the value of the number base raised to the power exponent *)
+    
+.. index::
+   round
+.. code-block:: modula2
+    PROCEDURE round (x: REAL) : INTEGER;
+      (* Returns the value of x rounded to the nearest integer *)
+    
+.. index::
+   IsRMathException
+.. code-block:: modula2
+    PROCEDURE IsRMathException () : BOOLEAN;
+      (* Returns TRUE if the current coroutine is in the exceptional execution state
+         because of the raising of an exception in a routine from this module; otherwise
+         returns FALSE.
+      *)
+    
+    END RealMath.
+    
+
+@c @node gm2-libs-iso/RealStr, gm2-libs-iso/RndFile, gm2-libs-iso/RealMath, M2 ISO Libraries
+gm2-libs-iso/RealStr
+--------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE RealStr;
+
+  (* REAL/string conversions *)
+    
+    IMPORT
+      ConvTypes;
+    
+    TYPE
+      (* strAllRight, strOutOfRange, strWrongFormat, strEmpty *)
+.. index::
+   pair: ConvResults; (type)
+.. code-block:: modula2
+      ConvResults = ConvTypes.ConvResults;
+    
+    (* the string form of a signed fixed-point real number is
+         ["+" | "-"], decimal digit, {decimal digit}, [".",
+         {decimal digit}]
+    *)
+    
+    (* the string form of a signed floating-point real number is
+         signed fixed-point real number, "E", ["+" | "-"],
+         decimal digit, {decimal digit}
+    *)
+    
+.. index::
+   StrToReal
+.. code-block:: modula2
+    PROCEDURE StrToReal (str: ARRAY OF CHAR; VAR real: REAL;
+                         VAR res: ConvResults);
+      (* Ignores any leading spaces in str. If the subsequent characters
+         in str are in the format of a signed real number, assigns a
+         corresponding value to real.  Assigns a value indicating the
+         format of str to res.
+      *)
+    
+.. index::
+   RealToFloat
+.. code-block:: modula2
+    PROCEDURE RealToFloat (real: REAL; sigFigs: CARDINAL;
+                           VAR str: ARRAY OF CHAR);
+      (* Converts the value of real to floating-point string form, with
+         sigFigs significant figures, and copies the possibly truncated
+         result to str.
+      *)
+    
+.. index::
+   RealToEng
+.. code-block:: modula2
+    PROCEDURE RealToEng (real: REAL; sigFigs: CARDINAL;
+                         VAR str: ARRAY OF CHAR);
+      (* Converts the value of real to floating-point string form, with
+         sigFigs significant figures, and copies the possibly truncated
+         result to str.  The number is scaled with one to three digits
+         in the whole number part and with an exponent that is a multiple
+         of three.
+      *)
+    
+.. index::
+   RealToFixed
+.. code-block:: modula2
+    PROCEDURE RealToFixed (real: REAL; place: INTEGER;
+                           VAR str: ARRAY OF CHAR);
+      (* Converts the value of real to fixed-point string form, rounded
+         to the given place relative to the decimal point, and copies
+         the possibly truncated result to str.
+      *)
+    
+.. index::
+   RealToStr
+.. code-block:: modula2
+    PROCEDURE RealToStr (real: REAL; VAR str: ARRAY OF CHAR);
+      (* Converts the value of real as RealToFixed if the sign and
+         magnitude can be shown within the capacity of str, or
+         otherwise as RealToFloat, and copies the possibly truncated
+         result to str. The number of places or significant digits are
+         implementation-defined.
+      *)
+    
+    END RealStr.
+    
+
+@c @node gm2-libs-iso/RndFile, gm2-libs-iso/SIOResult, gm2-libs-iso/RealStr, M2 ISO Libraries
+gm2-libs-iso/RndFile
+--------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE RndFile;
+
+  (* Random access files *)
+    
+    IMPORT IOChan, ChanConsts, SYSTEM;
+    
+    TYPE
+.. index::
+   pair: ChanId; (type)
+.. code-block:: modula2
+       ChanId = IOChan.ChanId;
+.. index::
+   pair: FlagSet; (type)
+.. code-block:: modula2
+       FlagSet = ChanConsts.FlagSet;
+.. index::
+   pair: OpenResults; (type)
+.. code-block:: modula2
+       OpenResults = ChanConsts.OpenResults;
+    
+       (* Accepted singleton values of FlagSet *)
+    
+    CONST
+       (* input operations are requested/available *)
+.. index::
+   pair: read; (const)
+.. code-block:: modula2
+       read = FlagSet{ChanConsts.readFlag};
+       (* output operations are requested/available *)
+.. index::
+   pair: write; (const)
+.. code-block:: modula2
+       write = FlagSet{ChanConsts.writeFlag};
+       (* a file may/must/did exist before the channel is opened *)
+.. index::
+   pair: old; (const)
+.. code-block:: modula2
+       old = FlagSet{ChanConsts.oldFlag};
+       (* text operations are requested/available *)
+.. index::
+   pair: text; (const)
+.. code-block:: modula2
+       text = FlagSet{ChanConsts.textFlag};
+       (* raw operations are requested/available *)
+.. index::
+   pair: raw; (const)
+.. code-block:: modula2
+       raw = FlagSet{ChanConsts.rawFlag};
+    
+.. index::
+   OpenOld
+.. code-block:: modula2
+    PROCEDURE OpenOld (VAR cid: ChanId; name: ARRAY OF CHAR; flags: FlagSet;
+                       VAR res: OpenResults);
+      (* Attempts to obtain and open a channel connected to a stored random
+         access file of the given name.
+         The old flag is implied; without the write flag, read is implied;
+         without the text flag, raw is implied.
+         If successful, assigns to cid the identity of the opened channel,
+         assigns the value opened to res, and sets the read/write position
+         to the start of the file.
+         If a channel cannot be opened as required, the value of res indicates
+         the reason, and cid identifies the invalid channel.
+      *)
+    
+.. index::
+   OpenClean
+.. code-block:: modula2
+    PROCEDURE OpenClean (VAR cid: ChanId; name: ARRAY OF CHAR; flags: FlagSet;
+                         VAR res: OpenResults);
+      (* Attempts to obtain and open a channel connected to a stored random
+         access file of the given name.
+         The write flag is implied; without the text flag, raw is implied.
+         If successful, assigns to cid the identity of the opened channel,
+         assigns the value opened to res, and truncates the file to zero length.
+         If a channel cannot be opened as required, the value of res indicates
+         the reason, and cid identifies the invalid channel.
+      *)
+    
+.. index::
+   IsRndFile
+.. code-block:: modula2
+    PROCEDURE IsRndFile (cid: ChanId): BOOLEAN;
+      (* Tests if the channel identified by cid is open to a random access file. *)
+    
+.. index::
+   IsRndFileException
+.. code-block:: modula2
+    PROCEDURE IsRndFileException (): BOOLEAN;
+      (* Returns TRUE if the current coroutine is in the exceptional execution
+         state because of the raising of a RndFile exception; otherwise returns
+         FALSE.
+      *)
+    
+    CONST
+.. index::
+   pair: FilePosSize; (const)
+.. code-block:: modula2
+       FilePosSize = SIZE(LONGINT) ;
+       (* <implementation-defined whole number greater than zero>; *)
+    
+    TYPE
+.. index::
+   pair: FilePos; (type)
+.. code-block:: modula2
+       FilePos = LONGINT ;  (* ARRAY [1 .. FilePosSize] OF SYSTEM.LOC; *)
+    
+.. index::
+   StartPos
+.. code-block:: modula2
+    PROCEDURE StartPos (cid: ChanId): FilePos;
+      (* If the channel identified by cid is not open to a random access file,
+         the exception wrongDevice is raised; otherwise returns the position of
+         the start of the file.
+      *)
+    
+.. index::
+   CurrentPos
+.. code-block:: modula2
+    PROCEDURE CurrentPos (cid: ChanId): FilePos;
+      (* If the channel identified by cid is not open to a random access file,
+         the exception wrongDevice is raised; otherwise returns the position
+         of the current read/write position.
+      *)
+    
+.. index::
+   EndPos
+.. code-block:: modula2
+    PROCEDURE EndPos (cid: ChanId): FilePos;
+      (* If the channel identified by cid is not open to a random access file,
+         the exception wrongDevice is raised; otherwise returns the first
+         position after which there have been no writes.
+      *)
+    
+.. index::
+   NewPos
+.. code-block:: modula2
+    PROCEDURE NewPos (cid: ChanId; chunks: INTEGER; chunkSize: CARDINAL;
+                      from: FilePos): FilePos;
+      (* If the channel identified by cid is not open to a random access file,
+         the exception wrongDevice is raised; otherwise returns the position
+         (chunks * chunkSize) relative to the position given by from, or
+         raises the exception posRange if the required position cannot be
+         represented as a value of type FilePos.
+      *)
+    
+.. index::
+   SetPos
+.. code-block:: modula2
+    PROCEDURE SetPos (cid: ChanId; pos: FilePos);
+      (* If the channel identified by cid is not open to a random access file,
+         the exception wrongDevice is raised; otherwise sets the read/write
+         position to the value given by pos.
+      *)
+    
+.. index::
+   Close
+.. code-block:: modula2
+    PROCEDURE Close (VAR cid: ChanId);
+      (* If the channel identified by cid is not open to a random access file,
+         the exception wrongDevice is raised; otherwise closes the channel,
+         and assigns the value identifying the invalid channel to cid.
+      *)
+    
+    END RndFile.
+
+@c @node gm2-libs-iso/SIOResult, gm2-libs-iso/SLongIO, gm2-libs-iso/RndFile, M2 ISO Libraries
+gm2-libs-iso/SIOResult
+----------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE SIOResult;
+
+  (* Read results for the default input channel *)
+    
+    IMPORT IOConsts;
+    
+    TYPE
+.. index::
+   pair: ReadResults; (type)
+.. code-block:: modula2
+      ReadResults = IOConsts.ReadResults;
+    
+      (*
+.. index::
+   pair: ReadResults; (type)
+.. code-block:: modula2
+        ReadResults =   (* This type is used to classify the result of an input operation *)
+        (
+          notKnown,     (* no read result is set *)
+          allRight,     (* data is as expected or as required *)
+          outOfRange,   (* data cannot be represented *)
+          wrongFormat,  (* data not in expected format *)
+          endOfLine,    (* end of line seen before expected data *)
+          endOfInput    (* end of input seen before expected data *)
+        );
+      *)
+    
+.. index::
+   ReadResult
+.. code-block:: modula2
+    PROCEDURE ReadResult (): ReadResults;
+      (* Returns the result for the last read operation on the default input channel. *)
+    
+    END SIOResult.
+    
+
+@c @node gm2-libs-iso/SLongIO, gm2-libs-iso/SLongWholeIO, gm2-libs-iso/SIOResult, M2 ISO Libraries
+gm2-libs-iso/SLongIO
+--------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE SLongIO;
+
+  (* Input and output of long real numbers in decimal text form
+     using default channels.  The read result is of the type
+     IOConsts.ReadResults.
+  *)
+    
+      (* The text form of a signed fixed-point real number is
+           ["+" | "-"], decimal digit, {decimal digit},
+           [".", {decimal digit}]
+    
+         The text form of a signed floating-point real number is
+           signed fixed-point real number,
+           "E", ["+" | "-"], decimal digit, {decimal digit}
+      *)
+    
+.. index::
+   ReadReal
+.. code-block:: modula2
+    PROCEDURE ReadReal (VAR real: LONGREAL);
+      (* Skips leading spaces, and removes any remaining characters
+         from the default input channel that form part of a signed
+         fixed or floating point number. The value of this number
+         is assigned to real.  The read result is set to the value
+         allRight, outOfRange, wrongFormat, endOfLine, or endOfInput.
+      *)
+    
+.. index::
+   WriteFloat
+.. code-block:: modula2
+    PROCEDURE WriteFloat (real: LONGREAL; sigFigs: CARDINAL;
+                          width: CARDINAL);
+      (* Writes the value of real to the default output channel in
+         floating-point text form, with sigFigs significant figures,
+         in a field of the given minimum width.
+      *)
+    
+.. index::
+   WriteEng
+.. code-block:: modula2
+    PROCEDURE WriteEng (real: LONGREAL; sigFigs: CARDINAL;
+                        width: CARDINAL);
+      (* As for WriteFloat, except that the number is scaled with
+         one to three digits in the whole number part, and with an
+         exponent that is a multiple of three.
+      *)
+    
+.. index::
+   WriteFixed
+.. code-block:: modula2
+    PROCEDURE WriteFixed (real: LONGREAL; place: INTEGER;
+                          width: CARDINAL);
+      (* Writes the value of real to the default output channel in
+         fixed-point text form, rounded to the given place relative
+         to the decimal point, in a field of the given minimum width.
+      *)
+    
+.. index::
+   WriteReal
+.. code-block:: modula2
+    PROCEDURE WriteReal (real: LONGREAL; width: CARDINAL);
+      (* Writes the value of real to the default output channel, as
+         WriteFixed if the sign and magnitude can be shown in the
+         given width, or otherwise as WriteFloat. The number of
+         places or significant digits depends on the given width.
+      *)
+    
+    END SLongIO.
+    
+
+@c @node gm2-libs-iso/SLongWholeIO, gm2-libs-iso/SRawIO, gm2-libs-iso/SLongIO, M2 ISO Libraries
+gm2-libs-iso/SLongWholeIO
+-------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE SLongWholeIO;
+
+  (* Input and output of whole numbers in decimal text form over
+     default channels.  The read result is of the type
+     IOConsts.ReadResults.
+  *)
+    
+      (* The text form of a signed whole number is
+           ["+" | "-"], decimal digit, {decimal digit}
+    
+         The text form of an unsigned whole number is
+           decimal digit, {decimal digit}
+      *)
+    
+.. index::
+   ReadInt
+.. code-block:: modula2
+    PROCEDURE ReadInt (VAR int: LONGINT);
+      (* Skips leading spaces, and removes any remaining characters
+         from the default input channel that form part of a signed
+         whole number.  The value of this number is assigned
+         to int.  The read result is set to the value allRight,
+         outOfRange, wrongFormat, endOfLine, or endOfInput.
+      *)
+    
+.. index::
+   WriteInt
+.. code-block:: modula2
+    PROCEDURE WriteInt (int: LONGINT; width: CARDINAL);
+      (* Writes the value of int to the default output channel in
+         text form, in a field of the given minimum width.
+      *)
+    
+.. index::
+   ReadCard
+.. code-block:: modula2
+    PROCEDURE ReadCard (VAR card: LONGCARD);
+      (* Skips leading spaces, and removes any remaining characters
+         from the default input channel that form part of an
+         unsigned whole number.  The value of this number is
+         assigned to card.  The read result is set to the value
+         allRight, outOfRange, wrongFormat, endOfLine, or endOfInput.
+      *)
+    
+.. index::
+   WriteCard
+.. code-block:: modula2
+    PROCEDURE WriteCard (card: LONGCARD; width: CARDINAL);
+      (* Writes the value of card to the default output channel in
+         text form, in a field of the given minimum width.
+      *)
+    
+    END SLongWholeIO.
+
+@c @node gm2-libs-iso/SRawIO, gm2-libs-iso/SRealIO, gm2-libs-iso/SLongWholeIO, M2 ISO Libraries
+gm2-libs-iso/SRawIO
+-------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE SRawIO;
+
+  (* Reading and writing data over default channels using raw operations, that is, with no
+     conversion or interpretation. The read result is of the type IOConsts.ReadResults.
+  *)
+    
+    IMPORT SYSTEM;
+    
+.. index::
+   Read
+.. code-block:: modula2
+    PROCEDURE Read (VAR to: ARRAY OF SYSTEM.LOC);
+      (* Reads storage units from the default input channel, and assigns them to successive
+         components of to.  The read result is set to the value allRight, wrongFormat, or
+         endOfInput.
+      *)
+    
+.. index::
+   Write
+.. code-block:: modula2
+    PROCEDURE Write (from: ARRAY OF SYSTEM.LOC);
+      (* Writes storage units to the default output channel from successive components of from.
+      *)
+    
+    END SRawIO.
+    
+
+@c @node gm2-libs-iso/SRealIO, gm2-libs-iso/SShortIO, gm2-libs-iso/SRawIO, M2 ISO Libraries
+gm2-libs-iso/SRealIO
+--------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE SRealIO;
+
+  (* Input and output of real numbers in decimal text form over
+     default channels.  The read result is of the type
+     IOConsts.ReadResults.
+  *)
+    
+      (* The text form of a signed fixed-point real number is
+           ["+" | "-"], decimal digit, {decimal digit},
+           [".", {decimal digit}]
+    
+         The text form of a signed floating-point real number is
+           signed fixed-point real number,
+           "E", ["+" | "-"], decimal digit, {decimal digit}
+      *)
+    
+.. index::
+   ReadReal
+.. code-block:: modula2
+    PROCEDURE ReadReal (VAR real: REAL);
+      (* Skips leading spaces, and removes any remaining characters
+         from the default input channel that form part of a signed
+         fixed or floating point number. The value of this number
+         is assigned to real.  The read result is set to the value
+         allRight, outOfRange, wrongFormat, endOfLine, or endOfInput.
+      *)
+    
+.. index::
+   WriteFloat
+.. code-block:: modula2
+    PROCEDURE WriteFloat (real: REAL; sigFigs: CARDINAL; width: CARDINAL);
+      (* Writes the value of real to the default output channel in
+         floating-point text form, with sigFigs significant figures,
+         in a field of the given minimum width.
+      *)
+    
+.. index::
+   WriteEng
+.. code-block:: modula2
+    PROCEDURE WriteEng (real: REAL; sigFigs: CARDINAL; width: CARDINAL);
+      (* As for WriteFloat, except that the number is scaled with one to
+         three digits in the whole number part, and with an exponent that
+         is a multiple of three.
+      *)
+    
+.. index::
+   WriteFixed
+.. code-block:: modula2
+    PROCEDURE WriteFixed (real: REAL; place: INTEGER; width: CARDINAL);
+      (* Writes the value of real to the default output channel in
+         fixed-point text form, rounded to the given place relative
+         to the decimal point, in a field of the given minimum width.
+      *)
+    
+.. index::
+   WriteReal
+.. code-block:: modula2
+    PROCEDURE WriteReal (real: REAL; width: CARDINAL);
+      (* Writes the value of real to the default output channel, as
+         WriteFixed if the sign and magnitude can be shown in the
+         given width, or otherwise as WriteFloat. The number of
+         places or significant digits depends on the given width.
+      *)
+    
+    END SRealIO.
+    
+
+@c @node gm2-libs-iso/SShortIO, gm2-libs-iso/SShortWholeIO, gm2-libs-iso/SRealIO, M2 ISO Libraries
+gm2-libs-iso/SShortIO
+---------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE SShortIO;
+
+  (* Input and output of short real numbers in decimal text form
+     using default channels.  The read result is of the type
+     IOConsts.ReadResults.
+  *)
+    
+      (* The text form of a signed fixed-point real number is
+           ["+" | "-"], decimal digit, {decimal digit},
+           [".", {decimal digit}]
+    
+         The text form of a signed floating-point real number is
+           signed fixed-point real number,
+           "E", ["+" | "-"], decimal digit, {decimal digit}
+      *)
+    
+.. index::
+   ReadReal
+.. code-block:: modula2
+    PROCEDURE ReadReal (VAR real: SHORTREAL);
+      (* Skips leading spaces, and removes any remaining characters
+         from the default input channel that form part of a signed
+         fixed or floating point number. The value of this number
+         is assigned to real.  The read result is set to the value
+         allRight, outOfRange, wrongFormat, endOfLine, or endOfInput.
+      *)
+    
+.. index::
+   WriteFloat
+.. code-block:: modula2
+    PROCEDURE WriteFloat (real: SHORTREAL; sigFigs: CARDINAL;
+                          width: CARDINAL);
+      (* Writes the value of real to the default output channel in
+         floating-point text form, with sigFigs significant figures,
+         in a field of the given minimum width.
+      *)
+    
+.. index::
+   WriteEng
+.. code-block:: modula2
+    PROCEDURE WriteEng (real: SHORTREAL; sigFigs: CARDINAL;
+                        width: CARDINAL);
+      (* As for WriteFloat, except that the number is scaled with
+         one to three digits in the whole number part, and with an
+         exponent that is a multiple of three.
+      *)
+    
+.. index::
+   WriteFixed
+.. code-block:: modula2
+    PROCEDURE WriteFixed (real: SHORTREAL; place: INTEGER;
+                          width: CARDINAL);
+      (* Writes the value of real to the default output channel in
+         fixed-point text form, rounded to the given place relative
+         to the decimal point, in a field of the given minimum width.
+      *)
+    
+.. index::
+   WriteReal
+.. code-block:: modula2
+    PROCEDURE WriteReal (real: SHORTREAL; width: CARDINAL);
+      (* Writes the value of real to the default output channel, as
+         WriteFixed if the sign and magnitude can be shown in the
+         given width, or otherwise as WriteFloat. The number of
+         places or significant digits depends on the given width.
+      *)
+    
+    END SShortIO.
+    
+
+@c @node gm2-libs-iso/SShortWholeIO, gm2-libs-iso/STextIO, gm2-libs-iso/SShortIO, M2 ISO Libraries
+gm2-libs-iso/SShortWholeIO
+--------------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE SShortWholeIO;
+
+  (* Input and output of whole numbers in decimal text form over
+     default channels.  The read result is of the type
+     IOConsts.ReadResults.
+  *)
+    
+      (* The text form of a signed whole number is
+           ["+" | "-"], decimal digit, {decimal digit}
+    
+         The text form of an unsigned whole number is
+           decimal digit, {decimal digit}
+      *)
+    
+.. index::
+   ReadInt
+.. code-block:: modula2
+    PROCEDURE ReadInt (VAR int: SHORTINT);
+      (* Skips leading spaces, and removes any remaining characters
+         from the default input channel that form part of a signed
+         whole number.  The value of this number is assigned
+         to int.  The read result is set to the value allRight,
+         outOfRange, wrongFormat, endOfLine, or endOfInput.
+      *)
+    
+.. index::
+   WriteInt
+.. code-block:: modula2
+    PROCEDURE WriteInt (int: SHORTINT; width: CARDINAL);
+      (* Writes the value of int to the default output channel in
+         text form, in a field of the given minimum width.
+      *)
+    
+.. index::
+   ReadCard
+.. code-block:: modula2
+    PROCEDURE ReadCard (VAR card: SHORTCARD);
+      (* Skips leading spaces, and removes any remaining characters
+         from the default input channel that form part of an
+         unsigned whole number.  The value of this number is
+         assigned to card.  The read result is set to the value
+         allRight, outOfRange, wrongFormat, endOfLine, or endOfInput.
+      *)
+    
+.. index::
+   WriteCard
+.. code-block:: modula2
+    PROCEDURE WriteCard (card: SHORTCARD; width: CARDINAL);
+      (* Writes the value of card to the default output channel in
+         text form, in a field of the given minimum width.
+      *)
+    
+    END SShortWholeIO.
+
+@c @node gm2-libs-iso/STextIO, gm2-libs-iso/SWholeIO, gm2-libs-iso/SShortWholeIO, M2 ISO Libraries
+gm2-libs-iso/STextIO
+--------------------
+
+.. code-block:: modula2
+    DEFINITION MODULE STextIO;
+
+  (* Input and output of character and string types over default channels. The read result
+     is of the type IOConsts.ReadResults.
+  *)
+    
+      (* The following procedures do not read past line marks *)
+    
+.. index::
+   ReadChar
+.. code-block:: modula2
+    PROCEDURE ReadChar (VAR ch: CHAR);
+      (* If possible, removes a character from the default input stream, and assigns the
+         corresponding value to ch.  The read result is set to allRight, endOfLine or
+         endOfInput.
+      *)
+    
+.. index::
+   ReadRestLine
+.. code-block:: modula2
+    PROCEDURE ReadRestLine (VAR s: ARRAY OF CHAR);
+      (* Removes any remaining characters from the default input stream before the next line
+         mark, copying to s as many as can be accommodated as a string value.  The read result
+         is set to the value allRight, outOfRange, endOfLine, or endOfInput.
+      *)
+    
+.. index::
+   ReadString
+.. code-block:: modula2
+    PROCEDURE ReadString (VAR s: ARRAY OF CHAR);[...]

[diff truncated at 524288 bytes]

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-12-13 22:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-12-13 22:08 [gcc/devel/modula-2] Introduce target independent copies of document chapters Gaius Mulley

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).