
# OSLIB を移植するときの注意

OSLIB 中のにはオペレーティングシステムに依存する以下のようなルーチンが
含まれているので, 処理系に応じて正しく移植してやる必要がある. 

  OSEXEC(CMD)          : CMD で与えられたシステムコマンドを実行する. 
  OSGENV(CENAME,CEVAL) : CENAME という名前の環境変数の値を得る. 
  OSQARN(N)            : コマンドライン引数の個数を得る. 
  OSGARG(N,CHAR)       : N 番目のコマンドライン引数の値を得る. 
  OSABRT               : 強制終了処理をおこなう. 

これらのルーチンは, 一般にオプショナルな機能を実現するためのものであり, 
ダミールーチン(返すべき値を持つものもあるので注意すること)として移植し
てもよいようなルーチンも多い. くわしくは「MATH1」マニュアルを参照され
たい.

コマンドライン引数によるオプションの指定を可能にするためには, OSQARN, 
OSGARG が正しく移植されていなければならない. マニュアルを生成する際に
は, この「コマンドライン引数によるオプションの指定機能」が用いられてい
るので, これらのルーチンが正しく移植されていないとマニュアルも作成でき
ない. (注: マニュアルに関する上記の記述は, マニュアルが TeX ソースとと
もに本パーケージに含まれていた頃の事情を説明している. )

OSEXEC, OSGENV, OSABRT については, このディレクトリに納められた C 言語
で記述したプログラム osexec.c, osgenv.c, osabrt.c が標準的に用いられる.

OSQARN については, make の際, トップディレクトリにある Mkinclude の中
の OSQARN を f2003 , iargc あるいは dummy のどれかを指定することによって選択さ
れる. iargc はコマンドラインの引数の数を得る同名のサービスルーチンがあ
る時に指定する. ない場合は dummy とする. f2003 は Fortran2003のルーチンが
使用できる時に使われる。


OSGARG については, make の際, トップディレクトリにある Mkinclude の中
の OSGARG を f2003, getarg あるいは dummy のどれかを指定することによって選択
される. getarg コマンドラインの引数の値を得る同名のサービスルーチンが
ある時に指定する. ない場合は dummy とする. f2003 は Fortran2003のルーチンが
使用できる時に使われる。


HITACHIのフォートランは iargc,getarg の挙動が異なるので注意が必要。
FORTRANにおいてはコマンドライン引数にプログラム名は含まれないがHITACHIの
FORTRANはC言語と同じように一つ目にプログラム名が入っている。
この場合、個数は1を引いてコマンドライン引数の番号は1を足して扱うようにすれば
他のプログラムと同じように動作する。
また、オプションでたのFORTRANと同じようにすることもできるが、
この場合、実行時にもオプションを指定しなければいけないので注意が必要。
いずれにしても、コンパイラのドキュメントをよく読んで移植すること。

OSQARN, OSGARG は, ふつう configure によって自動的に設定される. 

以下に, OSLIB のルーチンを Sun FORTRAN 1.4 で記述した例, ダミールーチ
ンの例を示す. 

# Sun FORTRAN 1.4 で記述した例

*-----------------------------------------------------------------------
*     EXECUTE OS COMMAND
*-----------------------------------------------------------------------
      SUBROUTINE OSEXEC(CMD)

      CHARACTER CMD*(*)


      CALL SYSTEM(CMD)

      END
*-----------------------------------------------------------------------
*     GET VALUE OF ENVIRONMENT VARIABLES
*-----------------------------------------------------------------------
      SUBROUTINE OSGENV(CENAME, CEVAL)

      CHARACTER CENAME*(*), CEVAL*(*)


      CALL GETENV(CENAME, CEVAL)

      END
*-----------------------------------------------------------------------
*     NUMBER OF COMMAND LINE ARGUMENTS
*-----------------------------------------------------------------------
      SUBROUTINE OSQARN(N)

      N = IARGC()

      END
*-----------------------------------------------------------------------
*     GET THE N-TH COMMAND LINE ARGUMENT
*-----------------------------------------------------------------------
      SUBROUTINE OSGARG(N, CHAR)

      CHARACTER CHAR*(*)


      CALL GETARG(N, CHAR)

      END
*-----------------------------------------------------------------------
*     OSABRT
*-----------------------------------------------------------------------
      SUBROUTINE OSABRT

      INTEGER GETPID, KILL

*     / SEND SIGTRAP SIGNAL TO CURRENT PROCESS /

      IPID=GETPID()
      IRET=KILL(IPID,5)

      END

# ダミールーチンの例

*-----------------------------------------------------------------------
*     EXECUTE OS COMMAND
*-----------------------------------------------------------------------
      SUBROUTINE OSEXEC(CMD)

      CHARACTER CMD*(*)

      END
*-----------------------------------------------------------------------
*     GET VALUE OF ENVIRONMENT VARIABLES
*-----------------------------------------------------------------------
      SUBROUTINE OSGENV(CENAME, CEVAL)

      CHARACTER CENAME*(*), CEVAL*(*)


      CEVAL=' '

      END
*-----------------------------------------------------------------------
*     NUMBER OF COMMAND LINE ARGUMENTS
*-----------------------------------------------------------------------
      SUBROUTINE OSQARN(N)

      N = 0

      END
*-----------------------------------------------------------------------
*     GET THE N-TH COMMAND LINE ARGUMENT
*-----------------------------------------------------------------------
      SUBROUTINE OSGARG(N, CHAR)

      CHARACTER CHAR*(*)


      CHAR=' '

      END
*-----------------------------------------------------------------------
*     OSABRT
*-----------------------------------------------------------------------
      SUBROUTINE OSABRT

      STOP
      END
