Open PL/I プログラムでのコマンド ライン引数へのアクセス

プログラムの動作にバリエーションを持たせるために、コマンド ラインで 1 つ以上の引数を指定するプログラムを実行できるようにすると役立つ場合があります。たとえば、部門経費レポート プログラムを実行する場合に、deptexp summary コマンドを発行して、すべての行項目ではなくカテゴリの合計のみを確認するように指示できます。

コマンド ラインの引数には、次の方法を使用して PL/I メイン プログラム内でアクセスできます。

/* PL/I main program accessing command line args. */ 

PMAIN: PROCEDURE OPTIONS(MAIN); 

   dcl getargc entry() returns(fixed bin(31)) external('__lpi_get_argc' ); 
   dcl getargv entry() returns(pointer) external('__lpi_get_argv' );    
   DECLARE ARGC_     FIXED BIN(31) NATIVE init(getargc()); 
   DECLARE ARGV_     POINTER              init(getargv());
   DECLARE ARG(10)   POINTER BASED; 
   DECLARE ARGS      CHAR(50) BASED; 
   DECLARE ARGSV     CHAR(50) VARYING; 
   DECLARE I         FIXED BIN(31); 

   PUT SKIP EDIT(ARGC_)(f(2)); 
   DO I = 1 TO ARGC_; 
      ARGSV = SUBSTR(ARGV_->ARG(I)->ARGS,1,
            INDEX(ARGV_->ARG(I)->ARGS,BYTE(0))-1); 
      PUT SKIP EDIT('"',argsv,'"')(a,a,a); 
      END; 
   PUT SKIP; 

   END PMAIN;

PL/I プログラムを C メイン プログラムで制御している場合は、次の方法により、PL/I プログラム経由でコマンド ライン引数を渡すことができます。

/* C main program calling PL/I subroutine */ 

main(argc,argv) 
   int argc; 
   char **argv;
{ 
   PSUBR(argc,argv); 
}

/* PL/I subroutine receiving command line args 
   from C main program */ 

PSUBR: PROCEDURE(ARGC,ARGV); 

   DECLARE ARGC      FIXED BIN(31) VALUE;
   DECLARE ARGV      POINTER VALUE; 
   DECLARE ARG(10)   POINTER BASED; 
   DECLARE ARGS      CHAR(50) BASED; 
   DECLARE ARGSV     CHAR(50) VARYING; 
   DECLARE I         FIXED BIN(31); 

   PUT SKIP EDIT(ARGC)(f(2)); 
   DO I = 1 TO ARGC; 
      ARGSV = SUBSTR(ARGV->ARG(I)->ARGS,1, 
            INDEX(ARGV->ARG(I)->ARGS,BYTE(0)));
      PUT SKIP EDIT('"',ARGSV,'"')(a,a,a); 
      END; 
   PUT SKIP; 

END PSUBR;