ORIGIN '~beta/basiclib/betaenv';
LIB_DEF 'sysutilsendian' '../lib';
(* Operations for testing whether or not the host system uses
* big endian or little endian data representation.
* In addition there are operations for converting a long (4bytes)
* and a short (2 bytes) memory location from big/little to
* little/big endian.
*)
MDBODY linux 'private/endian_littleBody'
nti 'private/endian_littleBody'
default 'private/endian_bigBody';
---lib:attributes---
(* Predicates indicating the endian-type of the host system. *)
isBigEndian:
(# b: @boolean
...
exit b
#);
isLittleEndian:
(# b: @boolean
...
exit b
#);
(* BSD like conversion routines. These operations are safe. *)
ntohl:
(# i: @Integer;
enter i
...
exit i
#);
htonl:
(# i: @Integer;
enter i
...
exit i
#);
ntohs:
(# i: @Integer;
enter i
...
exit i
#);
htons:
(# i: @Integer;
enter i
...
exit i
#);
(* Usage of the following operations is strongly discouraged for the
* reasons explained below! (Use the supported operations above)
*
* WARNING: byteSwapShort and byteSwapLong are NOT safe operations,
* since they take a memory argument as a parameter. This require
* use of the low-level primitive @@.
* Ex:
* X: @integer; R: [100] @int16
* @@XX->byteSwapLong;
* (for i: R.range repeat
* @@R[i]->byteSwapShort
* for)
* After @@X/@@R[i] has been computed, a grabage collection MUTS NOT happen,
* since this invalidates the computed addresses. It is therefore
* recommedn to use statis versions like
*
* BSL: @ byteSwapLong
* @@X->BSL
*
* Another alternative is to use the TOS operations directly.
* The TOS operations are currently only implemented for Linux
*)
byteSwapShort:
(# adr: @integer
enter adr
do adr->TOS'%byteSwapShort'
#);
byteSwapLong:
(# adr: @integer
enter adr
do adr->TOS'%byteSwapLong'
#)
| 14.3 Endian Interface | © 1994-2002 Mjølner Informatics |
[Modified: Tuesday January 11th 2000 at 16:32]
|