DEFINITION MODULE DMPortab;
(*******************************************************************
Module DMPortab ('Dialog Machine' DM_V3.0)
Copyright (c) 1995-2006 by Andreas Fischlin and ETH Zurich.
Purpose Support full portability of the source code of
'Dialog Machine' programs among Modula-2 compilers.
Since different platforms are likely to require
different compilers, this enhances also
cross-platform portability.
Remarks An example of such functions are the
standard environment functions FLOATD
(MacMETH) or LFLOAT (EPC Modula-2 Sun).
Only those functions are provided by this
module which can't be avoided by any other
means (see also Thoeny, 1995. Practical
considerations on writing portable Modula-2
code. Systems Ecology Report No. 20, 6pp).
This module belongs to the 'Dialog Machine'.
Programming
o Design
Andreas Fischlin 14/11/1995
o Implementation
Andreas Fischlin 14/11/1995
ETH Zurich
Systems Ecology
CHN E 35.1
Universitaetstrasse 16
8092 Zurich
SWITZERLAND
URLs:
<mailto:RAMSES@env.ethz.ch>
<http://www.sysecol.ethz.ch>
<http://www.sysecol.ethz.ch/SimSoftware/RAMSES>
Last revision of definition: 22/08/2004 AF
*******************************************************************)
FROM SYSTEM IMPORT BYTE;
VAR
zero, one,two, ten, hundred, thousand: LONGREAL; (* read only *)
zeroLI, oneLI,twoLI, tenLI, hundredLI, thousandLI: LONGINT; (* read only *)
PROCEDURE SameProc (p1,p2: ARRAY OF BYTE): BOOLEAN;
(*
Compares two procedure variables for identity, i.e.
whether the two variables have been assigned the same
procedure or not. Make sure you pass as actual arguments
just two procedure variables, not an actual procedure
identifier; some compilers, e.g. the MacMETH compiler,
might not accept the latter.
*)
PROCEDURE LIFLOAT(x: LONGINT): LONGREAL;
PROCEDURE LCFLOAT(x: LONGCARD): LONGREAL;
PROCEDURE LITRUNC(x: LONGREAL): LONGINT;
PROCEDURE LCTRUNC(x: LONGREAL): LONGCARD;
(*
Allows for avoiding the use of non portable standard
functions such as TRUNCD, LONGTRUNC etc. in expressions,
hereby enhancing the portability, albeit at the cost of
efficiency. However, these functions are implemented
with the highest efficiency available on the particular
machine
*)
PROCEDURE LONGINTConst(str: ARRAY OF CHAR): LONGINT;
PROCEDURE LONGCARDConst(str: ARRAY OF CHAR): LONGCARD;
PROCEDURE LONGREALConst(str: ARRAY OF CHAR): LONGREAL;
(*
Not very efficient, but highly portable way to force
constants to be computed to highest possible precision.
For instance 0.123456789012D (note the D at the end) is
not a portable constant definition, but is required on
the Mac by the MacMETH language in order to avoid
truncation of this constant after the 7th digit.
However, LONGREALConst("0.123456789012") will have the
same effect (albeit not a true constant) and warrants a
portable assignment of a double precision real (LONGREAL)
or long integer (LONGINT) number.
*)
PROCEDURE LI(x: INTEGER ): LONGINT;
PROCEDURE SI(x: LONGINT ): INTEGER;
PROCEDURE LC(x: CARDINAL): LONGCARD;
PROCEDURE SC(x: LONGCARD): CARDINAL;
PROCEDURE LR(x: REAL ): LONGREAL;
PROCEDURE SR(x: LONGREAL): REAL;
(*
Since older Modula-2 language definitions did not
recognize long elementary data types, some standard
functions which accomplish type transfers vary from
implementation to implementation. Above routines provide
fully portable type conversions between long and short
types, which is convenient in mixed expressions. The
implementation exploits assignment compatibility between
these types, which is normally available in all language
implementations.
*)
END DMPortab.