OSSI: SIPacking
Edoardo Biagioni
biagioni at unc.UUCP
Fri Nov 7 03:49:35 AEST 1986
(***************************************************************************)
(*** ***)
(*** ***)
(*** O S S I ***)
(*** ========== ***)
(*** ***)
(**) DEFINITION MODULE SIPacking; (**)
(*** =========================== ***)
(*** ***)
(*** This module defines constants and procedures to handle storage ***)
(*** in a machine- compiler- and operating-system-independent way ***)
(*** ***)
(***---------------------------------------------------------------------***)
(*** ***)
(*** Hardware: independent ***)
(*** Operating System: independent ***)
(*** Compiler: independent ***)
(*** ***)
(*** Version: 3.0 ***)
(*** Implemented: see copyright ***)
(*** Date: 1986-03-12 ***)
(*** ***)
(***---------------------------------------------------------------------***)
(*** ***)
(*** Copyright 1984, 1985, 1986 by ***)
(*** E. S. Biagioni ***)
(*** G. Heiser ***)
(*** K. Hinrichs ***)
(*** C. Muller ***)
(*** ***)
(*** Institut fuer Informatik ***)
(*** ETH Zuerich ***)
(*** CH 8092 Zuerich ***)
(*** Switzerland ***)
(*** ***)
(*** Department of Computer Science ***)
(*** University of North Carolina ***)
(*** Chapel Hill, North Carolina 27514 ***)
(*** U.S.A. ***)
(*** ***)
(*** Permission to copy without fee all of this material is granted ***)
(*** provided that the copies are not made or distributed for direct ***)
(*** commercial advantage, that this OSSI copyright notice is ***)
(*** included in the copy, that the module is not modified in any way ***)
(*** except where necessary for compilation on a particular system, ***)
(*** and that the module is always distributed in its original form. ***)
(*** Distribution of this module in a modified form without including ***)
(*** the original version is a violation of this copyright notice. ***)
(*** ***)
(***---------------------------------------------------------------------***)
(*** ***)
(*** Updates: ***)
(*** ***)
(*** ***)
(***************************************************************************)
FROM SYSTEM IMPORT
WORD,
ADDRESS;
FROM SISystem IMPORT
BYTE;
EXPORT QUALIFIED
ConvertToBytes,
ConvertFromBytes,
PackCard,
UnpackCard,
PackInt,
UnpackInt;
PROCEDURE ConvertToBytes (VAR data: ARRAY OF WORD;
VAR bytes: ARRAY OF BYTE;
index: CARDINAL);
(* ConvertToBytes copies "data" (((HIGH (data) + 1) * BytesPerWord) bytes)
into the array "bytes" (starting at array index "index").
The relative order of the bytes is preserved.
The procedure does not check whether
(HIGH (data) + 1) * BytesPerWord - 1 + index <= HIGH (bytes).
"data" is passed as a VAR parameter for reasons of efficiency. *)
PROCEDURE ConvertFromBytes (VAR bytes: ARRAY OF BYTE;
index: CARDINAL;
VAR data: ARRAY OF WORD);
(* ConvertFromBytes transfers (((HIGH (data) + 1) * BytesPerWord) bytes)
from the array "bytes", starting at array index "index" into array "data".
The procedure does not check whether
(HIGH (data) + 1) * BytesPerWord - 1 + index <= HIGH (bytes).
"bytes" is passed as a VAR parameter for reasons of efficiency. *)
PROCEDURE PackCard (c: CARDINAL;
VAR bytes: ARRAY OF BYTE;
index,length: CARDINAL);
(* PackCard copies the "length" ( <= "BytesPerCard" ) least significant bytes
of "c" into "bytes" (starting at array index "index"). The relative order
of the bytes is preserved. The procedure does not check whether
(length <= BytesPerCard) and (index + length - 1) <= HIGH (bytes). *)
PROCEDURE UnpackCard (VAR bytes: ARRAY OF BYTE;
index,length: CARDINAL): CARDINAL;
(* UnpackCard transfers "length" ( <= "BytesPerCard") bytes from the array
"bytes" (starting at array index "index") into a CARDINAL. The missing
most significant bytes are set to zero. The procedure does not check that
(length <= BytesPerCard) and (index + length - 1 <= HIGH (bytes).
"bytes" is passed as a VAR parameter for reasons of efficiency. *)
PROCEDURE PackInt (i: INTEGER;
VAR bytes: ARRAY OF BYTE;
index,length: CARDINAL);
(* PackInt copies the "length" ( <= "BytesPerInt" ) least significant bytes
of "i" into "bytes" (starting at array index "index"). The relative order
of the bytes is preserved.
If - 2 ^ (BitsPerByte * length - 1) < i < 2 ^ (BitsPerByte * length - 1)
a subsequent call to UnpackInt (with appropriate parameters) will
reproduce i. The procedure does not check whether
(length <= BytesPerInt) and (index + length - 1 <= HIGH (bytes). *)
PROCEDURE UnpackInt (VAR bytes: ARRAY OF BYTE;
index,length: CARDINAL): INTEGER;
(* UnpackInt transfers "length" ( <= "BytesPerInt") bytes from the array
"bytes" (starting at array index "index") into an INTEGER. The missing
most significant bytes (but not the sign bit) are set to zero.
If an integer i was packed into bytes by a call to PackInt and i satisfied
- 2 ^ (BitsPerByte * length - 1) < i < 2 ^ (BitsPerByte * length - 1)
then UnpackInt (with appropriate parameters) will return the value of i.
The procedure does not check whether
(length <= BytesPerInt) and (index + length - 1 <= HIGH (bytes).
"bytes" is passed as a VAR parameter for reasons of efficiency. *)
END SIPacking.
More information about the Comp.sources.unix
mailing list