\chapter{EXTENSION LIBRARY} \label{sec:extlib}
The SUPES Extension Library provides a uniform interface to
necessary operating system functions which are not included in the ANSI
FORTRAN-77 standard.
While the Extension Library itself is implemented in the C programming language,
the interface from a FORTRAN calling program is implemented in
the same manner as in previous versions of SUPES~\cite{SUPES}.
Thus, in the sections below which describe the calling sequence,
the calls are defined accordingly.
This package makes it possible to maintain many codes on
different operating systems with a single point of support for system
dependencies.
Moreover,
this maintenance is done via a single set of source files which
should not only reduce the time involved in bookkeeping,
but allow for the procedures for building a SUPES library to be codified
as well.
These routines provide very basic operating system support;
they are not intended to implement clever features of a favorite system, to
make FORTRAN behave like a more elegant language, or to improve execution
efficiency.

Each module included in the SUPES Extension Library must satisfy the
following criteria:
\begin{enumerate}
\item The routine must provide a service which is beneficial to a wide
range of users.

\item This task cannot be accomplished via standard FORTRAN.

\item This capability must be generic to scientific computers.  Extension
library routines must be supportable on virtually any system.
\end{enumerate}

The SUPES Extension Library routines are designed to minimize the
effort required to implement this software on a new operating system.
This is especially true given that the current single set of source
files handle a variety of system architectures and software
configurations, making those files useful as starting points for a new
port.

Operating system dependencies have been isolated at the lowest
possible level with the major difficulty of a specific port being that
of supplying the proper FORTRAN interface with each C subprogram
module.

\section{User Interface Routines}
This section prescribes the calling sequence for FORTRAN Extension routines
that are meant to be called directly from application programs.

\subsection{Get Today's Date (EXDATE)}

\code{CALL EXDATE( STRING )}

\begin{argy}{STRING}{CHARACTER$*$8}{Write Only}
Current date formatted as ``MM/DD/YY'' where ``MM'', ``DD'', and ``YY'' are
two digit integers representing the month, day, and year, respectively.  For
example, ``07/04/86'' would be returned on July 4, 1986.
\end{argy}

\subsection{Get Time of Day (EXTIME)}

\code{CALL EXTIME( STRING )}

\begin{argy}{STRING}{CHARACTER$*$8}{Write Only}
Current time formatted as ``HH:MM:SS'' where ``HH'', ``MM'', and ``SS'' are
two digit integers representing the hour (00-24), minute, and second,
respectively.  For example, ``16:30:00'' would be returned at 4:30 PM.
\end{argy}

\subsection{Get Accumulated Processor Time (EXCPUS)}

\code{CALL EXCPUS( CPUSEC )}

\begin{argy}{CPUSEC}{REAL}{Write Only}
Accumulated CPU time in seconds.  The base time is undefined; only relative
times are valid.  This is an unweighted value which measures performance
rather than cost.
\end{argy}

\subsection{Get Operating Environment Parameters (EXPARM)}

\code{CALL EXPARM( HARD,SOFT,MODE,KCSU,KNSU,IDAU )}

\begin{argy}{HARD}{CHARACTER$*$8}{Write Only}
System Hardware ID.  For example, ``CRAY-1/S''.
\end{argy}

\begin{argy}{SOFT}{CHARACTER$*$8}{Write Only}
System Software ID.  For example, ``COS 1.11''.
\end{argy}

\begin{argy}{MODE}{INTEGER}{Write Only}
Job mode: 0 = batch, 1=interactive.  For this purpose, an interactive
environment means that the user can respond to unanticipated questions.
\end{argy}

\begin{argy}{KCSU}{INTEGER}{Write Only}
Number of character storage units per base system unit.
\end{argy}

\begin{argy}{KNSU}{INTEGER}{Write Only}
Number of numeric storage units per base system unit.
\end{argy}

\begin{argy}{IDAU}{INTEGER}{Write Only}
Units of storage which define the size of unformatted direct access I/O
records: 0 = character, 1 = numeric.
(For a more in-depth discussion of this topic, the reader is
referred to the VAX FORTRAN manual,
section 13.1.21.)
\end{argy}

The ANSI FORTRAN standard defines a character storage unit as the amount of
memory required to store one CHARACTER element.  A numeric storage unit is
the amount of memory required to store one INTEGER, LOGICAL, or REAL
element.  For this routine, a base system unit is defined as the smallest
unit of memory which holds an integral number of both character and numeric
storage units.

The last three parameters above can be used to calculate the proper value
for the RECL specifier on the OPEN statement for a direct access I/O unit.
For example, if NUM is the number of numeric values to be contained on a
record and IDAU=0, set RECL = ( NUM * (KCSU + KNSU-1) ) / KCSU.


\subsection{Get Unit File Name or Symbol Value (EXNAME)}

\code{CALL EXNAME( IUNIT,NAME,LN )}

\begin{argy}{IUNIT}{INTEGER}{Read Only}
Unit number if IUNIT $>$ 0, or symbol ID if IUNIT $\leq$ 0.
\end{argy}

\begin{argy}{NAME}{CHARACTER$*$($*$)}{Write Only}
File name or symbol value obtained from the operating system. It is assumed
that the unit/file name or symbol/value linkage will be passed to this
routine at program activation.
\end{argy}

\begin{argy}{LN}{INTEGER}{Write Only}
Effective length of the string returned in NAME.  Zero indicates that no
name or value was available.
\end{argy}

This routine provides a standard interface for establishing execution time
unit/file connection on operating systems (such as CTSS) which do not
support pre-connection of FORTRAN I/O units.  The returned string is used
with the FILE specifier in an OPEN statement, as in the following example.
\begin{verbatim}
      CALL EXNAME( 10,NAME,LN )
      OPEN( 10,FILE=NAME(1:LN),... )
\end{verbatim}
The symbol mode of this routine provides a standard path through which to
pass messages at program activation.  An example use is identifying the
target graphics device for a code which supports multiple devices.

\section{Utility Support Routines}
The routines prescribed in this section are intended primarily to support
the SUPES free field input and memory manager utilities.  While calling
these routines directly will not disturb the internal operation of these
other facilities, the use of EXMEMY (section~\ref{sec:exmemy}) in
conjunction with the memory manager is discouraged.

\subsection{Convert String to Uppercase (EXUPCS)} \label{sec:exupcs}

\code{CALL EXUPCS( STRING )}

\begin{argy}{STRING}{CHARACTER$*$($*$)}{Read and Write}
Character string for which lowercase letters will be translated to
uppercase.  All other characters which are not in the printable ASCII character
set are converted to spaces.
\end{argy}

\subsection{Prompt/Read/Echo Input Record (EXREAD)} \label{sec:exread}

\code{CALL EXREAD( PROMPT,INPUT,IOSTAT )}

\begin{argy}{PROMPT}{CHARACTER$*$($*$)}{Read Only}
Prompt string.
\end{argy}

\begin{argy}{INPUT}{CHARACTER$*$($*$)}{Write Only}
Input record from standard input device.
\end{argy}

\begin{argy}{IOSTAT}{INTEGER}{Write Only}
ANSI FORTRAN I/O status:\\
\begin{tabular}{cccl}
IOSTAT &$<$ & 0 & End of File\\
IOSTAT &=   & 0 & Normal\\
IOSTAT &$>$ & 0 & Error\\
\end{tabular}
\end{argy}

This routine will prompt for input if the standard input device is
interactive.  In any case, the input line will be echoed to the standard
output device with the prompt string as a prefix.


\subsection{Evaluate Numeric Storage Location (IXLNUM)}

\code{NUMLOC = IXLNUM( NUMVAR )}

\begin{argy}{NUMVAR}{INTEGER or REAL}{Read Only}
Any numeric variable.
\end{argy}

\begin{argy}{NUMLOC}{INTEGER}{Write Only}
Numeric location of NUMVAR.  This value is an address measured in ANSI
FORTRAN numeric storage units.
\end{argy}


\subsection{Evaluate Character Storage Location (IXLCHR)}

\code{CHRLOC = IXLCHR( CHRVAR )}

\begin{argy}{CHRVAR}{CHARACTER}{Read Only}
Any character variable.
\end{argy}

\begin{argy}{CHRLOC}{INTEGER}{Write Only}
Character location of CHRVAR.  This value is an address measured in ANSI
FORTRAN character storage units.
\end{argy}


\subsection{Get/Release Memory Block (EXMEMY)} \label{sec:exmemy}

\code{CALL EXMEMY( MEMREQ,LOCBLK,MEMRTN )}

\begin{argy}{MEMREQ}{INTEGER}{Read Only}
Number of numeric storage units to allocate if MEMREQ $>$ 0, or release if
MEMREQ $<$ 0.
\end{argy}

\begin{argy}{LOCBLK}{INTEGER}{Read (release) or Write (allocate)}
Numeric location of memory block.  This value is an address measured in ANSI
FORTRAN numeric storage units. Only memory previously allocated to the
caller via EXMEMY can be released via EXMEMY.
\end{argy}

\begin{argy}{MEMRTN}{INTEGER}{Write Only}
Size of memory block returned in numeric storage units.
\end{argy}

In allocate mode, \code{MEMRTN < MEMREQ} indicates that a sufficient amount of
storage could not be obtained from the operating system.  \code{MEMRTN > MEMREQ}
indicates that the operating system rounded up the storage request.

In release mode, memory will always be released from the high end of the
block downward.  \code{MEMRTN = 0} indicates that the entire block was returned to
the operating system.
