RPG

423. パラメータに追加された %STRING とは

バラメータなどに

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*で定義されている変数が多いのである。