Module convert
Index
 Process
HEX16TOSTRING
 Process
HEX32TOSTRING
 Process
HEX64TOSTRING
 Process
INT16TOSTRING
 Process
INT32TOSTRING

Process
REAL32TOSTRING
 Take a binary representation of a real number and convert it into a string of characters that is the decimal representation of that number, formatted according to given rules ( see Notes below )
Process
Round
 Round a real number to the nearest integer 
Process
WriteDec
 Take an unsigned integer and convert it to the corresponding ASCII string, with the caveat that trailing zeros are not written 
Process
restrict
 Round a number that is given in the form of a character string

Process

Process
REAL64TOSTRING
 Take a binary representation of a real number and convert it into a string of characters that is the decimal representation of that number, formatted according to given rules ( see Notes below )
Process
Round
 Round a real number to the nearest integer 
Process
WriteDec
 Take an unsigned integer and convert it to the corresponding ASCII string, with the caveat that trailing zeros are not written 
Process
restrict
 Round a number that is given in the form of a character string

Process
 Process
STRINGTOHEX16
 Process
STRINGTOHEX32
 Process
STRINGTOHEX64

Process
STRINGTOINT16
 Convert to an INT16 the value represented by string  Process
STRINGTOINT32

Process
STRINGTOREAL32
 Converts BYTE array string into a REAL32 number X 
Process
STRINGTOREAL64
 Converts BYTE array string into a REAL64 number X  Function
ValidDigit
 Function
ValidHexDigit
Declarations
strr64ta.occ
:49Process STRINGTOREAL64
PROC STRINGTOREAL64 (BOOL Error, REAL64 X, VAL []BYTE string)
Converts BYTE array string into a REAL64 number X
A sign may start string. If the value represented by string overflows the REAL64 range then an appropriately signed infinity is returned in X. If the absolute value represented by string is in the range 2^1074 to just less than 2^1022, then a denormalised number is returned. If the absolute value represented by string is less than 2^1074 then zero is returned. If the syntax of string is incorrect then not only is Error set to TRUE, but a NotaNumber ( NaN ) is returned for X. If there remain characters after the end of the longest correct string, although Error is set to TRUE, X is returned with the value of the correct part of string
Parameters:
BOOL 
Error 
TRUE if the syntax of string is not correct occam, or if there are any characters after the end of the longest correct string; otherwise it is FALSE 
REAL64 
X 
the binary representation in IEEE double precision format of the real decimal in string 
VAL []BYTE 
string 
a sequence of ASCII characters 
hex64ta.occ
:33Process STRINGTOHEX64
PROC STRINGTOHEX64 (BOOL Error, INT64 n, VAL []BYTE string)
hex64ta.occ
:72Process HEX64TOSTRING
PROC HEX64TOSTRING (INT len, []BYTE string, VAL INT64 n)
r64strta.occ
:93Process REAL64TOSTRING
PROC REAL64TOSTRING (INT len, []BYTE string, VAL REAL64 X, VAL INT Ip, Dp)
Take a binary representation of a real number and convert it into a string of characters that is the decimal representation of that number, formatted according to given rules ( see Notes below ).
Rounding mode is round to nearest. Which format is used depends on the combination of values of Ip, Dp and X. In all cases, any digits beyond the 9th significant digit for single precision or 17th significant digit for double precision will be given as 0 and cannot be considered accurate. If string overflows this routine acts as an invalid process.
Case (i): Ip = 0, Dp = 0 => free format Where possible a fixed point representation is used. If it is not used then exponential form is used. It is not used if more than 9  17 significant digits of accuracy ( single  double ) would be required before the decimal point, or if there are more than 3 zeroes after the decimal point before the first significant digit. In any case, the maximum number of characters returned in string is 15 for a single precision X, and 24 for a double precision X. string is left justified. If X is infinity or a NaN, then the string will contain one of "Inf", "Inf" or "NaN", but not the quotes.
Case (ii): Ip = 0, Dp > 0 => exponential format The form of exponential format is, firstly either a minus sign or a space ( this latter instead of an explicit plus sign ), a fraction in the form <digit>.<digits>, the exponential symbol ( E ), the sign of the exponent ( + or  ), then the exponent, which is two digits for a single precision X, three digits for a double precision X. Dp gives the number of digits in the fraction ( 1 before the point, and the others after, but not counting the point ). The total number of characters in string is ( Dp + 6 ) for a single precision X, and ( Dp + 7 ) for a double precision X. If Dp = 1 then the fraction is of the form <space>digit ( which, note, will not result in occam syntax for the real ). If X is infinity or a NaN, then the string will contain one of " Inf", "Inf" or " NaN", but not the quotes, padded on the right to fill the field width.
Case (iii): Ip > 0, Dp > 0 => fixed point if possible Ip gives the number of places before the point, not counting the sign place; Dp the number of places after the point. Padding spaces are added on the left as necessary. If the number will not fit the format, then an exponential format is used with the same field width as the fixed point representation would have had. If Ip and Dp are very small then an exponential representation may not fit in the field width so the special value "Ov" with a sign is returned. There are always ( Ip + Dp + 2 ) characters in string, the 2 being the decimal point and the sign (  or space ). If X is infinity or a NaN, then the string will contain one of " Inf", "Inf" or " NaN", but not the quotes, padded on the right to fill the field width.
All other combinations of Ip and Dp are meaningless and will cause an error.
Parameters:
INT 
len 
the number of characters ( BYTEs ) of string occupied by the formatted decimal representation of the real number 
[]BYTE 
string 
an array containing the formatted decimal representation of the real number in the first len bytes, the remaining bytes being undefined 
VAL REAL64 
X 
the real number, in IEEE format, to be converted 
VAL INT 
Ip 
the first of two formatting values 
VAL INT 
Dp 
the second of two formatting values 
r64strta.occ
:373Process Round
PROC Round (INT Xexp, [2]INT Xfrac, Xint, INT direction)
Round a real number to the nearest integer.
( Xexp on entry ) < ( 2 * the number of bits per word ) is assumed. This procedure only caters for nonnegative numbers.
Parameters:
INT 
Xexp 
actual exponent, not biased one: on entry, of the number to round; on exit, of the rounded number 
[2]INT 
Xfrac 
the fractional part of the real with implicit bit explicit: on entry, of the number to round; on exit, of the rounded number 
[2]INT 
Xint 
the nearest integer that the combination of Xexp and Xfrac on entry give 
INT 
direction 
this parameter is applicable only for numbers ending in 5: equal to 1 if the exact value was rounded down; equal to 0 if the value on entry is exact; equal to +1 if the exact value was rounded up 
r64strta.occ
:488Process WriteDec
PROC WriteDec ([]BYTE Buf, INT Length, VAL []INT Num)
Take an unsigned integer and convert it to the corresponding ASCII string, with the caveat that trailing zeros are not written.
An example of what is meant by not writing trailing zeros to Buf: if Num = 30, Length will be 1 and Buf[ 0 ] = '3' will be the only defined character in Buf.
Parameters:
[]BYTE 
Buf 
contains the ASCII string representing the integer ( Num ) ( apart from trailing zeros ); the string is [ Buf FROM 0 FOR Length ] 
INT 
Length 
the number of meaningful characters in Buf 
VAL []INT 
Num 
the integer to be converted, assumed unsigned: numbers from 0 to 4,294,967,295 inclusive, for 32bit processors, or 0 to 65535 inclusive, for 16bit processors 
r64strta.occ
:542Process restrict
PROC restrict ([]BYTE Buf, INT Places, LogX, VAL INT digits, INT direction)
Round a number that is given in the form of a character string.
"... if the two nearest representable values are equally near, the one with its least significant bit zero shall be delivered." IEEE 7541985, Sec 4.1. LSB zero <=> last digit is even. Any resultant trailing zeroes in Buf are elided.
Parameters:
[]BYTE 
Buf 
the character string holding the number, assumed not to have trailing zeroes 
INT 
Places 
the actual number of characters in the string 
INT 
LogX 
floor( log10( number in Buf ) ) 
VAL INT 
digits 
the number of digits wanted in the rounded number; assumed greater than or equal to zero 
INT 
direction 
this parameter is applicable only for numbers in Buf ending in 5: equal to 1 if the exact value was rounded down; equal to 0 if the value in Buf is exact; equal to +1 if the exact value was rounded up 
int16ta.occ
:51Process STRINGTOINT16
PROC STRINGTOINT16 (BOOL Error, INT16 n, VAL []BYTE string)
Convert to an INT16 the value represented by string.
A plus ( + ) or a minus (  ) sign is allowed in the first position of string. An illegal character is any nonnumeric character, other than + or  in the first position.
Parameters:
BOOL 
Error 
TRUE if the value of string overflows the INT16 range; TRUE if there are any illegal characters in string; FALSE otherwise 
INT16 
n 
if the value that string represents does not overflow the INT16 range then n is the INT16 that string represents, with the convention that n is zero if string is empty; otherwise n will be the value of the portion of string up to any illegal character, where n is zero if an illegal character is in the first position of string, or if the INT16 range overflows n will contain the low order bits of the binary representation of string 
VAL []BYTE 
string 
the characters that are to be converted to an INT16 
int16ta.occ
:76Process INT16TOSTRING
PROC INT16TOSTRING (INT len, []BYTE string, VAL INT16 n)
int32ta.occ
:31Process STRINGTOINT32
PROC STRINGTOINT32 (BOOL Error, INT32 n, VAL []BYTE string)
int32ta.occ
:41Process INT32TOSTRING
PROC INT32TOSTRING (INT len, []BYTE string, VAL INT32 n)
r32strta.occ
:90Process REAL32TOSTRING
PROC REAL32TOSTRING (INT len, []BYTE string, VAL REAL32 X, VAL INT Ip, Dp)
Take a binary representation of a real number and convert it into a string of characters that is the decimal representation of that number, formatted according to given rules ( see Notes below ).
Rounding mode is round to nearest. Which format is used depends on the combination of values of Ip, Dp and X. In all cases, any digits beyond the 9th significant digit for single precision or 17th significant digit for double precision will be given as 0 and cannot be considered accurate. If string overflows this routine acts as an invalid process.
Case (i): Ip = 0, Dp = 0 => free format Where possible a fixed point representation is used. If it is not used then exponential form is used. It is not used if more than 9  17 significant digits of accuracy ( single  double ) would be required before the decimal point, or if there are more than 3 zeroes after the decimal point before the first significant digit. In any case, the maximum number of characters returned in string is 15 for a single precision X, and 24 for a double precision X. string is left justified. If X is infinity or a NaN, then the string will contain one of "Inf", "Inf" or "NaN", but not the quotes.
Case (ii): Ip = 0, Dp > 0 => exponential format The form of exponential format is, firstly either a minus sign or a space ( this latter instead of an explicit plus sign ), a fraction in the form <digit>.<digits>, the exponential symbol ( E ), the sign of the exponent ( + or  ), then the exponent, which is two digits for a single precision X, three digits for a double precision X. Dp gives the number of digits in the fraction ( 1 before the point, and the others after, but not counting the point ). The total number of characters in string is ( Dp + 6 ) for a single precision X, and ( Dp + 7 ) for a double precision X.
If Dp = 1 then the fraction is of the form <space>digit ( which, note, will not result in occam syntax for the real ). If X is infinity or a NaN, then the string will contain one of " Inf", "Inf" or " NaN", but not the quotes, padded on the right to fill the field width.
Case (iii): Ip > 0, Dp > 0 => fixed point if possible Ip gives the number of places before the point, not counting the sign place; Dp the number of places after the point. Padding spaces are added on the left as necessary. If the number will not fit the format, then an exponential format is used with the same field width as the fixed point representation would have had. If Ip and Dp are very small then an exponential representation may not fit in the field width so the special value "Ov" with a sign is returned. There are always ( Ip + Dp + 2 ) characters in string, the 2 being the decimal point and the sign (  or space ). If X is infinity or a NaN, then the string will contain one of " Inf", "Inf" or " NaN", but not the quotes, padded on the right to fill the field width.
All other combinations of Ip and Dp are meaningless and will cause an error.
Parameters:
INT 
len 
the number of characters ( BYTEs ) of string occupied by the formatted decimal representation of the real number 
[]BYTE 
string 
an array containing the formatted decimal representation of the real number in the first len bytes, the remaining bytes being undefined 
VAL REAL32 
X 
the real number, in IEEE format, to be converted 
VAL INT 
Ip 
the first of two formatting values 
VAL INT 
Dp 
the second of two formatting values 
r32strta.occ
:349Process Round
PROC Round (INT Xexp, Xfrac, Xint, direction)
Round a real number to the nearest integer.
( Xexp on entry ) < ( number of bits per word ) is assumed. This procedure only caters for nonnegative numbers.
Parameters:
INT 
Xexp 
actual exponent, not biased one: on entry, of the number to round; on exit, of the rounded number 
INT 
Xfrac 
the fractional part of the real with implicit bit explicit: on entry, of the number to round; on exit, of the rounded number 
INT 
Xint 
the nearest integer that the combination of Xexp and Xfrac on entry give 
INT 
direction 
this parameter is applicable only for numbers ending in 5: equal to 1 if the exact value was rounded down; equal to 0 if the value on entry is exact; equal to +1 if the exact value was rounded up 
r32strta.occ
:404Process WriteDec
PROC WriteDec ( []BYTE Buf, INT Length, VAL INT Num )
Take an unsigned integer and convert it to the corresponding ASCII string, with the caveat that trailing zeros are not written.
An example of what is meant by not writing trailing zeros to Buf: if Num = 30, Length will be 1 and Buf[ 0 ] = '3' will be the only defined character in Buf.
Parameters:
[]BYTE 
Buf 
contains the ASCII string representing the integer ( Num ) ( apart from trailing zeros ); the string is [ Buf FROM 0 FOR Length ] 
INT 
Length 
the number of meaningful characters in Buf 
VAL INT 
Num 
the integer to be converted, assumed unsigned: numbers from 0 to 4,294,967,295 inclusive, for 32bit processors, or 0 to 65535 inclusive, for 16bit processors 
r32strta.occ
:453Process restrict
PROC restrict ([]BYTE Buf, INT Places, LogX, VAL INT digits, INT direction)
Round a number that is given in the form of a character string.
"... if the two nearest representable values are equally near, the one with its least significant bit zero shall be delivered." IEEE 7541985, Sec 4.1. LSB zero <=> last digit is even. Any resultant trailing zeroes in Buf are elided.
Parameters:
[]BYTE 
Buf 
the character string holding the number, assumed not to have trailing zeroes 
INT 
Places 
the actual number of characters in the string 
INT 
LogX 
floor( log10( number in Buf ) ) 
VAL INT 
digits 
the number of digits wanted in the rounded number; assumed greater than or equal to zero 
INT 
direction 
this parameter is applicable only for numbers in Buf ending in 5: equal to 1 if the exact value was rounded down; equal to 0 if the value in Buf is exact; equal to +1 if the exact value was rounded up 
hex32ta.occ
:31Process STRINGTOHEX32
PROC STRINGTOHEX32 (BOOL Error, INT32 n, VAL []BYTE string)
hex32ta.occ
:41Process HEX32TOSTRING
PROC HEX32TOSTRING (INT len, []BYTE string, VAL INT32 n)
hex16ta.occ
:31Process STRINGTOHEX16
PROC STRINGTOHEX16 (BOOL Error, INT16 n, VAL []BYTE string)
hex16ta.occ
:47Process HEX16TOSTRING
PROC HEX16TOSTRING (INT len, []BYTE string, VAL INT16 n)
strr32ta.occ
:44Process STRINGTOREAL32
PROC STRINGTOREAL32 (BOOL Error, REAL32 X, VAL []BYTE string)
Converts BYTE array string into a REAL32 number X
If the value represented by string overflows the REAL32 range then an appropriately signed infinity is returned in X. If the absolute value represented by string is in the range 2^149 to just less than 2^126, then a denormalised number is returned. If the absolute value represented by string is less than 2^149 then zero is returned. If the syntax of string is incorrect then not only is Error set to TRUE, but a NotaNumber ( NaN ) is returned for X. If there remain characters after the end of the longest correct string, although Error is set to TRUE, X is returned with the value of the correct part of string
Parameters:
BOOL 
Error 
TRUE if the syntax of string is not correct occam, or if there are any characters after the end of the longest correct string; otherwise it is FALSE 
REAL32 
X 
the binary representation in IEEE single precision format of the real decimal in string 
VAL []BYTE 
string 
a sequence of ASCII characters 
validch.occ
:25Function ValidDigit
INT, BOOL INLINE FUNCTION ValidDigit (VAL BYTE ch)
validch.occ
:50Function ValidHexDigit
INT, BOOL INLINE FUNCTION ValidHexDigit (VAL BYTE ch)