示例: 使用注册设施 API

这些 ILE C 程序显示如何注册出口点,如何将出口程序添加到出口点,以及如何根据检索到的出口点信息调用出口程序。

此示例不包含正在调用的任何程序,也不显示除调用程序的摘录以外的任何内容。
注: 通过使用代码示例,您同意 代码许可证和免责声明信息的条款。

首先要做的是,在决定要放置出口点的程序对象之后,要注册该出口点。 还需要记住的是,出口点格式定义了出口程序数据的外观。 此 ILE C 程序注册名为 QIBM_QXIC_TSTXPOINTA 的出口点。


/********************************************************************/
/*  PROGRAM:      RegisterPoint                                     */
/*                                                                  */
/*  LANGUAGE:     ILE C                                             */
/*                                                                  */
/*  DESCRIPTION:  This program registers an exit point in an        */
/*                application.                                      */
/*                                                                  */
/* APIs USED:     QusRegisterExitPoint                              */
/*                                                                  */
/********************************************************************/
#include <string.h>
#include <qusec.h>
#include <qusrgfa1.h>

/********************************************************************/
/*  Structure for the control block                                 */
/********************************************************************/
typedef _Packed struct Control_x{
        int                  Num_Vlen_Recs;
        Qus_Vlen_Rec_4_t     Vlen_Rec_1;
        char                 Description[50];
} Control_Rec;


int main () {

   Qus_EC_t     Error_Code     = {0};

   char         EPnt_Name[20]  = "QIBM_QXIC_TSTXPOINTA";
   char         EPnt_F_Name[8] = "USUSOOOO";
   int          EProg_Number   = -1;
   Control_Rec  EPnt_Controls  = {0};

/*****************************************
*** INITIALIZING ALL STRUCTURES::      ***
*****************************************/

   Error_Code.Bytes_Provided = sizeof(Error_Code);

   EPnt_Controls.Num_Vlen_Recs = 1;
   EPnt_Controls.Vlen_Rec_1.Length_Vlen_Record = 62;
   EPnt_Controls.Vlen_Rec_1.Control_Key = 8;
   EPnt_Controls.Vlen_Rec_1.Length_Data = 50;
   memcpy( EPnt_Controls.Description , "Example Exit Point" , 17 );

   QusRegisterExitPoint (EPnt_Name,
                         EPnt_F_Name,
                         &EPnt_Controls,
                         &Error_Code);
   if ( Error_Code.Bytes_Available ) {
      printf("\nEXCEPTION : %s",Error_Code.Exception_Id);
      exit (1);
   }

   return(0);
}

在注册出口点之后,必须将出口程序添加到该点,以指示基于运行时条件的可能调用。 以下 ILE C 程序将名为 TSTXITPROGQGPL 的出口程序添加到先前示例中注册的 QIBM_QXIC_TSTXPOINTA 出口点。


/********************************************************************/
/*  PROGRAM:      AddProgram                                        */
/*                                                                  */
/*  LANGUAGE:     ILE C                                             */
/*                                                                  */
/*  DESCRIPTION:  This program adds an exit program to a registered */
/*                exit point.                                       */
/*                                                                  */
/* APIs USED:     QusAddExitProgram                                 */
/*                                                                  */
/********************************************************************/

#include <qusec.h>
#include <qusrgfa1.h>

/********************************************************************/
/*  Structure for the Exit Program Attributes                       */
/********************************************************************/

typedef _Packed struct Xit_Att{
        int                  Num_Vlen_Recs;
        Qus_Vlen_Rec_4_t     ADPG_Vlen;
        int                  CCSID;
        char                 Reserved;
} Xit_Attributes;

int main () {

   Qus_EC_t       Error_Code       = {0};

   char           EPnt_Name[20]    = "QIBM_QXIC_TSTXPOINTA";
   char           EPnt_F_Name[8]   = "USUSOOOO";
   int            EProg_Number     = -1;
   char           Q_EProg_Name[20] = "TSTXITPROGQGPL      ";
   char           EProg_Data[10]   = "EXAMPLE   ";
   int            Len_EProg_Data   = sizeof(EProg_Data);
   Xit_Attributes EProg_Attributes;


   Error_Code.Bytes_Provided=sizeof(Error_Code);

   EProg_Attributes.Num_Vlen_Recs=1;
   EProg_Attributes.ADPG_Vlen.Length_Vlen_Record=16;
   EProg_Attributes.ADPG_Vlen.Control_Key=3;
   EProg_Attributes.ADPG_Vlen.Length_Data=4;
   EProg_Attributes.CCSID = 37;

   QusAddExitProgram (EPnt_Name,
                      EPnt_F_Name,
                      EProg_Number,
                      Q_EProg_Name,
                      EProg_Data,
                      Len_EProg_Data,
                      &EProg_Attributes,
                      &Error_Code);
   if ( Error_Code.Bytes_Available ) {
      printf("\nEXCEPTION : %s",Error_Code.Exception_Id);
      exit (1);
   }
   return(0);
}

当您已注册出口点并将出口程序添加到该出口点时,可以从应用程序中执行出口程序调用。 从 "检索出口信息" API 获取执行调用所需的信息。 在以下样本中,将根据出口点信息进行条件调用。


/********************************************************************/
/*  PROGRAM:      RetrieveAndProcess                                */
/*                                                                  */
/*  LANGUAGE:     ILE C                                             */
/*                                                                  */
/*  DESCRIPTION:  This is an excerpt of a program that retrieves    */
/*                information on an exit point, and does processing */
/*                based on that information.                        */
/*                                                                  */
/* APIs USED:     QusRetrieveExitInformation                        */
/*                                                                  */
/********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <qusec.h>
#include <qusrgfa2.h>

/********************************************************************/
/*  Structure for Selection Criteria on the Retrieve                */
/********************************************************************/
typedef _Packed struct RTVEI_Select_C_x {
        Qus_Selcrtr_t        Crit;
        Qus_Select_Entry_t   Select_Entry;
        char                 RTV_String[10];
} RTVEI_Select_C;

/********************************************************************/
/*  Conv_Lib converts the library name to a null terminated string  */
/********************************************************************/

char * Conv_Lib(char in_lib[], char *tmp) {
      int x = 0;

      while ( (in_lib[x] != ' ') && x!=10 ) {
         *tmp=in_lib[x++];
         tmp++;
      }
      return(tmp);
}

int main() {

   Qus_EXTI0200_t       *EXTI0200;
   Qus_EXTI0200_Entry_t *EXTI0200_Entry;
   char                 *Pgm_Data;

   Qus_EC_t        Error_Code= {0};

   char            EPnt_Name[20]  = "QIBM_QXIC_TSTXPOINTA";
   char            EPnt_F_Name[8] = "USUSOOOO";
   int             EProg_Number   = -1;

   int             Counter;
   char            *tmp_str;
   char            *lib;

   char            Handle[16]     = "                ";
   int             Length_Of_R_Var;
   char            RTVEI_Format_Name[8];
   RTVEI_Select_C  EProg_Select_C = {0};


/*****************************************
*  Initializing Structures               *
*****************************************/

   Error_Code.Bytes_Provided = sizeof(Error_Code);

   tmp_str=(char *)malloc(sizeof(char));
   lib=(char *)malloc(sizeof(char));
   EXTI0200=(Qus_EXTI0200_t *) malloc ( ( sizeof( Qus_EXTI0200_t ) +
        sizeof( Qus_EXTI0200_Entry_t ) + MAX_PGM_DATA_SIZE ) * 2 );
   EProg_Select_C.Crit.Number_Sel_Criteria = 1;
   EProg_Select_C.Select_Entry.Size_Entry = 26;
   EProg_Select_C.Select_Entry.Comp_Operator = 1;
   EProg_Select_C.Select_Entry.Start_Pgm_Data = 0;
   EProg_Select_C.Select_Entry.Length_Comp_Data = 10;
   memcpy( EProg_Select_C.RTV_String , "EXAMPLE   " , 10 );

   Length_Of_R_Var = (sizeof( Qus_EXTI0200_t ) +
                sizeof( Qus_EXTI0200_Entry_t ) +
                MAX_PGM_DATA_SIZE) *2;
   memcpy( RTVEI_Format_Name , "EXTI0200" , 8 );

   QusRetrieveExitInformation (Handle,
                               EXTI0200,
                               Length_Of_R_Var,
                               RTVEI_Format_Name,
                               EPnt_Name,
                               EPnt_F_Name,
                               EProg_Number,
                               &EProg_Select_C,
                               &Error_Code);
   if ( Error_Code.Bytes_Available ) {
      printf("\nEXCEPTION : %s",Error_Code.Exception_Id);
      exit (1);
   }

/********************************************************
*  Call all of the preprocessing exit programs returned *
********************************************************/
   Counter=EXTI0200->Number_Programs_Returned;

   while ( Counter-- ) {

     EXTI0200_Entry = (Qus_EXTI0200_Entry_t *) EXTI0200;
     EXTI0200_Entry = (Qus_EXTI0200_Entry_t *)((char *)EXTI0200 +
                       EXTI0200->Offset_Program_Entry);
     Pgm_Data = (char *) EXTI0200_Entry;
     Pgm_Data += EXTI0200_Entry->Offset_Exit_Data;

     Conv_Lib(EXTI0200_Entry->Program_Library,lib);

     sprintf( tmp_str , "CALL  %s/%.10s %.*s" ,
          lib,
          EXTI0200_Entry->Program_Name,
          EXTI0200_Entry->Length_Exit_Data,
          Pgm_Data );
     system( tmp_str );
/********************************************************
*  This is where Error Handling on the exit program     *
*  would be done.                                       *
********************************************************/
     if ( Counter ) {
         memcpy(EXTI0200->Continue_Handle,Handle,16);
         QusRetrieveExitInformation(Handle,
                                    EXTI0200,
                                    Length_Of_R_Var,
                                    RTVEI_Format_Name,
                                    EPnt_Name,
                                    EPnt_F_Name,
                                    EProg_Number,
                                    &EProg_Select_C,
                                    &Error_Code);
         if ( Error_Code.Bytes_Available ) {
            printf("\nEXCEPTION : %s",Error_Code.Exception_Id);
            exit (1);
         }
      }
   }

   return(0);
}