OpenCOBOLが吐きだしたCのソースを眺めてましたが(;´Д`)弄りにくいすぎる
という事で方針を大転換して、OpenCOBOL内の変数のアドレスと変数名をOpenCOBOLコード中から送るようにして、別途用意したCで書かれたサブルーチンにストックした値と差し替える方向でファイナルアンサーヽ(´ー`)ノ
CALL "GETVALUE" USING VARNAME0 "VARNAME0"
CALL "GETVALUE" USING VARNAME1 "VARNAME1"
CALL "GETVALUE" USING VARNAME2 "VARNAME2"
CALL "GETVALUE" USING VARNAME3 "VARNAME3"
みたいな感じで、WORKING-STORAGE SECTIONで定義してるすべての変数について値を取りに行ってみる等。上記はOpenCOBOL中では以下のように展開されるようです(部分):
/* TEST0001:41: CALL */
{
{
int (*func)();module.cob_procedure_parameters[0] = &f_27;
module.cob_procedure_parameters[1] = &c_1;
module.cob_procedure_parameters[2] = NULL;
module.cob_procedure_parameters[3] = NULL;
module.cob_procedure_parameters[4] = NULL;
module.cob_procedure_parameters[5] = NULL;
module.cob_procedure_parameters[6] = NULL;
cob_call_params = 2;
func = cob_resolve_1 ((const char *)"GETVALUE");
(*(int *) (b_1)) = func (b_5 + 540, (unsigned char *)"VARNAME0");
}
}
/* TEST0001:43: STOP */
Cで書いたプログラム側には変数はポインタ渡しされますし、文字列リテラルももちろんポインタ渡し(そしてNULL終端)されます(参考:OpenCOBOL マニュアル -> C インターフェース : C プログラムへの静的リンク)
たった1個のCALLでも清々しいほど重そうな処理ですね(;´Д`)。こんなのが変数分だけ(つまり数百個も!)並びそうですがコンパイラの最適化に任せましょう(;´Д`)不要な変数の引き渡しについては最適化も可能なわけですから、それは将来の課題として。
で、C言語ではかせて弄り倒すよりも(外見は)シンプルになりますから、説明はしやすいんじゃないかと思います。魔術的なコードやトリック、カラクリで稼働させるよりは良いんじゃないかとかなんとか。