user icon

OpenCOBOLとSPECIAL-NAMES(拡張)

JCLからCOBOLを呼び出す際に外部パラメータを渡したいということがあります。某社JCLでは

\DCV  ACCEPT2,CHARACTER='04' ;

などDCVというコマンドで定義して、これをCOBOL側では

       SPECIAL-NAMES.
           CHAR002  IS  ACCEPT2.

のように記述して取り込んでいるようです(この場合CHAR002に’04’が入ります)。
ところがもちろんOpenCOBOLにはこのような機能はありません。実際 SPECIAL-NAMES. 部分の定義をcobc/parser.yから拾い上げると:

special_name:
  mnemonic_name_clause
| alphabet_name_clause
| symbolic_characters_clause
| locale_clause
| class_name_clause
| currency_sign_clause
| decimal_point_clause
| cursor_clause
| crt_status_clause
| screen_control
| event_status
;

となっており、mnemonic_name_clause 部分が使えそうなのですが、system_nameとして使用できるのは

} system_table[] = {
  {"SYSIN",     CB_DEVICE_NAME,  CB_DEVICE_SYSIN, NULL},
  {"SYSIPT",        CB_DEVICE_NAME,  CB_DEVICE_SYSIN, NULL},
  {"SYSOUT",        CB_DEVICE_NAME,  CB_DEVICE_SYSOUT, NULL},
  {"SYSLIST",       CB_DEVICE_NAME,  CB_DEVICE_SYSOUT, NULL},
  {"SYSLST",        CB_DEVICE_NAME,  CB_DEVICE_SYSOUT, NULL},
  {"PRINTER",       CB_DEVICE_NAME,  CB_DEVICE_SYSOUT, NULL},
  {"SYSERR",        CB_DEVICE_NAME,  CB_DEVICE_SYSERR, NULL},
  {"CONSOLE",       CB_DEVICE_NAME,  CB_DEVICE_CONSOLE, NULL},
  {"C01",       CB_FEATURE_NAME, CB_FEATURE_C01, NULL},
  {"C02",       CB_FEATURE_NAME, CB_FEATURE_C02, NULL},
  {"C03",       CB_FEATURE_NAME, CB_FEATURE_C03, NULL},
  {"C04",       CB_FEATURE_NAME, CB_FEATURE_C04, NULL},
  {"C05",       CB_FEATURE_NAME, CB_FEATURE_C05, NULL},
  {"C06",       CB_FEATURE_NAME, CB_FEATURE_C06, NULL},
  {"C07",       CB_FEATURE_NAME, CB_FEATURE_C07, NULL},
  {"C08",       CB_FEATURE_NAME, CB_FEATURE_C08, NULL},
  {"C09",       CB_FEATURE_NAME, CB_FEATURE_C09, NULL},
  {"C10",       CB_FEATURE_NAME, CB_FEATURE_C10, NULL},
  {"C11",       CB_FEATURE_NAME, CB_FEATURE_C11, NULL},
  {"C12",       CB_FEATURE_NAME, CB_FEATURE_C12, NULL},
  {"FORMFEED",      CB_FEATURE_NAME, CB_FEATURE_FORMFEED, NULL},
  {"SWITCH-1",      CB_SWITCH_NAME,  CB_SWITCH_1, NULL},
  {"SWITCH-2",      CB_SWITCH_NAME,  CB_SWITCH_2, NULL},
  {"SWITCH-3",          CB_SWITCH_NAME,  CB_SWITCH_3, NULL},
  {"SWITCH-4",      CB_SWITCH_NAME,  CB_SWITCH_4, NULL},
  {"SWITCH-5",      CB_SWITCH_NAME,  CB_SWITCH_5, NULL},
  {"SWITCH-6",      CB_SWITCH_NAME,  CB_SWITCH_6, NULL},
  {"SWITCH-7",      CB_SWITCH_NAME,  CB_SWITCH_7, NULL},
  {"SWITCH-8",      CB_SWITCH_NAME,  CB_SWITCH_8, NULL},
  {NULL, 0, 0, NULL}
};

上記以外の場合は”Unknown system-name ‘何々'” のメッセージが出力されてエラーとなります。弊社にて対応した際、当初は外部からの値を環境変数経由で渡す事を検討しましたが、COBOL内部で値をセットしてJCLへ返す場合があると言うことで思い切って機能拡張しました。DCVにて渡された値については環境変数(DCV_varname=値)を定義して渡し、値を書き替える場合も環境変数を書き替え、プロセス終了時にDCV_varname環境変数の値を全てファイルへ書き出しています。書き替えた値をJCLへ返す際にこの(環境変数 SYSTEM_STATUS_FILE に定義されたファイル名の)ファイルを読み込んでいます。
これらの拡張とJCLをperlに変換した*.jclスクリプトを使用することで DCV機能は

DCV  "ACCEPT2,CHARACTER='04'";

という記述のperlスクリプトと

       SPECIAL-NAMES.
           CHAR002  IS  ACCEPT2.

元のCOBOLプログラムをそのまま解釈できる拡張したOpenCOBOLにて処理できるようになりました。移植対象のコード中にDCVを使用している箇所が4桁箇所以上もありましたが、かなり簡単に移植ができました。

Facebooktwitterlinkedintumblrmail

タグ: , , , ,

名前
E-mail
URL
コメント

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)