Document revision date: 19 July 1999
|
|
|
|
OpenVMS RTL Library (LIB$) Manual
1.2 Translated Version of LIB$ Facility (Alpha Only)
The RTL LIB$ facility exists in two forms on OpenVMS Alpha systems:
native and translated. The translated LIB$ library contains routines
specific to VAX systems only, and are executed in the Translated Image
Environment (TIE). These routines are not available to native OpenVMS
Alpha programs. See DECmigrate for OpenVMS AXP Systems Translating Images for additional information on using
translated images and the TIE.
Table 1-2 lists the translated LIB$ routines.
Table 1-2 Translated LIB$ Routines (Alpha Only)
Routine Name |
Restriction |
LIB$DECODE_FAULT
|
Decodes VAX instructions.
|
LIB$DEC_OVER
|
Applies to VAX PSL only.
|
LIB$ESTABLISH
|
Supported by compilers on OpenVMS Alpha systems.
|
LIB$FIXUP_FLT
|
Applies to VAX PSL only.
|
LIB$FLT_UNDER
|
Applies to VAX PSL only.
|
LIB$INT_OVER
|
Applies to VAX PSL only.
|
LIB$REVERT
|
Supported by compilers on OpenVMS Alpha systems.
|
LIB$SIM_TRAP
|
Applies to VAX code.
|
LIB$TPARSE
|
Requires action routine interface changes. Replaced by LIB$TABLE_PARSE.
|
LIB$ routines that are called using JSB linkages may function
differently on OpenVMS VAX and OpenVMS Alpha systems. See OpenVMS Programming Interfaces: Calling a System Routine
for more information on using JSB linkages.
1.3 Run-Time Library CVT$ Facility
This manual describes the Run-Time Library CVT$ facility and its
routines: CVT$CONVERT_FLOAT and CVT$FTOF. The CVT$ facility lets you
convert data stored in one OpenVMS data type into data of another data
type. Table 1-3 lists the routines in the CVT$ facility.
Table 1-3 CVT$ Routines
Routine Name |
Function |
CVT$CONVERT_FLOAT
|
Converts data in one of several floating-point data types to another
floating-point data type.
|
CVT$FTOF
|
Enhanced version of CVT$CONVERT_FLOAT that provides better performance
and more output options than CVT$CONVERT_FLOAT, and also enhances
portability between Digital-supported platforms.
|
Part 2
LIB$ Reference Section
This part contains detailed descriptions of the routines provided by
the OpenVMS RTL Library (LIB$) Facility.
LIB$ADAWI
The Add Aligned Word with Interlock routine allows the user to perform
an interlocked add operation using an aligned word.
Format
LIB$ADAWI add ,sum ,sign
RETURNS
OpenVMS usage: |
cond_value |
type: |
longword (unsigned) |
access: |
write only |
mechanism: |
by value |
Arguments
add
OpenVMS usage: |
word_signed |
type: |
word (signed) |
access: |
read only |
mechanism: |
by reference |
The addend operand to be added to the value of sum.
The add argument is the address of a signed word that
contains the addend operand.
sum
OpenVMS usage: |
word_signed |
type: |
word integer (signed) |
access: |
modify |
mechanism: |
by reference |
The word to which add is added. The
sum argument is the address of a signed word integer
containing this value. The add operand is added to the
sum operand, and the value of the sum
argument is replaced by the result of this addition. The
sum argument must be word-aligned; in other words, its
address must be a multiple of 2.
sign
OpenVMS usage: |
word_signed |
type: |
word integer (signed) |
access: |
write only |
mechanism: |
by reference |
Sign of the sum argument. The sign
argument is the address of a signed word integer that is assigned the
value --1, 0, or 1, depending on whether the new value of
sum is negative, 0, or positive.
Description
LIB$ADAWI allows the user to perform an interlocked add operation using
an aligned word, and makes the VAX ADAWI1 instruction
available as a callable routine. This routine also enables the user to
implement synchronization primitives for multiprocessing.
The add operation is interlocked against similar operations on other
processors in a multiprocessor environment. This provides an atomic
addition operation. The destination must be aligned on a word boundary;
that is, bit 0 of the address of the sum operand must be 0.
If the addend and the sum operand overlap, the result of the addition,
the value of the sign argument, and the associated
condition codes are unpredictable.
The value of the sign argument is useful when
LIB$ADAWI is used to implement locking in a multiprocessing program.
For example, a process that is waiting to seize a lock or a resource
calls LIB$ADAWI to add 1 to the sum. When the call returns, the waiting
process checks the value of sign.
One possible algorithm would interpret the value of
sign as follows:
Value of sign Argument |
Status of Lock or Resource |
-1
|
Open lock or free resources
|
0
|
Closed lock or no free resources, with no processes waiting
|
+1
|
Closed lock or no free resources, with processes waiting
|
In this algorithm, if the value of the sign argument
is -1, that indicates that the process successfully seized the lock or
resource, and other free resources are available. A value of 0
indicates that the process successfully seized the lock or the last
available resource. A value of 1 indicates that the process was unable
to seize the lock.
It is not sufficient for a waiting process to test the value of
sum. The result is unpredictable because other
processes can alter the value of sum after the
original process executes the ADAWI instruction but before it tests the
value of sum. However, a process can safely test the
value of sign because its value is determined by the
ADAWI instruction and is unaffected by other processes' activities.
Condition Values Returned
LIB$_NORMAL
|
Routine successfully completed.
|
LIB$_INTOVF
|
Integer overflow error.
|
Note
1 On Alpha systems, OpenVMS Alpha
instructions perform the equivalent operation.
|
LIB$ADDX
The Add Two Multiple-Precision Binary Numbers routine adds two signed
two's complement integers of arbitrary length.
Format
LIB$ADDX addend-array ,augend-array ,resultant-array
[,array-length]
RETURNS
OpenVMS usage: |
cond_value |
type: |
longword (unsigned) |
access: |
write only |
mechanism: |
by value |
Arguments
addend-array
OpenVMS usage: |
vector_longword_signed |
type: |
unspecified |
access: |
read only |
mechanism: |
by reference, array reference |
First multiple-precision, signed two's complement integer that LIB$ADDX
adds to the second two's complement integer. The
addend-array argument is the address of the array
containing the two's complement number to be added.
augend-array
OpenVMS usage: |
vector_longword_signed |
type: |
unspecified |
access: |
read only |
mechanism: |
by reference, array reference |
Second multiple-precision, signed two's complement integer that
LIB$ADDX adds to the first two's complement integer. The
augend-array argument is the address of the array
containing the two's complement number.
resultant-array
OpenVMS usage: |
vector_longword_signed |
type: |
unspecified |
access: |
write only |
mechanism: |
by reference, array reference |
Multiple-precision, signed two's complement integer result of the
addition. The resultant-array argument is the address
of the array into which LIB$ADDX writes the result of the addition.
array-length
OpenVMS usage: |
longword_signed |
type: |
longword integer (signed) |
access: |
read only |
mechanism: |
by reference |
Length in longwords of the arrays to be operated on; each array is of
length array-length. The array-length
argument is the address of a signed longword integer containing the
length. The array-length argument must not be
negative. This is an optional argument. If omitted, the default is 2.
Description
LIB$ADDX adds two signed two's complement integers of arbitrary length.
The integers are located in arrays of longwords. The higher addresses
of these longwords contain the higher precision parts of the values.
The highest- addressed longword contains the sign and 31 bits of
precision. The remaining longwords contain 32 bits of precision in
each. The number of longwords in each array is specified in the
optional argument array-length. The default array
length is 2, which corresponds to the OpenVMS quadword data type.
Any two or all three of the first three arguments can be the same.
Condition Values Returned
SS$_NORMAL
|
Routine successfully completed.
|
SS$_INTOVF
|
Integer overflow. The result is correct, except that the sign bit is
lost.
|
Example
|
C+
C This Fortran example program shows the use
C of LIB$ADDX.
C-
INTEGER A(2),B(2),C(2),RETURN
DATA A/'00000001'x,'7FFF407F'x/
DATA B/'FFFFFFFF'x,'8000BF80'x/
C+
C The highest addressed longword of "A" is A(2).
C So, "A" represents the integer value ('7FFF407F'x) * 16**7 + 1.
C That is, A(2) is 576447592255193089.
C "B" is the twos complement representation of "-A".
C-
RETURN = LIB$ADDX(A,B,C)
TYPE *,'Let A = 576447592255193089.'
TYPE *,'Then A + B is 0.'
TYPE 1,C(2),C(1)
1 FORMAT(' "A" - "A" is ',1H',I1,I1,3H'x.)
TYPE *,'Note that C is C(2) concatenated with C(1).'
C+
C Let "A" have the value 72057594037927937 = '1000000000000001'x.
C Let "B" have the value 4294967295 = '00000000FFFFFFFF'x.
C-
A(1) = '00000001'x
A(2) = '10000000'x
B(1) = 'FFFFFFFF'x
B(2) = '00000000'x
C+
C Then "A" + "B" is 72057598332895232.
C-
RETURN = LIB$ADDX(A,B,C)
TYPE *,' '
TYPE *,'LET A = 72057594037927937 and B = 4294967295'
TYPE *,'Then A + B is ',C
TYPE 2,C(2),C(1)
2 FORMAT(' 72057598332895232 is represented as ',1H',Z8.8,Z8.8,3H'x.)
TYPE *,'Recall that 72057598332895232 is C(2) concatenated
1 with C(1).'
END
|
This Fortran example demonstrates how to call LIB$ADDX. The output
generated by this program is as follows:
Let A = 576447592255193089.
Then A + B is 0.
"A" - "A" is '00'x.
Note that C is C(2) concatenated with C(1).
LET A = 72057594037927937 and B = 4294967295
Then A + B is 0 268435457
72057598332895232 is represented as '10000001 0'x.
Recall that 72057598332895232 is C(2) concatenated with C(1).
|
LIB$ADD_TIMES
The Add Two Quadword Times routine adds two internal format times.
Format
LIB$ADD_TIMES time1 ,time2 ,resultant-time
RETURNS
OpenVMS usage: |
cond_value |
type: |
longword (unsigned) |
access: |
write only |
mechanism: |
by value |
Arguments
time1
OpenVMS usage: |
date_time |
type: |
quadword (unsigned) |
access: |
read only |
mechanism: |
by reference |
First time that LIB$ADD_TIMES adds to the second time. The
time1 argument is the address of an unsigned quadword
containing the first time to be added. The time1
argument may be either a delta time or an absolute time; however, at
least one of the arguments, time1 or
time2, must be a delta time.
time2
OpenVMS usage: |
date_time |
type: |
quadword (unsigned) |
access: |
read only |
mechanism: |
by reference |
Second time that LIB$ADD_TIMES adds to the first time. The
time2 argument is the address of an unsigned quadword
containing the second time to be added. The time2
argument may be either a delta time or an absolute time; however, at
least one of the arguments, time1 or
time2, must be a delta time.
resultant-time
OpenVMS usage: |
date_time |
type: |
quadword (unsigned) |
access: |
write only |
mechanism: |
by reference |
The result of adding time1 and time2.
The resultant-time argument is the address of an
unsigned quadword containing the result. If both time1
and time2 are delta times, then
resultant-time is a delta time. Otherwise,
resultant-time is an absolute time.
Description
LIB$ADD_TIMES adds two OpenVMS internal times. It can add two delta
times or a delta time and an absolute time. LIB$ADD_TIMES cannot add
two absolute times.
Condition Values Returned
LIB$_NORMAL
|
Routine successfully completed.
|
LIB$_IVTIME
|
Invalid time.
|
LIB$_ONEDELTIM
|
At least one delta time is required.
|
LIB$_WRONUMARG
|
Incorrect number of arguments.
|
LIB$ANALYZE_SDESC
The Analyze String Descriptors routine extracts the length and the
address at which the data starts for a variety of 32-bit string
descriptor classes.
Format
LIB$ANALYZE_SDESC input-descriptor ,data-length ,data-address
Corresponding JSB Entry Point
LIB$ANALYZE_SDESC_R2
RETURNS
OpenVMS usage: |
cond_value |
type: |
longword (unsigned) |
access: |
write only |
mechanism: |
by value |
Arguments
input-descriptor
OpenVMS usage: |
descriptor |
type: |
quadword (unsigned) |
access: |
read only |
mechanism: |
by reference |
Input descriptor from which LIB$ANALYZE_SDESC extracts the length of
the data and the address at which the data starts. The
input-descriptor argument is the address of a
descriptor pointing to the input data.
data-length
OpenVMS usage: |
word_unsigned |
type: |
word (unsigned) |
access: |
write only |
mechanism: |
by reference |
Length of the data; LIB$ANALYZE_SDESC extracts this length value from
the input descriptor. The data-length argument is the
address of an unsigned word integer into which LIB$ANALYZE_SDESC writes
the length.
data-address
OpenVMS usage: |
address |
type: |
longword (unsigned) |
access: |
write only |
mechanism: |
by reference |
Starting address of the data; LIB$ANALYZE_SDESC extracts this address
from the input descriptor. The data-address argument
is the address of an unsigned longword into which LIB$ANALYZE_SDESC
writes the starting address of the data.
Description
LIB$ANALYZE_SDESC extracts the length and the address at which the data
starts for a variety of 32-bit string descriptor classes. Following is
a description of the classes of string descriptors.
Class |
Description |
Restrictions/Notes |
A
|
Array
|
DSC$L_ARSIZE must be less than 65,536 bytes.
|
D
|
Decimal string
|
Treated as class S.
|
NCA
|
Noncontiguous array
|
Same as class A.
|
S
|
Scalar, string
|
None.
|
SD
|
Decimal scalar
|
Treated as class S.
|
VS
|
Varying string
|
Length returned is CURLEN.
|
Z
|
Unspecified
|
Treated as class S.
|
See STR$ANALYZE_SDESC for a similar routine that signals an error
rather than returning a status.
Condition Values Returned
SS$_NORMAL
|
Routine successfully completed.
|
LIB$_INVSTRDES
|
Invalid string descriptor. An array descriptor has an ARSIZE greater
than 65,535 bytes, or the class is unsupported.
|
LIB$ANALYZE_SDESC_64 (Alpha Only)
The Analyze String Descriptor routine extracts the length and the
address at which the data starts for a variety of 32-bit and 64-bit
string descriptor classes.
Format
LIB$ANALYZE_SDESC_64 input-descriptor ,data-length ,data-address
[,descriptor-type]
Corresponding JSB Entry Point
LIB$ANALYZE_SDESC_R2
Refer to the LIB$ANALYZE_SDESC routine for information about the JSB entry
point, LIB$ANALYZE_SDESC_R2. This JSB entry point returns 64-bit
results on Alpha systems.
RETURNS
OpenVMS usage: |
cond_value |
type: |
longword (unsigned) |
access: |
write only |
mechanism: |
by value |
Arguments
input-descriptor
OpenVMS usage: |
descriptor |
type: |
longword (unsigned) or quadword (unsigned) |
access: |
read only |
mechanism: |
by reference |
Input descriptor from which LIB$ANALYZE_SDESC_64 extracts the length of
the data and the address at which the data starts. The
input-descriptor argument is the address of a
descriptor pointing to the input data. The input descriptor can be a
longword (unsigned) or a quadword (unsigned).
data-length
OpenVMS usage: |
quadword_unsigned |
type: |
quadword (unsigned) |
access: |
write only |
mechanism: |
by reference |
Length of the data; LIB$ANALYZE_SDESC_64 extracts this length value
from the input descriptor. The data-length argument is
the address of an unsigned quadword integer into which
LIB$ANALYZE_SDESC_64 writes the length.
data-address
OpenVMS usage: |
address |
type: |
quadword (unsigned) |
access: |
write only |
mechanism: |
by reference |
Starting address of the data; LIB$ANALYZE_SDESC_64 extracts this
address from the input descriptor. The data-address
argument is the address of an unsigned quadword into which
LIB$ANALYZE_SDESC_64 writes the starting address of the data.
descriptor-type
OpenVMS usage: |
longword_unsigned |
type: |
longword (unsigned) |
access: |
write only |
mechanism: |
by reference |
Flag value indicating the type of input descriptor. The
descriptor-type argument contains the address of an
unsigned longword integer to which LIB$ANALYZE_SDESC_64 writes a 0 for
a 32-bit input descriptor or a 1 for a 64-bit descriptor.
This argument is optional.
Description
LIB$ANALYZE_SDESC_64 extracts the length and the address at which the
data starts for a variety of 32-bit and 64-bit string descriptor
classes. Following is a description of the classes of string
descriptors:
Class |
Description |
Restrictions/Notes |
A
|
Array
|
For 32-bit descriptors, DSC$L_ARSIZE must be less than 2
16, or 65,536, bytes. For 64-bit descriptors, DSC64$Q_ARSIZE
must be less than 2
64 bytes.
|
D
|
Decimal string
|
Treated as class S.
|
NCA
|
Noncontiguous array
|
Same as class A.
|
S
|
Scalar, string
|
None.
|
SD
|
Decimal scalar
|
Treated as class S.
|
VS
|
Varying string
|
Length returned is CURLEN.
|
Z
|
Unspecified
|
Treated as class S.
|
See STR$ANALYZE_SDESC_64 for a similar routine that signals an error
rather than returning a status.
Condition Values Returned
SS$_NORMAL
|
Routine successfully completed.
|
LIB$_INVSTRDES
|
Invalid string descriptor. An array descriptor has an ARSIZE greater
than 65,535 bytes, or the class is unsupported.
|