PL/I

図 1(PL/I の場合) は、BIND イメージを伝送する z/OS® Communications Server CINIT RU から情報を抽出します。 この情報には、デフォルトの画面サイズや代替画面サイズなどの画面表示サービスの情報が含まれています。 代替画面サイズを使用して、ログオンを要求している端末のモデルを判別しています。 提示されたモデルの中で一致を検索し、一致するものがなかった場合は、それらのモデルのうち最初のモデルを使用します。

図1: DFHZPTDX サンプル・プログラムをカスタマイズする方法の例 (パート 1)
         DCL 1 CINIT                    BASED(INSTALL_CINIT_PTR),
               2 CINIT_LENG              FIXED BIN(15),
               2 CINIT_RU                CHAR(256);
         DCL   SAVE_CINIT               CHAR(256);
                                       /* Temp save area for CINIT RU */
         DCL 1 SCRNSZ                   BASED(ADDR(SAVE_CINIT)),
               2 SPARE                   CHAR(31),
                              /* Bypass first part of CINIT and reach */
                                  /* into BIND image carried in CINIT */
               2 DHGT                    BIT(8),
                             /* Screen default height in BIND PS area */
               2 DWID                    BIT(8),
                              /* Screen default width in BIND PS area */
               2 AHGT                    BIT(8),
                           /* Screen alternate height in BIND PS area */
               2 AWID                    BIT(8);
                            /* Screen alternate width in BIND PS area */
         DCL   NAME                     CHAR(2);
                               /* Used to work up a screen model type */
         DCL   TERMID                   PIC'9999' INIT(1) STATIC;
                                   /* Used to work up a unique termid */
         DCL   ENQ                      CHAR(8) INIT('AUTOPRG');
                         /* Used to prevent multiple access to termid */
        /* If model name supplied by MTS, bypass model name selection */
         IF SELECTED_MODELNAME ¬= '        '
           THEN GO TO MODEL_EXIT;
                         /* Clear the CINIT save area and move in the */
                               /* z/OS Communications Server CINIT RU.*/
                 /* This is useful if you fail to recognize the model */
                 /* of terminal; provide a dump and analyze this data */
         SAVE_CINIT = LOW(256);
         SUBSTR(SAVE_CINIT,1,CINIT_LEN) = SUBSTR(CINIT_RU,1,CINIT_LEN);
図2: DFHZPTDX サンプル・プログラムをカスタマイズする方法の例 (パート 2)
         /* Now access the screen PS area in the portion of the BIND
            image presented in the CINIT RU */
         /* using the screen alternate height as a guide to the model
            of terminal attempting logon. If this cannot be determined
            then default to the first model in the table */
         SELECT (AHGT);               /* NOW GET SCRN ALTERNATE HEIGHT */
           WHEN (12)  NAME = 'M1';        /* MODEL 1 */
           WHEN (32)  NAME = 'M3';        /*       3 */
           WHEN (43)  NAME = 'M4';        /*       4 */
           WHEN (27)  NAME = 'M5';        /*       5 */
           OTHERWISE  NAME = 'M2';        /*       2 */
          END;
          /* Search the model entries for a matching entry.      */
          /* The criterion here is that a model definition should*/
          /* contain the chars M2 for a model 2, and so on.      */
          /* For example, L3270M2, L3270M5                       */
          /*     TERMM2,  TERMM5                                 */
          IF MODELNAME_COUNT = 0
          THEN GO TO EXIT;
          DO I = 1 TO MODELNAME_COUNT;
           IF INDEX(MODELNAME(I),NAME)
           THEN GO TO FOUND_MODEL;
          END;
 NO_MODEL: /* Matching entry was not found, default to first model*/
          SELECTED_MODELNAME = MODELNAME(1);
          GO TO MODEL_EXIT;
 FOUND_MODEL: /* Move the selected model name to the return area */
           SELECTED_MODELNAME = MODELNAME(I);
 MODEL_EXIT: /* ENQ to stop multiple updates of counter.     */
             /* A simple counter is used to generate unique  */
             /* terminal identities, so concurrent access to */
             /* this counter is denied to ensure no two get  */
             /* the same identifier or update the counter.   */
 
   /* To use this method the program must be defined as resident.*/
           EXEC CICS ENQ RESOURCE(ENQ);
           SELECTED_TERMID = TERMID; /* Set SELECTED_TERMID to
                                        count value  */
           TERMID = TERMID + 1; /* Increase the count value by 1  */
           IF TERMID = 9999 THEN TERMID = 1;     /* Reset if too large*/
           EXEC CICS DEQ RESOURCE(ENQ);
 NAME_EXIT:
           INSTALL_RETURN_CODE = LOW(1);
                                /* Set stat field to X'00' to allow
                                   logon to be processed */
           GO TO EXIT;
 END INSTALL;