バラメータなどに
OPTIONS(%TRING) とか
OPTIONS(%TRING %TRIM)
とあるのを見かけたことはないだろうか?
このサイトのサンプル・ソースでも

[ TESTSYS : SYSTEM 関数によるコマンドの実行 ]
ソースはこちらから
0001.00 H DATEDIT(*YMD/) BNDDIR('QC2LE') DFTACTGRP(*NO)
0002.00 F******** SYSTEM 関数によるコマンドの実行 *****************************
0003.00 F*
0004.00 F**********************************************************************
0005.00 D CMD PR 10I 0 EXTPROC('system')
0006.00 D CMDSTR * VALUE
0007.00 D OPTIONS(*STRING)
0008.00 D RC S 10I 0
0009.00 D MSGID S 7 IMPORT('_EXCP_MSGID')
0010.00 D TRUE C 0
0011.00 /FREE
0012.00 RC = CMD('DSPLIBL *PRINT');
0013.00 /END-FREE
0014.00 C RC IFNE TRUE
0015.00 C MSGID DSPLY ANS 1
0016.00 C END
0017.00 C MOVE *ON *INLR
[解説]
この OPTIONS(*STRING) といのはNULL-STOPを自動的に追加するという意味である。
NUL-STOPとは C言語でよく使われる変数のタイプで
char*
という文字の定義がある。
これはあるポインタ(=フィールドの開始位置の意味)から文字列が始まって
最後は NULL(=X’00’)で終わる文字列のことである。
C言語では文字列は
・1文字だけの文字 …………… char
・始めから長さを定義する……… char[10]
・NULL-STOPで終了する文字列…… char*
という定義の方法があり char* であれば長さを問わないので
非常に変数の定義として数多く用いられている。
従って上の例であれば
/FREE
STRING = 'DSPLIBL *PRINT' + X'00';
RC = CMD(STRING)
/END-FREE
としなければならないが *STRING は自動的に NULL-STOP(X’00’)を
付加してくれるので
/FREE
RC = CMD('DSPLIBL *PRINT');
/END-FREE
として文字列だけ渡してやればよい。
後続のスペースも除去したい場合は
OPTIONS(*STRING *TRIM)
として*TRIMを定義してやればよい。
APIの変数は char* として定義されている場合が多いので
*STRING が効果を発揮するのである。
APIのマニュアルを注意深く呼んでみれば char* の変数が
多いことに気がつくだろう。
APIというかi5/OSがC言語で開発されているので
当然APIにもchar*で定義されている変数が多いのである。
