                           E X E C P G M


      Questa routine puo' essere chiamata da un programma Cobol o Assembler
e serve per richiamare dinamicamente (ossia run-time) un altro programma,
passandogli eventualmente dei parametri. Il programma da richiamare puo'
essere un programma che normalmente e' fatto girare autonomamente: i
parametri che gli vengono passati simulano il PARM= sulla scheda EXEC;
nello step del programma chiamante verranno aggiunte le DD (o le DLBL)
usate dal programma chiamato, che quindi non possono essere usate contem-
poraneamente dal programma chiamante. In conseguenza di cio', poiche'
ogni programma cobol richiede di aprire i files  SYSPRINT (per la
istruzione DISPLAY) e SYSIN (per l'ACCEPT) ne consegue che in MVS un
programma cobol non puo' chiamarne un'altro con questa routine: potra'
chiamarne uno assembler (che non usi questi files) o potra' essere chiamato
da un programma assembler.

      Il suo uso e' il seguente:

      CALL 'EXECPGM' USING NOMEPROG PARMLEN PARM.

      con i parametri cosi' definiti:

           NOMEPROG   PIC     X(8).
           PARMLEN    PIC    S9(7) COMP.
           PARM       PIC   X(nnn).


      e in Assembler:

      CALL EXECPGM,(NOMEPROG,PARMLEN,PARM),VL

           NOMEPROG   DS  CL8
           PARMLEN    DS  F
           PARM       DS  CLnnn


      con il seguente significato:

      NOMEPROG        nome del prorgramma da eseguire
      PARMLEN         lunghezza nnn del successivo PARM, che puo' essere
                      da 0 (PARM assente) a 100 bytes
      PARM            stringa che contiene gli eventuali parametri, visti
                      dal programma chiamato come PARM della scheda EXEC

      Al ritorno al programma chiamante, la variabile PARMLEN contiene
il return code del programma chiamato.
      Lo scopo di questa routine e' quella di richiamare come subroutine
un programma che e' gia' stato scritto come programma a se stante, senza
dover adattarlo per essere richiamato con la 'CALL' del cobol.
      In esecuzione, EXECPGM carica il programma richiesto in memoria
leggendolo dalle librerie, gli cede il controllo e al termine lo cancella
rilasciando la memoria occupata: per questo motivo l'uso di EXECPGM al
posto della normale CALL statica, provoca un degrado delle performances.

      Non si puo' usare questa routine in un programma CICS.


      Esempio:

      ****************************************************************
      * Mettere nella prima scheda di SYSIN il nome del programma da
      *               richiamare (a partire da colonna 1)
      * mettere nella seconda scheda di SYSIN i parametri da passare;
      *               lasciare la linea vuota per non avere parametri.
      ****************************************************************
       WORKING-STORAGE SECTION.
       77  NOMEPROG   PIC     X(8).
       77  PARM       PIC    X(80).
       77  PARMLEN    PIC    S9(7)   COMP VALUE +80.
      ****************************************************************
       PROCEDURE DIVISION.
       INIZIO.
           ACCEPT NOMEPROG.
           ACCEPT PARM.
           IF NOMEPROG = SPACES   THEN
              DISPLAY 'NOME PROGRAMMA DA RICHIAMARE MANCANTE.'
              STOP RUN.
           IF PARM = SPACES   THEN
              MOVE  +0        TO PARMLEN
           ELSE
              MOVE +80        TO PARMLEN.
           DISPLAY 'NOMEPROG = ' NOMEPROG.
           DISPLAY 'PARMLEN  = ' PARMLEN.
           DISPLAY 'PARM     = ' PARM.
           CALL 'EXECPGM' USING NOMEPROG PARMLEN PARM.
           DISPLAY 'RC = ' PARMLEN.
           STOP RUN.
      ********************************************************** END *

