*DECK NDLTRNK 
USETEXT NDLDATT 
USETEXT NDLER2T 
USETEXT NDLNCFT 
USETEXT NDLPS2T 
USETEXT NDLTBLT 
      PROC NDLTRNK;          # PROCESS TRUNK STATEMENT                 #
      BEGIN 
*IF,DEF,IMS 
# 
**    NDLTRNK - TRUNK PROCESSOR 
* 
*     S.M. ILMBERGER         81/11/2
* 
*     PROCESS TRUNK STATEMENT 
* 
*     PROC NDLTRNK
* 
*     ENTRY        NONE 
* 
*     EXIT         NONE 
* 
*     MESSAGE 
*     INVALID KEYWORD I.D.-ABORT FROM NDLTRNK 
* 
*     METHOD
* 
*     IF NO LABEL ERROR 
*       SAVE NAME IN PLINK$XREF TABLE 
*     FOR EACH PARAMETER ON LOGLINK LINE
*       IF NO VALUE ERROR 
*         PROCESS AND STORE INFO IN APPROPRIATE PLINK$XREF ITEM 
*     IF P1,P2,N1 OR N2 PARAMETER NOT SPECIFIED 
*       FLAG ERROR - REQUIRED PARAMETER MISSING 
*     CK FOR DUPLICATE TRUNK DEFINITIONS
*     IF DUPLICATE DEFINITION 
*       FLAG ERROR
*     CALL NDLCKPT TO CHECK UNIQUENESS OF PORT NUMBERS
*     END 
* 
# 
*ENDIF
# 
****  PROC NDLTRNK - XREF LIST BEGINS.
# 
      XREF
        BEGIN 
        PROC ABORT;          # ABORTS NDLP                             #
        PROC NDLCKPT;        # CHECK UNIQUENESS OF PORT NUMBER         #
        PROC NDLCKRG;        # CHECK RANGE OF VALUE                    #
        PROC NDLEM2;         # MAKE ENTRY IN PASS 2 ERROR FILE         #
        FUNC XCDD C(10);     #CONVERTS INTEGER TO DISPLAY CODE        # 
        PROC MESSAGE;        # PRINT DAYFIL AND SYSTEM CONSOLE MESSAGE #
        END 
# 
****
# 
      DEF FSTNT # 1 #;       # FIRST ENTRY IN NPU TABLE                #
      DEF FRAME0 # 0 #;      # CODE FOR FRAME SIZE 256                 #
      DEF FRAME1 # 1 #;      # CODE FOR FRAME SIZE 500                 #
      DEF FRAME2 # 2 #;      # CODE FOR FRAME SIZE 1050                #
      DEF FR$499 # 499 #;    # FRAME SIZE 499                          #
      DEF FR$1049 # 1049 #;  # FRAME SIZE 1049                         #
      DEF MIN$FRAM # 0 # ;   # MINIMUM FRAME SIZE                      #
      DEF MAX$FRAM # 1200 #; # MAXIMUM FRAME SIZE                      #
      DEF DEF$FRAME # 2 # ;  # DEFAULT FRAME CODE                      #
  
      DEF N1$PAR # "N1" #;     # FOR ERROR MESSAGE                     #
      DEF N2$PAR # "N2" #;     # FOR ERROR MESSAGE                     #
      DEF P1$PAR # "P1" #;     # FOR ERROR MESSAGE                     #
      DEF P2$PAR # "P2" #;     # FOR ERROR MESSAGE                     #
      DEF TRN$PAR # "TRUNK" #; # FOR ERROR MESSAGE                     #
  
      ITEM DUPTRNK B;        # DUPLICATE TRUNK FLAG                    #
      ITEM ENT$NUM;          # ENTRY NUMBER OF NPU-TABLE               #
      ITEM I;                # LOOP COUNTER                            #
      ITEM J;                # LOOP COUNTER                            #
      ITEM KWD$MAP;          # KEYWORD EXISTS MAP                      #
      ITEM NOD; 
      ITEM OK$STAT B; 
      ITEM PORT$ST B; 
      ITEM PRT; 
      ITEM CHARVAL C(10);     # TEMPORARY FOR CHAR VALUE #
  
      SWITCH TRNK$PAR        ERR$TR,  # UNK     # 
                             ERR$TR,  # NODE    # 
                             ERR$TR,  # VARIANT # 
                             ERR$TR,  # OPGO    # 
                             ERR$TR,  #         # 
                             ERR$TR,  # LLNAME  # 
                             ERR$TR,  #         # 
                             ERR$TR,  #         # 
                             ERR$TR,  #         # 
                             ERR$TR,  #         # 
                             ERR$TR,  # HNAME   # 
                             ERR$TR,  # LOC     # 
                             ERR$TR,  #         # 
                             ERR$TR,  #         # 
                             ERR$TR,  #         # 
                             ERR$TR,  #         # 
                             ERR$TR,  #         # 
                             ERR$TR,  #         # 
                             ERR$TR,  # NCNAME  # 
                             DI$ID1,   # DI      #
                             N1$ID$,   # N1      #
                             P1$ID,    # P1      #
                             N2$ID,    # N2      #
                             P2$ID,    # P2      #
                             NOLO1$ID, # NOLOAD1 #
                             NOLO2$ID, # NOLOAD2 #
                             ERR$TR,   #          # 
                             ERR$TR,   #   27     # 
                             ERR$TR,   #   28     # 
                             ERR$TR,   #   29     # 
                             ERR$TR,   #   30     # 
                             ERR$TR,   #   31     # 
                             ERR$TR,   #   32     # 
                             ERR$TR,   #   33     # 
                             ERR$TR,   #   34     # 
                             ERR$TR,   #   35     # 
                             ERR$TR,   #   36     # 
                             ERR$TR,   #   37     # 
                             FRAME$ID ;#   38     # 
  
      CONTROL EJECT;
 #                                                                     #
 #                         NDLTRNK CODE BEGINS HERE                    #
 #                                                                     #
  
      KWD$MAP = 0;           # CLEAR KEYWORD EXISTS BIT MAP            #
      PLWC[0] = PLWC[0] + 1;
      IF NOT STLBERR[1] 
      THEN                   # NO LABEL ERROR                          #
        PLNAME[PLWC[0]] = STLABEL[1]; # SET NAME IN PHYSICAL-LINK-XREF #
      PLTYPE[PLWC[0]] = 1;
      FOR I=FSTKID2 STEP 1 UNTIL STWC[0] #PROCESS EACH ENT OF STMT TAB #
      DO
        BEGIN 
        B<STKWID[I],1>KWD$MAP = 1;     # SET BIT FOR KEYWORD           #
        IF NOT STVLERR[I] 
        THEN                 # NO VALUE ERROR                          #
          BEGIN 
          IF STKWID[I] LS KID"NODE" 
            OR STKWID[I] GR KID"FRAME"
          THEN
            GOTO ERR$TR;
          ELSE
            GOTO TRNK$PAR[STKWID[I]]; 
  
N1$ID$: 
N2$ID:                       # NEXT PARAMETER IS N1 OR N2              #
          ENT$NUM = 0;
          FOR J=FSTNT STEP NTENTSZ WHILE J LQ NTWC[0] AND ENT$NUM EQ 0
          DO                 # SEE ID NAME DEFINES IN NPU-TABLE        #
            BEGIN 
            IF NTNAME[J] EQ STVALNAM[I] 
            THEN
              BEGIN 
              ENT$NUM = J;
              END 
            END 
          IF ENT$NUM NQ 0 
          THEN               # NAME IS IN NPU-TABLE                    #
            BEGIN            # SET NODE NUMBER IN PHYSICAL-LINK-XREF   #
            IF STKWID[I] EQ KID"N1" 
            THEN
              BEGIN 
              PLNID1[PLWC[0]] = NTNID[ENT$NUM]; 
              END 
            ELSE
              BEGIN 
              PLNID2[PLWC[0]] = NTNID[ENT$NUM]; 
              END 
            END 
          ELSE
            BEGIN 
            IF STKWID[I] EQ KID"N1" 
            THEN             # FLAG ERROR-PARAMETER NAME IS NOT AN NPU #
              NDLEM2(ERR119,STLNUM[0],N1$PAR);
            ELSE
              NDLEM2(ERR119,STLNUM[0],N2$PAR);
            END 
          TEST I; 
  
P1$ID:                       # NEXT PARAMETER IS P1                    #
          NDLCKRG(KID"P1",STVALNUM[I],OK$STAT); 
          IF OK$STAT
          THEN               # STORE PORT NUMBER IN PHYSICAL-LINK-XREF #
            PLP1[PLWC[0]] = STVALNUM[I];           # TABLE             #
          TEST I; 
  
P2$ID:                       # NEXT PARAMETER IS P2                    #
          NDLCKRG(KID"P2",STVALNUM[I],OK$STAT); 
          IF OK$STAT
          THEN               # STORE PORT NUMBRE IN PHYSICAL-LINK-XREF #
            PLP2[PLWC[0]] = STVALNUM[I];          # TABLE              #
          TEST I; 
  
DI$ID1:                      # NEXT PARAMETER IS DI                    #
          IF STVALNAM[I] EQ "YES" 
          THEN               # SET STATUS ELEMENT                      #
            PLST[PLWC[0]] = TRUE; 
          TEST I; 
  
NOLO1$ID:                    # NEXT PARAMETER = NOLOAD1                #
          IF STVALNAM[I] EQ "YES" 
          THEN               # SET NOLOAD1 FLAG                        #
            PLNLD1[PLWC[0]] = TRUE; 
          TEST I; 
  
NOLO2$ID:                           # NEXT PARAMETER = NOLOAD2         #
          IF STVALNAM[I] EQ "YES" 
          THEN               # SET NOLOAD2 FLAG                        #
            PLNLD2[PLWC[0]] = TRUE; 
          TEST I; 
  
  
FRAME$ID: 
          OK$STAT = TRUE; 
          IF (STVALNUM[I] LS MIN$FRAM) OR 
             (STVALNUM[I] GR MAX$FRAM)    # CHECK RANGE # 
          THEN
            BEGIN 
            OK$STAT = FALSE ; # OUT OF RANGE# 
            CHARVAL = XCDD(STVALNUM[I]);
            NDLEM2(ERR100,STLNUM[0],CHARVAL); # GENERATE ERROR MESSAGE# 
            END 
          IF OK$STAT # IF NO OUT OF RANGE # 
          THEN
            BEGIN 
            IF STVALNUM[I] LQ FR$499 # LESS THAN 499 #
            THEN
              BEGIN 
              PLFRAME[PLWC[0]] = FRAME0; #ASSIGN FRAME CODE 0#
              END 
            ELSE
              BEGIN 
              IF STVALNUM[I] LQ FR$1049 
              THEN
                BEGIN 
                PLFRAME[PLWC[0]] = FRAME1; # ASSIGN FRAME CODE 1# 
                END 
              ELSE
                BEGIN 
                PLFRAME[PLWC[0]] = FRAME2; #ASSIGN FRAME CODE 2#
                END 
              END 
            END 
            TEST I; 
  
  
ERR$TR: 
          EPRC2[0] = "NDLTRNK"; 
          MESSAGE(ABRTMSG2,0);
          ABORT;
          TEST I; 
  
          END 
        END  # I LOOP # 
  
      IF B<KID"FRAME",1>KWD$MAP NQ 1 # DEFAULT FRAME IS USED# 
      THEN
        PLFRAME[PLWC[0]] = DEF$FRAME; # DEFAULT FRAME 2#
      IF B<KID"P1",1>KWD$MAP NQ 1 
      THEN                   # P1 PARAMETER NOT SPECIFIED              #
        NDLEM2(ERR103,STLNUM[0],P1$PAR);
      IF B<KID"P2",1>KWD$MAP NQ 1 
      THEN                   # P2 PARAMETER NOT SPECIFIED              #
        NDLEM2(ERR103,STLNUM[0],P2$PAR);
      IF B<KID"N1",1>KWD$MAP NQ 1 
      THEN                   # N1 PARAMETER NOT SPECIFIED              #
        NDLEM2(ERR103,STLNUM[0],N1$PAR);
      IF B<KID"N2",1>KWD$MAP NQ 1 
      THEN                   # N2 PARAMETER NOT SPECIFIED              #
        NDLEM2(ERR103,STLNUM[0],N2$PAR);
      IF PLNID1[PLWC[0]] NQ 0 AND 
         PLNID2[PLWC[0]] NQ 0 
      THEN                   # IF N1 AND N2 WERE O.K.                  #
        BEGIN 
        DUPTRNK = FALSE;     # CLEAR DUPLICATE TRUNK FLAG              #
        FOR I=1 STEP 1 WHILE I LS PLWC[0] AND NOT DUPTRNK 
        DO
          BEGIN 
          IF (PLNID1[I] EQ PLNID1[PLWC[0]] AND
              PLNID2[I] EQ PLNID2[PLWC[0]]) OR
             (PLNID1[I] EQ PLNID2[PLWC[0]] AND
              PLNID2[I] EQ PLNID1[PLWC[0]]) 
          THEN
            BEGIN            # IF TRUNK WAS ALREADY SPECIFIED          #
            DUPTRNK = TRUE;  # SET DUPLICATE TRUNK FLAG                #
            END 
          END 
        IF DUPTRNK           # IF DUPLICATE TRUNK WAS DISCOVERED       #
        THEN
          BEGIN              # FLAG ERROR -- DUPLICATE TRUNK FOUND     #
          NDLEM2(ERR130,STLNUM[0],STLABEL[1]);
          END 
        END 
      IF PLNID1[PLWC[0]] EQ PLNID2[PLWC[0]] 
      THEN                   # IF BOTH ENDS HAVE SAME NODE I.D.        #
        BEGIN                # FLAG ERROR -- TRNK CONNECTED TO SAME NPU#
        NDLEM2(ERR151,STLNUM[0]," "); 
        END 
  
      PRT = PLP1[PLWC[0]];   # CHECK PORT NUMBERS FOR UNIQUENESS       #
      NOD = PLNID1[PLWC[0]];
      NDLCKPT(PRT,NOD,PORT$ST); 
      PRT = PLP2[PLWC[0]];
      NOD = PLNID2[PLWC[0]];
      NDLCKPT(PRT,NOD,PORT$ST); 
      RETURN; 
  
      END  # NDLTRNK PROC # 
TERM
