.
.         RENAME COMMAND PROCESS
.
.
.         (C)  Copyright 1972-1978  John Walker
.
.         This software is in the public domain
.
          AXR$
          DEFUNCT$
          FANG
.
OTL       EQU       R11                 ORIGINAL ELEMENT TABLE LENGTH
OSEQ      EQU       R12                 ORIGINAL MAX SEQUENCE NUMBER
ELTB4     EQU       R13                 SEQUENCE NUMBER OF PREVIOUS ELEMENT
PROMOTE   EQU       R14                 SEQUENCE NUMBER OF NEXT ELEMENT
.
RENAMP*   LX        X9,CDBPC,X8         LOAD LINK TO FIRST PARAMETER
          LNA,U     A7                  ACCEPT ONLY NONDELETED, USE FULL ET LENG
          LMJ       X11,FILESCAN        PREPARE TABLE OF CONTENTS LIST
          J         BSPER               BSP ERROR.  TERMINATE
          JZ        A8,RENAMT           GIVE MESSAGE IF NO ELEMENTS SELECTED
          LX        X9,PBLINK,X9        LINK TO FILE FOR FIRST PARAMETER
          LX        X9,PBLINK,X9        LINK TO SECOND ELEMENT PARAMETER
.
.         THIS CODE TAKES A SELECTED ITEM FROM THE FILESCAN QUEUE, LOOKS IT
.         UP BY NAME IN THE ELEMENT TABLE, THEN REHOOKS THE LINKS IN THE
.         ELEMENT TABLE SO THAT THE ELEMENT UNDER ITS OLD NAME IS REMOVED.
.         THEN, THE ELEMENT TABLE NEXT SEQUENCE NUMBER AND LENGTH ARE
.         FUDGED SO THAT THE ELEMENT WILL BE INSERTED AT ITS OLD SPOT, AND
.         THE REGULAR INSERT ROUTINE WILL BE CALLED TO REATTACH IT AT THE
.         PROPER PLACE IN THE ELEMENT TABLE.
.
RNMNEXT   REMOVE    CDELTQ,X8           REMOVE NEXT ELEMENT FROM FILESCAN QUEUE
          TNE,U     A1,CDELTQ,X8        END OF ELEMENT LIST ?
          J         RENDONE             YES.  DONE PROCESSING
          ANA,U     A1,EIFQ             BACK UP TO BUFFER START
          LX,U      X6,,A1              LOAD POINTER REGISTER FOR THE DURATION
          LA        A10,EISEQ,X6        LOAD SEQUENCE NUMBER OF THIS ELEMENT
          LA        A0,A14              LOAD FTI ADDRESS
          LX,H2     X1,FTIET+1,A0       LOAD POINTER TO ELEMENT TABLE START
          LR,H2     OSEQ,139,X1         LOAD ORIGINAL NEXT SEQUENCE NUMBER
          LR,H1     OTL,FTIET+1,A0      LOAD ORIGINAL TABLE LENGTH
          SZ        EIPLNK,A1           CLEAR POINTER LINK
          SZ        EITLNK,A1           CLEAR TYPE LINK
          SZ        EIVLNK,A1           CLEAR VERSION LINK
          etis      .                   LOOK UP BY NAME, RECORDING FIND PATH
          J         BSPER               BSP ERROR.
          SA        A2,ELTB4            SAVE SEQUENCE NUMBER OF PREVIOUS ELT
          LXI,U     A0,1                LOAD INCREMENT ON FIND POINTER
          LA        A1,X6               LOAD POINTER TO OUR FIND BUFFER
          LXI,U     A1,1                LOAD INCREMENT FOR IT
          LR,U      R1,EIL              LOAD ITEM LENGTH
          BT        A1,,*A0             COPY ELEMENT TO FIND BUFFER
          LA        A1,EIVLNK,X6        LOAD VERSION LINK OF FOUND ELEMENT
          JZ        A1,RHNVL            SKIP IF NEXT ELT NOT CHAINED TO VER LNK
.
.         THERE IS A CHAIN OFF THE VERSION LINK.  PROMOTE THE NEXT IN THE
.         VERSION CHAIN TO REPLACE THE CURRENT ELEMENT.
.
          SA        A1,PROMOTE          MARK NEXT ELEMENT AS ONE TO PROMOTE
          LA        A0,A14              RELOAD FTI ADDRESS
          etnl      .                   READ IN NEXT ELEMENT ITEM
          J         BSPER               BSP ERROR.  ALL IS WELL
          LA        A2,EIPLNK,X6        LOAD POINTER LINK OF ITEM TO BE RENAMED
          SA        A2,EIPLNK,A0        ATTACH POINTER CHAIN TO NEXT ITEM
          LA        A2,EITLNK,X6        LOAD TYPE CHAIN ON ELT TO BE RENAMED
          SA        A2,EITLNK,A0        ATTACH TYPE CHAIN TO VERSION LINK ELT
          J         RHWRT               GO WRITE OUT THE PROMOTED ITEM
.
.         NO VERSION LINK.  CHECK IF CHAINED VIA TYPE LINK
.
RHNVL     LA        A1,EITLNK,X6        LOAD TYPE LINK FROM THIS ELEMENT
          JZ        A1,RHNTL            SKIP IF NO TYPE CHAIN TO THIS ELEMENT
          SA        A1,PROMOTE          SET THIS ELEMENT AS ONE TO PROMOTE
          LA        A0,A14              LOAD FTI ADDRESS
          etnl      .                   READ IN THE ELEMENT TABLE ITEM
          J         BSPER               BSP ERROR.  ALL OK
          LA        A2,EIPLNK,X6        LOAD POINTER LINK OFF RENAMED ITEM
          SA        A2,EIPLNK,A0        ATTACH POINTER CHAIN TO NEXT ITEM
RHWRT     LA        A0,A14              LOAD FTI ADDRESS
          ptewt     .                   CORRECT NEXT ITEM IN PROGRAM FILE
          J         BSPER               BSP ERROR.  ASSUME OK
          J         RHFIXL              GO UPDATE PREVIOUS ELEMENT / POINTER
.
.         NO TYPE LINK.  SUCCEEDING CHAIN MUST BE OFF POINTER LINK
.
RHNTL     LA        A0,EIPLNK,X6        LOAD POINTER LINK OF RENAMED ELEMENT
          SA        A0,PROMOTE          SET AS ELEMENT TO BE PROMOTED
.
.         WHEN WE GET HERE, WE KNOW WHICH ELEMENT, IF ANY, NEEDS TO BE
.         PROMOTED TO REPLACE THE ELEMENT TO BE RENAMED, AND WE HAVE CHANGED
.         ITS LINKS TO POINT TO ANY CHAINS ATTACHED TO THE ELEMENT BEING
.         REMOVED.  NOW WE FIND THE ELEMENT OR POINTER LINK WHICH LED US
.         TO THIS ELEMENT, AND REPLACE THE FORWARD LINK WHICH LED US HERE
.         WITH A POINTER TO THE ELEMENT BEING PROMOTED.
.
RHFIXL    TNZ       ELTB4               ANY ELEMENT BEFORE THIS ONE ?
          J         RHFIXPT             NO.  MUST FIX POINTER TABLE LINK
          LA        A1,ELTB4            LOAD SEQUENCE NUMBER OF PREVIOUS ELEMENT
          LXI,U     A1                  CLEAR PATH FROM PREVIOUS LINK
          LA        A0,A14              LOAD FTI ADDRESS
          etnl      .                   READ IN ELEMENT TABLE ENTRY FOR PREVIOUS
          J         BSPER               BSP ERROR.  FILE IS MESSED UP
          LA        A2,ELTB4            LOAD STATUS RETURNED BY ETIS
          SSL       A2,18               SHIFT DOWN REASON FOR FIND
          EX        RHLINK,A2           ATTACH PROMOTED ELEMENT TO LINK OF PREV
          LA        A0,A14              LOAD FTI ADDRESS
          ptewt     .                   REWRITE PREVIOUS ELEMENT TABLE ENTRY
          J         BSPER               BSP ERROR.  FILE MESSED UP
          J         RHPTOK              DONE.  GO CHANGE ELEMENT NAME
.
.         THIS ELEMENT WAS CHAINED RIGHT OFF THE POINTER TABLE.
.         WE WILL SEARCH THE POINTER TABLE (H1 THEN H2) FOR AN ENTRY WITH
.         THE SEQUENCE NUMBER OF THE ELEMENT WE ARE RENAMING.  WHEN
.         WE FIND IT, WE REPLACE THAT POINTER TABLE ENTRY WITH THE
.         SEQUENCE NUMBER OF THE ELEMENT WE HAVE PROMOTED.  (THIS MAY BE ZERO).
.
RHFIXPT   LA        A1,PROMOTE          LOAD SEQUENCE NUMBER OF PROMOTED ELT
          LR,U      R1,139              LOAD POINTER TABLE LENGTH
          LXI,U     X11,1               LOAD INCREMENT FOR SEARCH
          LXM,U     X11,,X1             GET POINTER TO POINTER TABLE START
          SE,H1     A10,,*X11           LOOK FOR POINTER IN H1 OF TABLE
          J         RHTRYH2             NOT FOUND.  LOOK IN H2 POINTERS
          ANX,U     X11,1               BACK UP POINTER TO FIND ADDRESS
          SA,H1     A1,,X11             UPDATE POINTER TABLE TO PROMOTED ELT
          J         RHPTOK              ALL LINKS OK.  CHANGE ELEMENT NAME
.
RHTRYH2   LR,U      R1,139              RELOAD POINTER TABLE LENGTH
          LXM,U     X11,,X1             POINT BACK TO TABLE START
          SE,H2     A10,,*X11           LOOK FOR POINTER TO ELT IN H2
          IERR      .                   OOPS!  ELEMENT NOT POINTED TO IN
.                                       POINTER TABLE, BUT ETIS SAID THAT'S
.                                       HOW THE ELEMENT WAS FOUND.
          ANX,U     X11,1               BACK UP TO FIND ADDRESS
          SA,H2     A1,,X11             UPDATE POINTER TABLE TO PROMOTED ITEM
.
.         ALL ELEMENT TABLE LINKS HAVE NOW BEEN UPDATED TO REMOVE THE
.         ELEMENT TO BE RENAMED FROM THE ELEMENT TABLE.  WE WILL NOW CHANGE
.         THE ELEMENT NAME, APPLYING THE STANDARD FANG RENAMING RULES, AND
.         REATTACH THE ELEMENT TO THE ELEMENT TABLE.  BEFORE WE REATTACH
.         IT HOWEVER, WE FUDGE THE LENGTH AND NEXT ITEM POINTERS OF THE
.         ELEMENT TABLE SO THAT ETIA WILL ENTER THE ELEMENT WITH THE SAME
.         SEQUENCE NUMBER IT HAD ORIGINALLY.  THIS IS ESSENTIAL, BECAUSE
.         OTHERWISE A PACK WOULD MASH THE FILE, AS IT ASSUMES THAT ELEMENT
.         TABLE ENTRIES AND TEXT OCCUR IN THE SAME ORDER.
.
rhptok    la        a0,x6               load element find item address
          la        a1,x9               load the rename specification
          lmj       x11,rename          apply the transformation to name
          bgetl     eil                 allocate a copy of the element item
          sa        a0,a6               save its address for later reference
          aa        a0,(1,0)            get increment to copy element item
          la        a1,(1,0)            get increment bit
          aa,u      a1,,x6              get pointer to input element item
          lr,u      r1,eil              load length to copy
          bt        a0,,*a1             copy the item to our new buffer
          la        a0,a14              load the BSP FCT address
          la        a1,a6               load out element item copy
          etis      .                   look for an element with same name
          j         rhptnd              none.  no duplicate in file
          la        a0,a14              duplicate.  reload FCT address
          la        a1,a6               get the found item
          etid      .                   delete the element from the file
          j         bsper               no bsp error should occur
rhptnd    brelr     a6                  release the copy element item
          LA        A1,A10              LOAD SEQUENCE NUMBER OF RENAMED ELEMENT
          ANA,U     A1,1                BACK UP BY ONE
          SA,H2     A1,139,X1           SET ELEMENT TABLE READY TO ADD THIS ONE
          MSI,U     A1,EIL              COMPUTE NEXT ADDRESS FOR INSERT IN TBL
          AA,U      A1,140              ADD POINTER TABLE LENGTH
          LA        A0,A14              LOAD FTI ADDRESS
          SA,H1     A1,FTIET+1,A0       SET ELEMENT TABLE LENGTH SO AS TO
.                                       REINSERT ELEMENT AT SAME PLACE.
          SZ        EIPLNK,X6           SET POINTER LINK ZERO
          SZ        EIVLNK,X6           SET VERSION LINK ZERO
          SZ        EITLNK,X6           CLEAR TYPE LINK TO ZERO
          LA        A0,A14              LOAD FTI ADDRESS
          LA        A1,X6               LOAD FIND ITEM ADDRESS
          etia      .                   ADD ITEM TO ELEMENT TABLE
          J         BSPER               BSP ERROR.  GET OUT
          BRELR     X6                  RELEASE ELEMENT FIND ITEM
          LA        A0,A14              GET FTI ADDRESS BACK
          SR,H2     OSEQ,139,X1         RESTORE MAX SEQUENCE NUMBER
          SR,H1     OTL,FTIET+1,A0      REPLACE ELEMENT TABLE LENGTH IN FTI
          J         RNMNEXT             GO RENAME THE NEXT ELEMENT
.
.         CLOSEOUT PROCESSING.  WRITE TABLES BACK AND TERMINATE.
.
RENDONE   LA        A0,A14              LOAD FTI ADDRESS
          wpfet     .                   REWRITE ELEMENT TABLE
          J         BSPER               BSP ERROR.
          LA        A0,A14              LOAD FTI ADDRESS
          wfti      .                   REWRITE FILE TABLE INDEX
          J         BSPER               BSP ERROR.
          BRELA     .                   RELEASE ALL BUFFERS ALLOCATED ON THE WAY
          COMPLETE  .                   COMPLETE THE COMMAND
.
RENAMT    BRELA     .                   RELEASE ALL ALLOCATED BUFFERS
          R$DIT     .                   ENTER EDITING MODE
          E$MSG     RENAMM              EDIT NONE SELECTED MESSAGE
          LA        A0,ELFDT,X9         LOAD FDT FOR INPUT FILE
          LMJ       X11,FIST            APPEND FILE AND STATEMENT
          COMPLETE  .                   TERMINATE THE COMMAND
.
.         BSP ERROR PROCESSING.
.
bsper     la        a2,a14              load BSP FCT address
          LMJ       X11,BSPERP          PRINT BSP ERROR MESSAGE
          ZAP       .                   ERROR THE COMMAND
          BRELA     .                   RELEASE ALL BUFFERS
          COMPLETE  .                   COMPLETE THE COMMAND
.
.         THIS TABLE IS EXECUTED TO ATTACH THE NEXT (PROMOTED) ELEMENT TO
.         THE APPROPRIATE LINK OF THE PREVIOUS ELEMENT.  WHICH LINK TO ATTACH
.         THE ELEMENT TO IS RETURNED BY BSP AS THE PATH USED TO FIND THIS
.         ELEMENT.  THIS CODE (WHICH IS INCORRECTLY DOCUMENTED IN UP4144,
.         REV3) TELLS WHICH LINK WAS USED TO ARRIVE AT THE FOUND ELEMENT.
.
RHLINK    EQU       $-1                 0 IS DIRECT VIA POINTER TABLE
          SR        PROMOTE,EIPLNK,A0   1 IS POINTER LINK FROM ELEMENT
          SR        PROMOTE,EITLNK,A0   2 IS TYPE LINK FROM ELEMENT
          SR        PROMOTE,EIVLNK,A0   3 IS VERSION LINK FROM ELEMENT
.
          PURE      DATA
.
RENAMM    'NO ELEMENTS SELECTED FOR RENAMING FROM !'
          END