OSSI: SIConversions
Edoardo Biagioni
biagioni at unc.UUCP
Fri Nov 7 03:44:38 AEST 1986
(***************************************************************************)
(*** ***)
(*** ***)
(*** O S S I ***)
(*** ========== ***)
(*** ***)
(**) DEFINITION MODULE SIConversions; (**)
(*** =============================== ***)
(*** ***)
(*** This module defines conversions from strings to numbers and ***)
(*** from numbers to strings ***)
(*** ***)
(***---------------------------------------------------------------------***)
(*** ***)
(*** Hardware: independent ***)
(*** Operating System: independent ***)
(*** Compiler: independent ***)
(*** ***)
(*** Version: 3.0 ***)
(*** Implemented: see copyright ***)
(*** Date: 1986-03-11 ***)
(*** ***)
(***---------------------------------------------------------------------***)
(*** ***)
(*** 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 SISystem IMPORT
SIResult;
EXPORT QUALIFIED
NumberType, (* TYPEs *)
Number,
IsStringOverflow, (* PROCEDUREs and functions *)
IsNumberOverflow,
IsNumberNotFound,
RealToNumber,
CardToString,
IntToString,
RealToString,
OctToString,
HexToString,
StringToCard,
StringToInt,
StringToReal,
StringToOct,
StringToHex;
TYPE NumberType = (IntType, CardType, RealType, IntOrCardType);
Number = RECORD
CASE Type: NumberType OF
IntType : Int : INTEGER | (* numbers < 0 *)
CardType : Card : CARDINAL | (* numbers > MaxInt *)
RealType : Real : REAL | (* for nonintegral or
large numbers *)
IntOrCardType: select : RECORD
(* for small positive integers:
both have the same value *)
Int : INTEGER;
Card: CARDINAL
END; (* IntOrCard *)
END; (* CASE *)
END; (* Number *)
(* IntType = MinInt .. -1 integral numbers
CardType = MaxInt + 1 .. MaxCard integral numbers
IntOrCardType = 0 .. MaxInt integral numbers
RealType = all other numbers. *)
PROCEDURE RealToNumber (r: REAL; VAR n: Number);
(* determines the range of the given real and, if it is
within cardinal or integer ranges, converts it as
described above. *)
PROCEDURE IsStringOverflow (result: SIResult): BOOLEAN;
(* Returns TRUE iff 'result' (returned by an earlier operation)
indicates the result string is too short. *)
PROCEDURE IsNumberOverflow (result: SIResult): BOOLEAN;
(* Returns TRUE iff 'result' (returned by an earlier operation)
indicates the number found overflows the machine representation. *)
PROCEDURE IsNumberNotFound (result: SIResult): BOOLEAN;
(* Returns TRUE iff 'result' (returned by an earlier operation)
indicates that no syntactically valid number was found. *)
(* the following procedures all return the string corresponding to the
given number.
The "field" specification always gives the minimum field length to be
used. The field parameter will be ignored if it is too small for a
correct representation of the number. If the string s is to small,
result = StringOverflow() is returned. If the field is larger than
required to represent the number, the number is right-justified and
the field is padded with spaces, except for the hex and oct procedures,
where it is padded with 0's up to the number of digits required to
represent the wordlength of the machine. Giving a field longer than the
space allocated by s fills the entire string. *)
PROCEDURE CardToString (VAR s: ARRAY OF CHAR; c: CARDINAL; field: CARDINAL;
VAR result: SIResult);
PROCEDURE IntToString (VAR s: ARRAY OF CHAR; i: INTEGER; field: CARDINAL;
VAR result: SIResult);
(* If i is negative, '-' is inserted before the number, if i is positive,
nothing is inserted. *)
PROCEDURE RealToString (VAR s: ARRAY OF CHAR; r: REAL;
field, digits: CARDINAL; scientific: BOOLEAN;
VAR result: SIResult);
(* The actual length f, of the field used to represent r is determined
as follows:
- the length of s gives the maximum field length
- "field" specifies the minimum field length (up to the maximum)
- "digits" specifies the maximum length of the fractional part. Less
digits are used to represent the fractional part, if the maximum
field length is insufficient
- a decimal point is always given and is preceded by at least one
digit representing the integral part.
IF "scientific" = TRUE the integral part consists of exactly one digit
and is zero if and only if "r" is zero.
- for scientific format the exponent is represented as 'E' followed
by a minus sign (if r < 0) followed by at least one exponent
digit
- if "scientific" = FALSE and the maximum field is insufficient to
represent r, "scientific" is set to TRUE
- if "scientific" = TRUE and Field is sufficiently large, a standard
representation is choosen for the exponent. It consists of
- 'E'
- always a sign ('+' or '-')
- a constant number of exponent digits. This number is machine
dependent and is the minimum number of digits required to represent
any possible exponent
- if "field" is larger than required for the representation of "r", it is
filled with leading spaces *)
PROCEDURE OctToString (VAR s: ARRAY OF CHAR; c: CARDINAL; field: CARDINAL;
VAR result: SIResult);
PROCEDURE HexToString (VAR s: ARRAY OF CHAR; c: CARDINAL; field: CARDINAL;
VAR result: SIResult);
(*----------------------------------------------------------------------- *)
(* The following procedures search the given string for the representation
of a number (type and syntax depending on the procedure).
The number is searched for starting at startindex and up to endindex.
If a syntactically valid number is found, startindex is set to the first
character which is part of the number's representation (including
leading spaces), endindex is set to the last character (excluding
trailing spaces).
If the number found is within the machine defined range for the
corresponding type, the result is SIDone and the value of the
number is returned in the respective parameter, otherwise result
is set to NumberOverflow().
If no syntactically valid number is found, result is set to
NumberNotFound().
The first index in a string is always zero.
Numbers are expected to conform to the following syntax:
OctalDigit = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7".
Digit = OctalDigit|"8"|"9".
HexDigit = Digit|"A"|"B"|"C"|"D"|"E"|"F".
OctalNumber = OctalDigit | OctalDigit OctalNumber.
HexNumber = HexDigit | HexDigit HexNumber.
Cardinal = Digit | Digit Cardinal.
Integer = ["+" | "-"] Cardinal.
Mantissa = Cardinal ["." [Cardinal]] | "." Cardinal
Exponent = ["E" | "e"] Integer
Real = ["+" | "-"] Mantissa [Exponent]
Spaces are allowed following the sign and before and after the 'E' *)
(*------------------------------------------------------------------- *)
PROCEDURE StringToCard (s: ARRAY OF CHAR; VAR c: CARDINAL;
VAR startindex, endindex: CARDINAL;
VAR result: SIResult);
PROCEDURE StringToInt (s: ARRAY OF CHAR; VAR i: INTEGER;
VAR startindex, endindex: CARDINAL;
VAR result: SIResult);
PROCEDURE StringToReal (s: ARRAY OF CHAR; VAR r: REAL;
VAR startindex, endindex: CARDINAL;
VAR result: SIResult);
PROCEDURE StringToOct (s: ARRAY OF CHAR; VAR c: CARDINAL;
VAR startindex, endindex: CARDINAL;
VAR result: SIResult);
PROCEDURE StringToHex (s: ARRAY OF CHAR; VAR c: CARDINAL;
VAR startindex, endindex: CARDINAL;
VAR result: SIResult);
END SIConversions.
More information about the Comp.sources.unix
mailing list