*DECK             HATCHK
USETEXT   TSOURCE 
USETEXT   TSYMCNS 
USETEXT   TCEXECQ 
USETEXT   TSYMC5Q 
USETEXT   TCEXEC
USETEXT   TSYMC5
PROC HATCHK;
BEGIN 
  
#         HATCHK - MAINTAIN FILE ASSOCIATION TABLE FOR INTERMEDIATE    #
#                  LANGUAGE FILE (ILFAT)                               #
  
*CALL COMEX 
  
  
XREF BEGIN
     PROC NTILN;
     PROC ABORT;
     PROC SYMABT;                                                        HATCHK 
     PROC ATILN;
     PROC DIAG0;
     PROC FLUSH;
     END
  
DEF FATCAP#200#;    #TWICE NUMBER OF SCOPES#
DEF D225 #225#; 
DEF J814 #814#;                     # SYMABT DIAGNOSTIC 814            # HATCHK 
  
#         ILFAT - INTERMEDIATE LANGUAGE FILE ASSOCIATION TABLE         #
  
#         USED TO RECORD THE FILE POSITION OF EACH PROC TOP AND EACH   #
#         PROC BOTTOM.  THESE POSITIONS CONSTITUTE THE LOGICAL END OF  #
#         RECORDS ON ILN.  WHEN ILN IS READ BY GETIL IT USES THIS TABLE#
#         TO DETERMINE THE NEXT PLACE TO READ WHEN IT HITS AN "END OF  #
#         RECORD".  THE TABLE IS LINKED BY HATEND SO THAT THE READING  #
#         PHASE IS PRESENTED WITH THE INNERMOST PROC FIRST AND THE     #
#         OUTERMOST PROC LAST.                                         #
  
          XREF ARRAY ILFAT [FATCAP];
              ITEM IFALK FALKPK,   #LINK TO NEXT ENTRY# 
                   IFASC FASCPK,   #SCOPE LEVEL#
                   IFAIX FAIXPK;   #FILE POSITION#
  
ITEM TEMP,ILFACW=0; 
          CONTROL EJECT;
#         HATCHK - PUT ENTRY INTO ILFAT                                #
#         SET FILE POSITION AND SCOPE LEVEL FIELDS                     #
#         LINK FIELD WILL BE SET AT END OF PASS BY HATEND              #
  
FLUSH;
NTILN(TEMP);
ILFACW=ILFACW+1;
##       IF ILFACW GQ FATCAP THEN 
         SYMABT(J814,"IL FAT OVERFLOW (HATCHK)",24);                     HATCHK 
IFAIX[ILFACW]=TEMP; 
IFASC[ILFACW]=SCPLEV; 
RETURN; 
      CONTROL EJECT;
#     HATEND - LINK UP ILNFAT                                          #
  
ENTRY PROC HATEND;
  
      ITEM FIRSTCALL B = TRUE;
      ITEM HISCOP = 0;
      ITEM FATX I;
  
      IF NOT FIRSTCALL
      THEN
        BEGIN 
        RETURN;                    # EXEC HATEND ONLY ON INITIAL CALL  #
        END 
  
#     DUMP ILNFAT IF REQUESTED                                         #
  
      $BEGIN
      IF B<"Z" - 1>INTOPS NQ 0
      THEN
        BEGIN 
        PRINT("(5H0FAT:,I5,8H ENTRIES)"); 
        LIST(ILFACW + 1); 
        ENDL; 
  
        FOR FATX = 0 STEP 1 
          UNTIL ILFACW
        DO
          BEGIN 
          PRINT("(10X,3(O6,6X))");
          LIST(IFALK[FATX]);
          LIST(IFAIX[FATX]);
          LIST(IFASC[FATX]);
          ENDL; 
          END 
        END 
      $END
  
      FIRSTCALL = FALSE;
  
      IF IFASC[1] LS IFASC[ILFACW] # IS THE HATCHK TABLE MESSED UP     #
      THEN
        BEGIN 
        IF B<59 - "T">OPTION EQ 0  # NO PROBLEM IF THE T OPTION IS ON  #
        THEN
          BEGIN 
          DIAG0(D225);             # CODE GEN SUPPRESSED               #
          B<59 - "T">OPTION = 1;   # TURN ON THE T OPTION              #
          END 
        RETURN; 
        END 
  
      FOR TPYA = ILFACW STEP -1 
        UNTIL 1 
      DO
        BEGIN 
        IF IFASC[TPYA] GR HISCOP
        THEN
          BEGIN 
          HISCOP = IFASC[TPYA]; 
          FLCHED[HISCOP] = TPYA;
          FLCHED[HISCOP + 1] = 0; 
          END 
        TPYB = FLCHED[IFASC[TPYA] + 1]; 
  
        IF TPYB GR ILFACW          # IS THE INDEX MESSED UP            #
        THEN
          BEGIN 
          IF B<59 - "T">OPTION EQ 0  # NO PROBLEM IF T OPTION IS ON    #
          THEN
            BEGIN 
            DIAG0(D225);           # CODE GEN SUPPRESSED               #
            B<59 - "T">OPTION = 1; # TURN ON THE T OPTION              #
            END 
          RETURN; 
          END 
  
        IFALK[TPYA] = IFALK[TPYB];
        IFALK[TPYB] = TPYA; 
        END 
  
#     FLAG LINK FIELD OF LAST WORK + 1 OF FAT SO GTILN WILL            #
#     BE ABLE TO RECOGNIZE END OF TABLE                                #
  
      IFALK [ILFACW + 1] = -1;
  
      END 
TERM
