‘SPECIAL-NAMES’ タグのついている投稿
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桁箇所以上もありましたが、かなり簡単に移植ができました。