*DECK CHGFDB                                                            038200
USETEXT TAREATB                                                         038300
USETEXT TCYBDEF                                                         038400
USETEXT TENVIRN                                                         038500
USETEXT TOPTION                                                         038600
USETEXT TPFMDEF                                                         038700
USETEXT TXSTD                                                           038800
      PROC  CHGFDB (TBPTR, AREAPTR, RC);                                038900
#----------------------------------------------------------------------#039000
#                                                                      #039100
#     C H G F D B                                                      #039200
#                                                                      #039300
#     THIS PROCEDURE TAKES THE PERMANENT FILE PARAMETER CHANGES        #039400
#     INDICATED IN ONE OF THE *PFTABLE* ENTRIES AND PUTS THEM IN       #039500
#     THE FDB FOR THE RESPECTIVE FILE.                                 #039600
#                                                                      #039700
#     INPUT:  TBPTR = FWA OF THE *PFTABLE* ENTRY TO BE USED.           #039800
#             AREAPTR = FWA OF AREA TABLES (NEWATBL OR AREATBLPTR).    #039900
#                                                                      #040000
#     OUTPUT: RC = ZR IF NO ERRORS.                                    #040100
#                  NZ IF AN ERROR OCCURRED (DIAG HAS BEEN ISSUED).     #040200
#                                                                      #040300
#----------------------------------------------------------------------#040400
                                                                        040500
      BEGIN                                                             040600
                                                                        040700
      ITEM  AREAPTR I;             # FWA OF AREA TABLES                #040800
      ITEM  TBPTR I;               # POINTER TO *PFTABLE* ENTRY        #040900
      ITEM  RC I;                  # RETURN CODE                       #041000
                                                                        041100
                                                                        041200
      XREF ITEM  PFPTR I;          # POINTER TO 1ST *PFTABLE* ENTRY    #041300
                                                                        041400
      XREF PROC  DIAG;             # ISSUE QU DIAGNOSTIC               #041500
                                                                        041600
                                                                        041700
      ITEM  FOUND B;               # LOOP CONTROL FLAG                 #041800
      ITEM  PWCT I;                # COUNT OF -PW- ENTRIES             #041900
      ITEM  T1 I;                  # TEMP ITEM                         #042000
      ITEM  T2 I;                  # TEMP ITEM                         #042100
                                                                        042200
                                                                        042300
      BASED ARRAY  GIVEA;          # SCRATCH ARRAY                     #042400
        BEGIN                                                           042500
        ITEM  GIVEITEM      I(00,00,60);  # FULL WORD                  #042600
        ITEM  GIVEITEMC     C(00,00,30);  # 30-CHAR NAME               #042700
        END                                                             042800
                                                                        042900
      BASED ARRAY  FDBARRAY;       # POINTS TO FDB IN AREA TABLE       #043000
        BEGIN                                                           043100
        ITEM  FDBWORD       I(00,00,60);  # FULL WORD                  #043200
        ITEM  FDBNAME       C(00,00,30);  # 30-CHAR NAME               #043300
        ITEM  FDBKEY        U(00,54,06);  # KEYWORD CODE               #043400
        ITEM  FDBVALUE      U(00,00,54);  # KEYWORD VALUE              #043500
        END                                                             043600
CONTROL EJECT;                                                          043700
      RC = 0;                      # SET GOOD RETURN                   #043800
      FOUND = FALSE;               # SET LOOP CONTROL                  #043900
      P<AREA$TABLE> = AREAPTR;                                          044000
      P<PFTABLE> = TBPTR;                                               044100
      FOR T1 = T1                  # SEARCH AREA TABLES FOR THE FILE   #044200
        WHILE NOT FOUND            # NAME SPECIFIED IN *PFTABLE*       #044300
      DO                                                                044400
        BEGIN                                                           044500
        P<FDBARRAY> = LOC(AT$AFDBPOS[0]);                               044600
        IF FDBNAME[0] EQ PFPFN[0]                                       044700
        THEN                       # CORRECT AREA TABLE FOUND          #044800
          BEGIN                                                         044900
          FOUND = TRUE;            # GET OUT OF LOOP                   #045000
          TEST T1;                                                      045100
          END                                                           045200
                                                                        045300
                                   # ADVANCE TO NEXT AREA TABLE        #045400
        IF AT$INDFDB[0] NQ 0                                            001400
        THEN                       # IF FDB FOR INDEX FILE IS PRESENT  #001500
          BEGIN                                                         001600
          P<FDBARRAY> = P<AREA$TABLE> + AT$INDFDB[0];                   001700
          IF FDBNAME[0] EQ PFPFN[0]                                     001800
          THEN                     # IT IS THE INDEX FILE              #001900
            BEGIN                                                       002000
            FOUND = TRUE;                                               002100
            TEST T1;                                                    002200
            END                                                         002300
          END                                                           002400
                                                                        002500
        P<AREA$TABLE> = AT$FORWARD[0];                                  045500
        IF P<AREA$TABLE> EQ 0                                           045600
        THEN                       # NAME WAS NOT FOUND                #045700
          BEGIN                                                         045800
          DIAG (413, PFPFN[0]);                                         045900
          RC = 1;                  # SET ERROR RETURN                  #046000
          RETURN;                                                       046100
          END                                                           046200
        END                                                             046300
                                                                        046400
CONTROL IFEQ OS$NAME,NOS;                                               046500
                                                                        046600
#     LOOP THROUGH *PFTABLE* ENTRIES AND MOVE ANY NON-ZERO             #046700
#     (I.E., SPECIFIED) ENTRIES INTO THE CORRESPONDING FDB LOCATION.   #046800
                                                                        046900
      FOR T1 = PF$PM1 STEP 1                                            047000
        UNTIL PF$TABLESZ - 1                                            047100
      DO                                                                047200
        BEGIN                                                           047300
        IF PARAMWORD[T1] NQ 0                                           047400
        THEN                       # MOVE NEW PARAM INTO FDB           #047500
          BEGIN                                                         047600
          FDBWORD[T1] = PARAMWORD[T1];                                  047700
          END                                                           047800
        END                                                             047900
                                                                        048000
      RETURN;                      # ALL DONE                          #048100
                                                                        048200
CONTROL ENDIF;                                                          048300
                                                                        048400
CONTROL IFEQ OS$NAME,SCOPE;                                             048500
                                                                        048600
#     SCAN THROUGH FDB LOOKING FOR -PW- ENTRIES.  SQUEEZE THEM OUT     #048700
#     IF THEY ARE TO BE DELETED (I.E., IF *PFDELPW* = TRUE).           #048800
#     OTHERWISE, KEEP A COUNT OF THEM, SO THE KEY VALUES ON THE NEW    #048900
#     ONES CAN BE ADJUSTED BY THE NUMBER OF THEM ALREADY PRESENT.      #049000
                                                                        049100
      PWCT = 0;                    # INITIALIZE PASSWORD COUNT         #049200
      FOR T1 = PF$PM1 STEP 1       # LOOP THRU FDB IN AREA TABLE       #049300
        UNTIL PF$TABLESZ - 1                                            049400
      DO                                                                049500
        BEGIN                                                           049600
        IF FDBKEY[T1] GQ FDBVAL$PWL                                     049700
          AND FDBKEY[T1] LQ FDBVAL$PWH                                  049800
        THEN                       # THIS IS A -PW- ENTRY              #049900
          BEGIN                                                         050000
          IF NOT PFDELPW[0]                                             050100
          THEN                     # KEEP EXISTING -PW- PARAMS         #050200
            BEGIN                                                       050300
            PWCT = PWCT + 1;       # ADVANCE PASSWORD ENTRY COUNT      #050400
            TEST T1;               # GO ON TO NEXT ENTRY               #050500
            END                                                         050600
                                                                        050700
          FOR T2 = T1 STEP 1       # SQUEEZE OUT THIS ENTRY            #050800
            WHILE FDBWORD[T2] NQ 0                                      050900
          DO                                                            051000
            BEGIN                                                       051100
            FDBWORD[T2] = FDBWORD[T2+1];                                051200
            END                                                         051300
          END                                                           051400
        END                                                             051500
                                                                        051600
#     LOOP THROUGH THE *PWTABLE* AND PUT EACH ENTRY IN THE FDB.  IF IT #051700
#     IS NOT A -PW- ENTRY, AND IF A SIMILAR ENTRY IS PRESENT, PUT      #051800
#     THE NEW ENTRY THERE, OTHERWISE AT THE END.  IF IT IS A -PW-      #051900
#     ENTRY, INCREASE THE KEY VALUE BY THE NUMBER OF -PW- PARAMETERS   #052000
#     THAT WERE IN THE FDB PREVIOUSLY (ZERO IF THEY WERE REMOVED).     #052100
#     HOWEVER, MAKE SURE THAT THIS WILL NOT RESULT IN MORE THAN        #052200
#     THE ALLOWABLE NUMBER OF -PW- ENTRIES.                            #052300
                                                                        052400
      FOR T1 = PF$PM1 STEP 1                                            052500
        WHILE PARAMWORD[T1] NQ 0                                        052600
      DO                                                                052700
        BEGIN                                                           052800
        IF PFKEY[T1] GQ FDBVAL$PWL                                      052900
          AND PFKEY[T1] LQ FDBVAL$PWH                                   053000
        THEN                       # THIS IS A -PW- PARAM CHANGE       #053100
          BEGIN                                                         053200
                                   # ADJUST KEY VALUE                  #053300
          PFKEY[T1] = PFKEY[T1] + PWCT;                                 053400
          IF PFKEY[T1] GR FDBVAL$PWH                                    053500
          THEN                     # TOO MANY PASSWORDS                #053600
            BEGIN                                                       053700
            DIAG (329, PFPFN[0]);                                       053800
            RC = 1;                # TAKE ERROR EXIT                   #053900
            RETURN;                                                     054000
            END                                                         054100
                                                                        054200
          FOR T2 = PF$PM1 STEP 1   # FIND 1ST ZERO WORD IN FDB         #054300
            WHILE FDBWORD[T2] NQ 0                                      054400
          DO                                                            054500
            BEGIN                                                       054600
            TEST T2;                                                    054700
            END                                                         054800
                                                                        054900
                                   # STORE NEW ENTRY                   #055000
          FDBWORD[T2] = PARAMWORD[T1];                                  055100
          END                                                           055200
                                                                        055300
        ELSE                       # OTHER THAN -PW-                   #055400
          BEGIN                                                         055500
          FOR T2 = PF$PM1 STEP 1                                        055600
            WHILE FDBWORD[T2] NQ 0                                      055700
          DO                                                            055800
            BEGIN                                                       055900
            IF FDBKEY[T2] NQ PFKEY[T1]                                  056000
            THEN                   # NOT A SIMILAR PARAM               #056100
              BEGIN                                                     056200
              TEST T2;                                                  056300
              END                                                       056400
                                                                        056500
                                   # STORE ENTRY OVER THE PREV ONE     #056600
            FDBWORD[T2] = PARAMWORD[T1];                                056700
            TEST T1;                                                    056800
            END                                                         056900
                                                                        057000
                                   # STORE ENTRY AT 1ST ZERO WORD      #057100
          FDBWORD[T2] = PARAMWORD[T1];                                  057200
          END                                                           057300
        END                                                             057400
                                                                        057500
CONTROL ENDIF;                                                          057600
                                                                        057700
      RETURN;                      # ALL DONE                          #057800
      END                          # ----- CHGFDB                      #057900
      TERM                                                              058000
