*DECK DB$UAOS 
USETEXT UTCDFTX 
USETEXT UTMPTTX 
      PROC DB$UAOS(OFFSET); 
      BEGIN 
 #
* *   DB$UAOS - ADJUST OFFSET                    PAGE  1
* *   BOB MCALLESTER                             DATE  03/30/84 
* 
* DC  PURPOSE 
* 
*     IF TABLE SEGMENTS ARE WRITTEN TO THE SWAP FILE, LOAD THE SEGMENT
*     THAT CONTAINS THE INDICATED ENTRY AND ADJUST THE OFFSET TO
*     PERMIT ACCESS TO THAT ENTRY.
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
# 
      ITEM OFFSET;                 # OFFSET IN TABLE TO THE ENTRY      #
# 
* D   ASSUMPTIONS 
* 
*     P<TLC> POINTS TO THE TABLE HEADER OF THE APPROPRIATE TABLE. 
* 
* DC  EXIT CONDITIONS 
* 
*     THE TABLE SEGMENT ASSOCIATED WITH THE OFFSET HAS BEEN LOADED
*     AND THE OFFSET HAS BEEN ADJUSTED TO ADDRESS THE TABLE ENTRY.
* 
* DC  CALLING ROUTINES
* 
*     DB$SR29    -   SYNTAX ROUTINE 
*     DB$SR52    -   SYNTAX ROUTINE 
*     DB$SR73    -   SYNTAX ROUTINE 
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$RNRD;           # RANDOM READ                       #
      XREF PROC DB$RNRW;           # RANDOM REWRITE                    #
# 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     OFFSET
*     TLC HEADER
# 
      XREF ARRAY DB$RNFT;;         # RANDOM I/O FET                    #
# 
* DC  DESCRIPTION 
* 
*     IF THERE ARE ANY TABLE SEGMENTS SWAPPED OUT, STEP THROUGH THE 
*     DISK SEGMENT DESCRIPTORS LOOKING FOR THE SEGMENT IN WHICH 
*     THE SPECIFIED ENTRY RESIDES.
*     IF THAT SEGMENT IS NOT ALEADY THE RESIDENT SEGMENT, SWAP SEGMENTS 
*     TO BRING IT IN. 
*     DURING THE SCAN THE OFFSET HAS BEEN REDUCED TO COMPENSATE FOR 
*     THE SWAPPED OUT SEGMENTS THAT HAVE BEEN BYPASSED. 
*     IF THE SPECIFIED ENTRY IS NOT IN ANY OF THE SWAPPED SEGMENTS
*     THEN IT MUST BE IN THE SEGMENT THAT IS CURRENTLY BEING BUILT, 
*     ADJUST THE OFFSET FURTHER TO ADDRESS THE BUILD SEGMENT. 
 #
  
# 
*     LOCAL VARIABLES 
# 
      ITEM BUFLOC;                 # LOCATION OF BUFFER FOR I/O        #
      ITEM LENGTH;                 # WORD LENGTH OF SEGMENT FOR I/O    #
      ITEM PRUNUM;                 # PRU NUMBER FOR I/O                #
      ITEM XX;                     # INDUCTION VARIABLE                #
  
  
  
#     B E G I N   D B $ U A O S   E X E C U T A B L E   C O D E .      #
  
  
      FOR XX = DFTLCHL STEP 1 UNTIL TLCHLEN[0] -1 
      DO
        BEGIN                      # SCAN FOR SEGMENT CONTAINING ENTRY #
        IF OFFSET GR TLCSLEN[XX]
        THEN
          BEGIN 
          OFFSET = OFFSET - TLCSLEN[XX];
          TEST XX;                 # TRY NEXT SEGMENT                  #
  
          END 
# 
*         MAYBE MOVE TO DB$USDS -- SWAP DISK SEGMENTS.
# 
        IF TLCDSOR[0] NQ XX 
        THEN                       # SEGMENT IS NOT ALREADY RESIDENT   #
          BEGIN 
          BUFLOC = LOC(TLC) + TLCHLEN[0] + TLCDSBW[0];
          IF TLCDSMF[0]            # IF THE MODIFIED FLAG IS SET       #
          THEN                     # REWRITE THE RESIDENT SEGMENT      #
            BEGIN 
            LENGTH = TLCSLEN[TLCDSOR[0]]; 
            PRUNUM = TLCSPRU[TLCDSOR[0]]; 
            TLCDSMF[0] = FALSE; 
            DB$RNRW(LOC(DB$RNFT),BUFLOC,LENGTH,PRUNUM); 
            END 
          LENGTH = TLCSLEN[XX]; 
          PRUNUM = TLCSPRU[XX]; 
          DB$RNRD(LOC(DB$RNFT),BUFLOC,LENGTH,PRUNUM);  # READ NEW SEG  #
          TLCDSOR[0] = XX;
          TLCDSWL[0] = TLCSLEN[XX]; 
          END 
        XX = TLCHLEN[0];           # TERMINATE THE SCAN                #
                                   # (XX) WILL BE LEFT AT TLCLEN +1    #
        END 
  
      IF TLCHLEN[0] GR DFTLCHL     # IF SWAP SEGMENTS EXIST            #
        AND XX EQ TLCHLEN[0]       # BUT THE OFFSET IS NOT IN ONE      #
      THEN                         # ADJUST THE OFFSET FOR THE BUILD   #
        BEGIN                      # SEGMENT                           #
        OFFSET = OFFSET + TLCBSBW[0] - TLCDSBW[0];
        END 
  
      END 
      TERM
