%表題   MATH1下位基本数学処理ライブラリリファレンスマニュアル
%
%履歴
%\Drireki{
%         90/03/22 塩谷雅人
%         91/09/05 林祥介
%         91/12/11 塩谷雅人
%         92/03/14 塩谷雅人
%         92/04/13 塩谷雅人
%         92/04/22 林祥介   (4.1版)
%         94/01/22 塩谷雅人
%         94/02/14 酒井敏
%         94/05/07 塩谷雅人
%         95/04/20 塩谷雅人
%        }
%
%\Dchapter{SYSLIB : 内部変数管理, メッセージ出力}
\Dchapterhead
\label{syslib}

\section{概要}

MATH1下位基本数学処理ライブラリの(そしてまた電脳ライブラリの)
最下位に位置するパッケージで,
内部変数の管理やメッセージの出力をする.
システムに依存する定数を管理したり, 
ファイル操作をおこなったりするルーチンが含まれているが, 
ソースレベルでの機種依存性はない.

\section{サブルーチンのリスト}

  \begin{tabular}{lp{10cm}}
    {\tt \GLPGET (CP,IPARA)}	& 内部変数を参照する.  \\
    {\tt \GLPSET (CP,IPARA)}	& 内部変数を変更する.  \\
    {\tt \GLPSTX (CP,IPARA)}	& 内部変数を変更する
                                  (実行時オプションによる変更を許す).  \\
    {\tt MSGDMP(CLEV,CSUB,CMSG)} & メッセージを出力する.  \\
    {\tt RTPGET(CPFIX,CP,IPARA,N)} & 実行時オプションから
				内部変数を取得する. \\
    {\tt RTCGET(CPFIX,CP,CPARA,N)} & 実行時オプションから
				内部変数 (文字変数) を取得する. \\
    {\tt CFSRCH(CPL,NP,CFL,NF,CFN)} & パス名の先頭部分と末尾部分の
                     リストの組合せから, 存在するファイル名を探す.
  \end{tabular}

\section{関数のリスト}

  \begin{tabular}{lp{10cm}}
    {\tt LCHREQ(CH1,CH2)} & 大文字・小文字の区別なく文字列を比較する. \\
    {\tt IUFOPN()} & 利用可能な入出力装置番号を返す. 
  \end{tabular}

\section{サブルーチンの説明}

  \subsection{GL{\it p}GET/GL{\it p}SET(GL{\it p}STX)}
  \label{syslib.sub.glpget}

    \begin{enumerate}
      \item 機能
        \begin{quote}
          MATH1で(さらには電脳ライブラリ全体で)
          使用する内部変数を参照/変更する.
          ( \GLPSTX は実行時オプションによる変更を許す. )
          内部変数はすべて参照可能であるが,
          システムに依存するような内部変数は変更できない.
        \end{quote}
      \item 呼び出し方法
        \begin{quote}
          {\tt CALL \GLPGET (CP,IPARA)} \\
          {\tt CALL \GLPSET (CP,IPARA)} \\
          {\tt CALL \GLPSTX (CP,IPARA)}
        \end{quote}
      \item パラメーターの説明
        \begin{quote}
          \begin{tabular}{llp{10cm}}
            {\tt CP} & {\tt (C*8)} & 内部変数の名前.  \\
            {\tt IPARA} & {\tt (I,R,L)} & 内部変数の値.
          \end{tabular}

          \vspace{1em}
          以下に{\tt CP}として指定できる名前のリストを記す.

          \vspace{1em}
          \begin{tabular}{llp{10cm}}
            {\tt 'NBITSPW'}  & {\tt (I)}
                             & 1語のビット長. システム依存(ふつうは32). \\
            {\tt 'NCHRSPW'}  & {\tt (I)}
                             & 1語の文字長. システム依存(ふつうは4). \\
            {\tt 'INTMAX'}   & {\tt (I)}
                             & 1語で表現できる最大の整数.
                               システム依存(備考参照). \\
            {\tt 'REALMAX'}  & {\tt (R)}
                             & 1語で表現できる最大の実数.
                               システム依存(備考参照). \\
            {\tt 'REALMIN'}  & {\tt (R)}
                             & 1語で表現できる最小の正の実数.
                               システム依存(備考参照). \\
            {\tt 'IIUNIT'}   & {\tt (I)} & 標準入力装置番号. システム依存
              (ふつうは5). \\
            {\tt 'IOUNIT'}   & {\tt (I)} & 標準出力装置番号. システム依存
              (ふつうは6). \\
            {\tt 'MSGUNIT'}  & {\tt (I)} & メッセージを出力する出力装置番号
              (初期値は{\tt 'IOUNIT'}と同じ).  \\
            {\tt 'MAXMSG'}   & {\tt (I)} & 出力する最大メッセージ数
              (初期値は20).  \\
            {\tt 'MSGLEV'}   & {\tt (I)} & 出力するメッセージレベル.
              0以下ならすべてのレベルのメッセージを出力する;
              1なら警告, エラーメッセージを出力する;
              2以上ならエラーメッセージだけ出力する
              (初期値は0).  \\
            {\tt 'NLNSIZE'} & {\tt (I)} & 一行に出力するメッセージの
              最大文字数(初期値は78).
              メッセージを出力する際,
              各行の第一カラムにはブランクを書き出すので,
              実際の一行の長さは {\tt 'NLNSIZE'}+1 である.  \\
            {\tt 'LMISS'} & {\tt (L)} & 欠損値処理をおこなうか
              どうかを指定する.
              {\tt .TRUE.}ならおこなう, {\tt .FALSE.}ならおこなわない
              (初期値は{\tt .FALSE.}).  \\
            {\tt 'IMISS'} & {\tt (I)}
              & 欠損値処理をおこなうときの整数型の欠損値を指定する
              (初期値は999).  \\
            {\tt 'RMISS'} & {\tt (R)}
              & 欠損値処理をおこなうときの実数型の欠損値を指定する
              (初期値は999.0). \\
            {\tt 'IUNDEF'} & {\tt (I)}
              & 不定であることを示す整数型の値
              (初期値は--999).  \\
            {\tt 'RUNDEF'} & {\tt (I)}
              & 不定であることを示す実数型の値
              (初期値は--999.0).  \\
            {\tt 'LEPSL'} & {\tt (L)} & 実数値を比較するとき,
              誤差を含めた判断をするかどうかを指定する
              (第\ref{lrllib},\ref{blklib},\ref{gnmlib},\ref{intlib}章参照).
              {\tt .TRUE.}なら誤差を含めた判断をする;
              {\tt .FALSE.}なら誤差を含めた判断をしない
              (初期値は{\tt .FALSE.}). \\
            {\tt 'REPSL'} & {\tt (R)}
              & 誤差を含めた判断をするときの相対誤差の基準値.
              システム依存(備考参照). \\
            {\tt 'RFACT'} & {\tt (R)} & 誤差を含めた判断をするとき,
              相対誤差の基準値にかけるスケーリングファクター
              (初期値は1.0).
          {\tt 'REPSL'}$\times ${\tt 'RFACT'}が相対誤差として用いられる. \\
          \end{tabular}
        \end{quote}
      \item 備考
        \begin{enumerate}
          \item 内部変数を管理するための下請けルーチンとして
            以下のものがある.
            \begin{quote}
            \begin{tabular}{lp{8cm}}
              {\tt GLPQNP(NCP)}       &
                内部変数の総数{\tt NCP}を求める. \\
              {\tt GLPQID(CP,IDX)}    &
                内部変数{\tt CP}の位置{\tt IDX}を求める.  \\
              {\tt GLPQCP(IDX,CP)}    &
                {\tt IDX}の位置にある内部変数の名前{\tt CP}を参照する.  \\
              {\tt GLPQVL(IDX,IPARA)} &
                {\tt IDX}の位置にある内部変数の値{\tt IPARA}を参照する.  \\
              {\tt GLPSVL(IDX,IPARA)} &
                {\tt IDX}の位置にある内部変数の値{\tt IPARA}を変更する.  \\
           \end{tabular}
           \end{quote}
         \item \GLPGET は上に述べた{\tt GLPQID}を呼んで
            内部変数の位置を求め, {\tt GLPQVL}によって値を参照する;
            \GLPSET は{\tt GLPQID}を呼んで内部変数の位置を求め,
            {\tt GLPSVL}によって値を設定する.
            したがって指定した内部変数名が見つからないとき,
            エラーメッセージは{\tt GLPQID}が出力する.
          \item {\tt IPARA}としては適切な型の定数または変数を指定すること.
          \item 内部変数の名前は, 大文字・小文字の区別なく文字列を比較する
            文字関数{\tt LCHREQ}を用いてチェックされるので,
            {\tt LCHREQ}が正しく移植されていれば,
            小文字で指定してもよい.
          \item {\tt 'REALMIN'}があらわす最小の正の実数は,
            仮数部の最上位の桁が0でないものとする.
            これは必ずしも UNDER FLOW を起こす直前の値ではないので
            注意すること.
            すなわち, 通常実数型の変数は仮数部の最上位の桁が
            0でないように規格化されるが,
            システムによってはこのような規格化をすると
            指数部が足りなくなるような小さな値でも,
            仮数部の上位の桁を0にすることで表現するものがある.
            このような値は一応実数として扱われるが,
            通常の実数の精度はない.
            つまり{\tt 'REALMIN'}は通常の精度を持つ
            最小の正の実数である.
          \item {\tt 'REPSL'}があらわす相対誤差の基準値は,
            実数表現の相対誤差の最大値の10倍とする.
            この10倍という値には任意性があるが計算結果の精度の目安
            として安全率を10倍としたものである.
            実数表現の相対誤差は内部表現の形から
            論理的にもとめることができるが,
            実際に実数の仮数部の最下位 bit を on/off
            することでも求めることができる.
            1語の中の仮数部の位置はシステムによるが,
            1語の最下位 bit が仮数部の最下位 bit であることが多い.
            src/env2/repsl にこのようなチェックをする
            プログラムが含まれている.
          \item システムに依存するパラメーターのうち
            {\tt 'INTMAX'}, {\tt 'REALMAX'}, {\tt 'REALMIN'}, {\tt 'REPSL'}
            は大きく分けて, メインフレーム系の大型計算機とUNIX系の計算機とでは
            次の値をとることが多い.
            \begin{quote}
          \begin{tabular}{lcc}
                            & メインフレーム系 & UNIX系        \\
            {\tt 'INTMAX'}  & 2147483647       & 2147483647    \\
            {\tt 'REALMAX'} & 0.7237005E+76    & 3.4028236E+38 \\
            {\tt 'REALMIN'} & 0.5397605E-78    & 1.1754944E-38 \\
            {\tt 'REPSL'}   & 0.95E-5          & 1.2E-6
          \end{tabular}
            \end{quote}
      \end{enumerate}
    \end{enumerate}

  \subsection{GLCGET/GLCSET(GLCSTX)}
  \label{syslib.sub.glcget}

    \begin{enumerate}
      \item 機能
        \begin{quote}
          MATH1で使用する文字型の内部変数を参照/変更する.
          ({\tt GLCSTX} は実行時オプションによる変更を許す. )
        \end{quote}
      \item 呼び出し方法
        \begin{quote}
          {\tt CALL GLCGET(CP,CPARA)} \\
          {\tt CALL GLCSET(CP,CPARA)} \\
          {\tt CALL GLCSTX(CP,CPARA)}
        \end{quote}
      \item パラメーターの説明
        \begin{quote}
          \begin{tabular}{llp{10cm}}
            {\tt CP} & {\tt (C*8)} & 内部変数の名前.  \\
            {\tt CPARA} & {\tt (C*(*))} & 文字型の内部変数の値.
          \end{tabular}

          \vspace{1em}
          以下に{\tt CP}として指定できる名前のリストを記す.

          \vspace{1em}
          \begin{tabular}{llp{10cm}}
            {\tt 'DCLRC'} & {\tt (C)} &
              実行時オプションを読み込む外部ファイル名
              (標準ライブラリにおける値は{\tt .dclrc}).
              ただし, この内部変数の値がそのままファイル名として
              用いられるわけではない. 
              備考を参照のこと. \\
            {\tt 'DUPATH'} & {\tt (C)} &
              ユーザー用の各種データベースファイルをおくパス名.
              標準ライブラリにおける初期値は{\tt ' '}
              (空白: これはカレントディレクトリをあらわす). \\
            {\tt 'DSPATH'} & {\tt (C)} &
              システムがあらかじめ用意した各種データベースファイルを
              おくパス名. 標準ライブラリにおける値は, インストール時に
              {\tt \$(DCLDBASE)} が示す値となる.
          \end{tabular}
        \end{quote}
      \item 備考
        \begin{enumerate}
          \item 内部変数を管理するための下請けルーチンとして
            以下のものがある.
            \begin{quote}
            \begin{tabular}{lp{8cm}}
              {\tt GLCQNP(NCP)}       &
                内部変数の総数{\tt NCP}を求める. \\
              {\tt GLCQID(CP,IDX)}    &
                内部変数{\tt CP}の位置{\tt IDX}を求める.  \\
              {\tt GLCQCP(IDX,CP)}    &
                {\tt IDX}の位置にある内部変数の名前{\tt CP}を参照する.  \\
              {\tt GLCQVL(IDX,CPARA)} &
                {\tt IDX}の位置にある内部変数の値{\tt IPARA}を参照する.  \\
              {\tt GLCSVL(IDX,CPARA)} &
                {\tt IDX}の位置にある内部変数の値{\tt IPARA}を変更する.  \\
           \end{tabular}
           \end{quote}
         \item {\tt GLCGET} は上に述べた{\tt GLCQID}を呼んで
            内部変数の位置を求め, {\tt GLCQVL}によって値を参照する;
            {\tt GLCSET}は{\tt GLCQID}を呼んで内部変数の位置を求め,
            {\tt GLCSVL}によって値を設定する.
            したがって指定した内部変数名が見つからないとき,
            エラーメッセージは{\tt GLCQID}が出力する.
          \item 内部変数の名前は, 大文字・小文字の区別なく文字列を比較する
            文字関数{\tt LCHREQ}を用いてチェックされるので,
            {\tt LCHREQ}が正しく移植されていれば,
            小文字で指定してもよい.
          \item このルーチンが管理する内部変数を, 外部ファイルを通した
            実行時オプションによって変更することはできない.
            (なぜなら, 再帰的なループに入り込んでしまうため. )
          \item {\tt 'DCLRC'} が示す内部変数は, 
            その内部変数の値がファイル名としてそのまま利用される
            わけではない. 
            実際に利用されるファイル名は {\tt GLQFNM} が決める.
            標準ライブラリではまずカレントディレクトリを探す.
            次に内部変数{\tt 'DUPATH'} (ユーザーの指定するパス名)の
            さすディレクトリを探す.
            最後に内部変数{\tt 'DSPATH'}(システムがあらかじめ
            用意するパス名)のさすディレクトリを探す.
      \end{enumerate}
    \end{enumerate}

  \subsection{MSGDMP}
  \label{syslib.sub.msgdmp}

    \begin{enumerate}
      \item 機能
        \begin{quote}
          メッセージを出力する.
          指定するパラメーターに応じてプログラムは強制終了
          または続行の制御を受ける.
        \end{quote}
      \item 呼び出し方法
        \begin{quote}
          {\tt CALL MSGDMP(CLEV,CSUB,CMSG)}
        \end{quote}
      \item パラメーターの説明
        \begin{quote}
          \begin{tabular}{llp{10cm}}
            {\tt CLEV} & {\tt (C*1)} & メッセージのレベルを
            {\tt 'E'},{\tt 'W'},{\tt 'M'}のうちから1つ指定する.
            メッセージレベルの意味と作用は以下のとおり.  \\
            & & \hspace*{1cm}{\tt 'E':}
              \parbox[t]{8cm}{重大なエラー. プログラムは強制終了する.
              \rule[-1ex]{0ex}{1ex}} \\
            & & \hspace*{1cm}{\tt 'W':}
              \parbox[t]{8cm}{警告.
              何らかの処置をおこなってプログラムは続行する.
              \rule[-1ex]{0ex}{1ex}} \\
            & & \hspace*{1cm}{\tt 'M':}
              \parbox[t]{8cm}{メッセージ.
              何の変更もせずに(あるいは特に問題とならない変更をして)
              プログラムは続行する.
              \rule[-1ex]{0ex}{1ex}} \\
            {\tt CSUB} & {\tt (C*6)}
              & {\tt MSGDMP}を呼んでいるサブルーチン名を指定する.  \\
            {\tt CMSG} & {\tt (C*(*))} & 出力するメッセージ.
          \end{tabular}
        \end{quote}
      \item 備考
        \begin{enumerate}
          \item {\tt 'E'}が指定されたとき,
                システムに依存したエラー処理をおこなって強制終了する
                ルーチン{\tt OSABRT}を呼ぶ.
                (詳しくは\ref{oslib.sub.osabrt}節参照のこと. )
          \item サブルーチンの作用としては,
                {\tt 'W'}と{\tt 'M'}は同じ作用をする.
                2つのパラメーターの違いはユーザーの側で使い分けること.
          \item {\tt CMSG}の最大文字数は174文字.
          \item メッセージを出力する出力装置番号は内部変数{\tt 'MSGUNIT'}
                (初期値は6)で決まる.
          \item 出力する最大メッセージ数は内部変数{\tt 'MAXMSG'}
                (初期値は20)で決まる.
          \item 1行に書く文字数は内部変数{\tt 'NLNSIZE'}
                (初期値は78)で決まる.
          \item 出力するメッセージのレベルは内部変数{\tt 'MSGLEV'}
                (初期値は0)で決まる.
          \item 下位に{\tt MSZDMP}という名前のサブルーチンがある.
        \end{enumerate}
    \end{enumerate}

%-------------------------------------------------------------------

  \subsection{RTPGET/RTCGET}
  \label{syslib.sub.rtpget}

    \begin{enumerate}
      \item 機能
        \begin{quote}
	   実行時オプションから内部変数を取得する.
        \end{quote}
      \item 呼び出し方法
        \begin{quote}
          {\tt CALL RTPGET(CPFIX,CP,IPARA,N)} \\
          {\tt CALL RTCGET(CPFIX,CP,CPARA,N)}
        \end{quote}
      \item パラメーターの説明
        \begin{quote}
          \begin{tabular}{llp{10cm}}
            {\tt CPFIX} & {\tt (C*(*))   } & 変数名の前につける接頭辞. \\
            {\tt CP}    & {\tt (C(*)*8)  } & 変数名.  \\
            {\tt IPARA} & {\tt (I,R,L(*))} & 変数の値. \\
            {\tt CPARA} & {\tt (C(*)*80) } & 変数の値. \\
	    {\tt N  }   & {\tt (I)       } & 内部変数の数.
          \end{tabular}
        \end{quote}
      \item 備考
        \begin{enumerate}
          \item 接頭辞とは, たとえば \GLPGETSET の管理する
                変数の場合 {\tt 'GL:'} のように, 
                {\tt xx{\it p}GET/xx{\it p}SET}
                の {\tt 'xx'} 部分と {\tt ':'}の組合せからなる.
          \item {\tt CP}, {\tt CPARA} として指定する文字型配列は,
                1要素長の長さがそれぞれ 8, 80 でなければならない.
          \item 実行時オプションで該当する変数が指定されていなければ,
		{\tt IPARA}, {\tt CPARA} は変更されない.
	  \item 実行時オプションは,
		標準的には環境変数, コマンドライン引数, 
                外部ファイルを通して入手することを
		念頭においているが, 具体的な実装方法は機種に依存する. 
                しかし, OSLIB (第\ref{oslib}節参照)が正しく移植されて
                いることを前提として,
                実際には以下のルーチンが下請けをおこなっている.
                \begin{quote}
                \begin{tabular}{lp{8cm}}
                  {\tt RTPENV(CPFIX,CP,IPARA)} &
                    環境変数の値を得る. \\
                  {\tt RTPOPT(CPFIX,CP,IPARA)} &
                    コマンドラインオプションの値を得る. \\
                  {\tt RTPXFL(CPFIX,CP,IPARA)} &
                    外部ファイルからオプションの値を得る. \\
                  {\tt RTCENV(CPFIX,CP,CVAL)} &
                    環境変数の値(文字型)を得る. \\
                  {\tt RTCOPT(CPFIX,CP,CVAL)} &
                    コマンドラインオプションの値(文字型)を得る. \\
                  {\tt RTCXFL(CPFIX,CP,CVAL)} &
                    外部ファイルからオプションの値(文字型)を得る. \\
                \end{tabular}
                \end{quote}
	  \item 実行時オプションの指定方法として,
		環境変数, コマンドライン引数, 外部ファイルが使用できる
		場合, その効力は, コマンドライン引数, 
                環境変数, 外部ファイルの順である. 
		(すべて指定されたら, コマンドライン引数による指定を採用する.)
	  \item 実行時オプションが定義できない機種では,
		実行時オプションが何も指定されなかったものとみなされる.
        \end{enumerate}
    \end{enumerate}

\subsection{CFSRCH}
\label{syslib.sub.cfsrch}
\begin{enumerate}
  \item 機能
  \begin{quote}
    パス名の先頭部分と末尾部分のリストの組合せから,
    存在するファイル名を探す.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CFSRCH(CPL,NP,CFL,NF,CFN)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt CPL} & {\tt (C(NP)*80)} & パス名の先頭部分のリスト.
                                     長さ80の文字型配列. \\
      {\tt NP}  & {\tt (I)}        & 配列{\tt CPL}の長さ. \\
      {\tt CFL} & {\tt (C(NF)*80)} & パス名の末尾部分のリスト.
                                     長さ80の文字型配列. \\
      {\tt NF}  & {\tt (I)}        & 配列{\tt CFL}の長さ. \\
      {\tt CFN} & {\tt (C*(*))}    & 最初に見つかったファイル名を返す
                                     文字型変数.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item たとえばファイル名 {\tt /usr/local/bin/dclfrt} について,
      先頭部分とは {\tt /usr/local/bin/} をさす;
      末尾部分とは {\tt dclfrt} をさす.
    \item このサブルーチンは, {\tt CPL(1)} から {\tt CPL(NP)} の
      先頭部分について, {\tt CFL(1)} から {\tt CFL(NF)} の末尾部分
      との組合せからなるパス名をもつ
      ファイルが存在するかどうかを調べて, 最初に見つかったファイル名を
      返す. 
      そのようなファイル名が存在しなければ空白からなる
      文字列を返す.
    \item パス名の先頭部分として空白からなる文字列を与えると,
      カレントディレクトリについて, パス名の末尾部分からなる
      ファイルを検索する.
    \item このルーチンはシステムに依存する. つまり, {\tt CFSRCH} は
      UNIX のようなツリー構造を持ったファイルシステムを念頭において
      作成されており, メインフレーム系のようなファイルシステムに
      おいてはファイル名検索のルールを別途定義してやる必要がある.
      しかし, 現在用意されているルーチンでも, 内部的には単に2種類の
      文字型リストを組合せてファイルが存在するかどうかを調べている
      だけなので, 「先頭部分」, 「末尾部分」という定義にこだわらずに,
      ファイル名を構成する要素としてこれらを与えてやればそのまま
      利用することができる. ただし, 「パス名の先頭部分として
      空白を指定するとカレントディレクトリを検索する」という
      仕様の制約から, 
      空白を指定しないようにするか, 空白が指定されたときの動作を別途定
      義する(たとえば, 何もしない)必要がある.
  \end{enumerate}
\end{enumerate}

%-------------------------------------------------------------------
\section{関数の説明}

  \subsection{LCHREQ}
    \label{syslib.sub.lchreq}
    \begin{enumerate}
      \item 機能
        \begin{quote}
          大文字・小文字の区別なく2つの文字列を比較する.
        \end{quote}
      \item 呼び出し方法
        \begin{quote}
          {\tt LCHREQ(CH1,CH2)}
        \end{quote}
      \item パラメーターの説明
        \begin{quote}
          \begin{tabular}{llp{10cm}}
            {\tt LCHREQ} & {\tt (L)} & 2つの文字列が
              (大文字・小文字の区別なく)等しいとき
              {\tt .TRUE.}を返す論理関数値. \\
            {\tt CH1}, {\tt CH2} & {\tt (C*(*))} & 比較する文字列.
          \end{tabular}
        \end{quote}
      \item 備考
        \begin{enumerate}
          \item {\tt CH1}と{\tt CH2}の長さが異なるときは,
            長い方の文字列と同じ長さになるまで, 短い方の文字列の
            後ろにブランクがあるものとして比較する.
%         \item 小文字を認識しないようなシステムでは,
%           単に文字列の比較をおこなう関数として移植されている.
        \end{enumerate}
    \end{enumerate}

\subsection{IUFOPN}
\label{syslib.sub.iufopn}
\begin{enumerate}
  \item 機能
  \begin{quote}
    存在し, 接続されていない(すなわち利用可能な)もっとも小さい
    入出力装置番号を返す.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt IUFOPN()}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IUFOPN} & {\tt (I)} & 装置番号を返す整数値.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item この関数は, 1 から順に 99 までの装置番号に対応する
      入出力装置の状態を問い合わせ, 存在し, 接続されていない
      (オープンされていない)最初の装置番号を返す.
      すべて利用不可能なときは 0 を返す.
  \end{enumerate}
\end{enumerate}
