LWKDIR(作業ディレクトリ 処理パラメータ 設定支援 ほか)


PROMPT, PREMSG, DPCINI, DPCENT, STRDTM, LRTRIM関数,
ABEND, ABENDM, OPNPIN, CLSPIN, LWKDIR関数,
PARMIN, GPARMA, GPARMI, GPARMF, GPARMD,
GPARMIF, GPARMID, GPARMI2, GPARMF2, GPARND2,
GETARGS
1.機 能
    このルーチン群の機能を実現するため,主たるソースプログラム lwkdir.c に加え
  て,opnpin.c と getargs.f のソースプログラムを利用する.

    prompt, premsg ルーチンは,メッセージを標準エラー出力に書き出す.
    dpcini, dpcent ルーチンは,長時間を要するループ処理の実行時などにおいて,
  その進捗状況を表示する.
    strdtm ルーチンは,呼び出し実行時の日付・時刻を示す文字列を取得する.
    lrtrim関数は,引数文字列の右側空白を切り縮めたときの文字列長を得る.
    abendルーチンは "ERROR" の文字とコード番号を,abendmルーチンは "[ABEND] " 
  の文字と指定のメッセージ文字列を,標準エラー出力に書き出しエラー終了する.
    opnpin, clspin ルーチンは,lwkdir関数および parmin, gparma, gparmi, gparmf,
  gparmd, gparmif, gparmid, gparmi2, gparmf2, gparmd2 の各ルーチンに対する入力
  を,通常のキーボード入力から既存ファイル読み取りに変更する機能を提供する.
    lwkdir関数は,プログラム実行時のホームディレクトリ(~)およびカレントディ
  レクトリ(.)の絶対パス名を表示し,作業ディレクトリの入力を促してその指定を
  待つ.その指定から得た作業ディレクトリの絶対パス名とそのディレクトリ内のファ
  イルの一覧を画面(標準エラー出力)に表示する.また,そのディレクトリの絶対パ
  ス名を文字列として受け取る. なお,ディレクトリの絶対パス名は後ろに "/" が付
  加された形となっており,単にファイル名を付け加えるだけでそのファイルの絶対パ
  ス名となる.ここでいう作業ディレクトリとは,カレントディレクトリの移動を行う
  ものではなく,単にディレクトリの絶対パス名の文字列を設定して,ファイルの絶対
  パス名での指定を容易にするための手段を提供するに過ぎない.
    parmin および gparma, gparmi, gparmf, gparmd, gparmif, gparmid, gparmi2, 
  gparmf2, gparmd2 の各ルーチンは,標準エラー出力へのプロンプト(入力催促文字
  列)表示に続いて,各形式でのデータ入力を受付ける.
    なお,標準エラー出力が端末(character device)以外に割り付けられている場合に
  は,dpcini/dpcent の進捗状況表示を出力せず,lwkdir関数 および parminほかの
  パラメータ入力では,入力文字列を標準エラー出力に出力する.
    getargs ルーチンは,主プログラムを起動したコマンドのパラメータ文字列の配列
  を取得する.

2.呼出し手順と引数

      call prompt(mesg)
  mesg  [char]  標準エラー出力へ書き出す文字列.
          標準エラー出力へ文字列を書き出す.
      call premsg(mesg)
  mesg  [char]  標準エラー出力へ書き出す文字列.
          標準エラー出力へ文字列を改行つきで書き出す.

      call dpcini(pmsg)
  pmsg  [char]  ループ処理の進捗表示の前に表示する文字列(30文字以下).
          標準エラー出力へこの文字列を書き出し,その後ループ処理の進捗に応じ,
          2%につき1個の # 文字が表示される.
      call dpcent(m, n)
  m, n  [int]  合計n回の繰返しのうち,m回の処理を終了したことを指定する.
          m/n を進捗率とみなし,m=n>0 で繰返し処理の終了と判断する.

      call strdtm(sdtm)
  sdtm  [char*20]  長さ20バイトの文字列を受け取る文字列変数を指定する.
          "YYYY-MM-DD hh:mm:ss " の形式の文字列が与えられる.
          文字列変数の長さが不足の場合は 後ろ側が切り詰められ,長い場合は 後ろ
          に空白が埋められる.

      nc = lrtrim(chrs)
  chrs  [char]  文字列を指定する.
  n     [int]   文字列chrsの右側空白を切り縮めたときの文字列長が与えられる.

      call abend(icd)
  icd   [int]   標準エラー出力へ出力するコード番号.
      call abendm(msg)
  msg   [char]  標準エラー出力へ出力するメッセージ文字列.

      call opnpin()
          メインプログラムの起動パラメータに与えられた名前の既存ファイルから
          パラメータの入力データを読み込む.その名前が空もしくは "-" のとき,
          パラメータ入力は通常どおり標準入力から行われる.
      call clspin()
          opnpin による設定を解除する.

          パラメータ入力ファイル名の指定においては,ファイル名に続けて ":name"
          と記述することにより,パラメータファイル内の ":name" なるタグ行以降
          別のタグ行が出現する前まで をデータとして扱うことができる.
          なお,パラメータファイル内では,先頭桁が '#' の行はコメント行として
          無視され,行内に ";#" の文字列があると,その位置以降行末までがコメン
          トとして無視される.なお,タグ行は,先頭桁を ':' とし,2桁目からスペ
          ースを挟むことなくタグ名を記述する.(パラメータデータとして,先頭桁
          に '#', ':' を置くことはできない.通常のデータは先頭桁をスペースにす
          ることを想定している.)
          call opnpin() と call clspin() の呼び出し先エントリは,ソースプログ
          ラム opnpin.c の中にあり,call opnpin() の実行時には.ソースプログラ
          ム getargs.f の機能が利用される.

      nch = lwkdir(len, dnm)
  len   [int]   文字列変数 dnm の最大文字数を指定する.
  dnm   [char]  作業ディレクトリの絶対パス名の文字列を得る.
                この文字列変数の長さは,len 以上確保されていなければならない.
  nch   [int]   絶対パス名文字列の文字数が与えられる.
            dnm に与えられる文字列は,C言語の文字列形式であり,最後に char(0)
          が付加された形となる.指定された作業ディレクトリのパス名の長さが,
          lenに等しいかそれ以上の場合には,メッセージを表示して異常終了する.
            ホームディレクトリまたはカレントディレクトリの絶対パス名の長さが,
          所定の値(80文字)よりも大きい場合,また作業ディレクトリ指定の文字列
          の長さが,所定の値(80文字)より大きい場合にも,メッセージを表示して
          異常終了する.

      call parmin(str, lbuf, buf)
  str   [char]  プロンプト文字列.
  lbuf  [int]   文字列受取り領域のサイズをバイト単位で指定する.
  buf   [char]  受け取った文字列が入る.
          プロンプト(入力催促文字列) str を標準エラー出力に書き出すとともに,
          opnpin による設定に基づいて改行文字までのパラメータ入力を行い,
          復帰改行文字を除いた (lbuf-1)文字までの文字列を受け取る.文字列の
          末尾は,buf領域の末尾まで空白で埋められる.(従って,buf領域の最終
          バイトは常に空白文字である.)
          (C言語版の parminでは,入力文字の末尾は NULコードで終端される.)

      call gparma(str, lnam, nam)
      call gparmi(str, iv)
      call gparmf(str, fv)
      call gparmd(str, dv)
      call gparmif(str, iv, fv)
      call gparmid(str, iv, dv)
      call gparmi2(str, iv, jv)
      call gparmf2(str, fv, gv)
      call gparmd2(str, dv, ev)
  str    [char]   プロンプト文字列.
  lnam   [int]    受け取る文字列の最大長をバイト単位で指定する.
  nam    [char]   受け取った文字列が入る.
  iv,jv  [int]    受け取った整数値が入る.
  fv,gv  [float]  受け取った単精度実数値が入る.
  dv,ev  [double] 受け取った倍精度実数値が入る.
            プロンプト(入力催促文字列) str を標準エラー出力に書き出すとともに,
          opnpin による設定に基づいてパラメータ入力を行う.
            入力文字列より,スペースを区切りとして,スペースを含まない文字列・
          整数値・単精度実数・倍精度実数もしくはそれらの組み合わせとして,パラ
          メータ値を受け取る.
            なお,標準エラー出力が端末(character device)以外に割当てられている
          場合は,入力文字列が標準エラー出力へも改行付きで書き出される.また,
          プロンプト文字列 str は,その定義長全体が出力対象になるが,途中に
          NULL コードがあると,それ以後の部分は書き出されない.

      call getargs(m, args, n)
  m      [int]    受け取るパラメータ文字列の最大数(配列 args の要素数).
  args   [char]   受け取った文字列が入る文字列エリアの配列.
                  実パラメータの方が長いときは,args のサイズに切り縮められ,
                  短いときは空白が補われる.
  n      [int]    受け取ったパラメータ文字列の個数が与えられる.

3.使 用 例

      character wdr*80, fnam*120
c
      call premsg('--- start ---')
      call opnpin()
      ldr = lwkdir(80,wdr) + 1
      fnam = wdr
      call gparma('Enter filename ==> ', 121-ldr, fnam(ldr:120))
      open(10,file=fnam,status='old')
      write(6,'(a,a)') 'Input file : ', fnam(1:lrtrim(fnam))
          :
          :
      call clspin()
      call dpcini('Loop operation - ')
      do 10 i=1,imax
      do 10 j=1,jmax
          :
          :
        call dpcent((i-1)*jmax+j, imax*jmax)
   10 continue
          :
          :
      if (.....) call abend(90)
          :
          :