バラメータなどに
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*で定義されている変数が多いのである。