SUBROUTINE CHANGE(STRING, OLD.TEXT, NEW.TEXT, OPTIONS, ERRORS)
****
*
* Updated: 10:26:59 09 JUN 1987 MIS.SNA.PROG.ATM <D4.3>DEVEL 2 Z
*
****
*
* Description:
*    This subroutine is used to perform editor-like change commands on a
* string.  Argument list is as follows:
*
*     STRING     - The string to operate on.
*     OLD.TEXT   - The text to locate and replace.
*     NEW.TEXT   - The text to replace with.
*     OPTIONS    - Options used to control how the change operates.
*     ERRORS     - For any error conditions, like invalid change options.
*
*    The valid change options are:
*
*     D    - All text to the right of the change is deleted.
*     G    - Change all occurrences of OLD.TEXT starting at On occurrence.
*     O*   - Causes change to affect last occurrence.
*     On   - Causes change to occur on the n'th occurrence of OLD.TEXT.
*
* Files affected: NONE
*
****
*                           R E V I S I O N   L O G
* PR#     WHEN     WHO        WHY
* ======= ======== ========== ==========================================
* SPAWN   09JUN87  ATM        INITIAL CODING
*
****

$INSERT SYSLIB>INSERTS>STD.SUBROUTINES.INS.IBAS
$INSERT SYSLIB>INSERTS>STDDEF.INS.IBAS
$INSERT SYSLIB>INSERTS>IODEF.INS.IBAS

     CHANGE.GLOBAL = FALSE$
     CHANGE.BRIEF  = FALSE$
     CHANGE.DELETE = FALSE$
     FIRST.OCC     = 1
     LAST.OCC      = 1
     CHANGE.CODES = OPTIONS
     CONVERT LCASE$ TO UCASE$ IN CHANGE.CODES
     CONVERT ' ' TO @FM IN CHANGE.CODES
     LAST.OCC.ONLY = FALSE$
     MORE.CODES = LEN(CHANGE.CODES) GT 0
     LOOP
     WHILE MORE.CODES
        REMOVE CODE FROM CHANGE.CODES SETTING MORE.CODES
        BEGIN CASE
           CASE (CODE EQ 'B')
              CHANGE.BRIEF = TRUE$
           CASE (CODE EQ 'G')
              CHANGE.GLOBAL = TRUE$
           CASE (CODE EQ 'D')
              CHANGE.DELETE = TRUE$
           CASE (CODE MATCH 'O1N0N')
              FIRST.OCC = CODE[LEN(CODE) - 1]
           CASE (CODE EQ 'O*')
              LAST.OCC.ONLY = TRUE$
           CASE OTHERS$
              ERRORS = 'Unknown change control code: ':CODE
              RETURN
        END CASE
     REPEAT

     OKAY.TO.CHANGE = TRUE$
     IF LAST.OCC.ONLY THEN
        FIRST.OCC = COUNT(STRING,OLD.TEXT)
        LAST.OCC = FIRST.OCC
     END ELSE
        IF CHANGE.GLOBAL THEN
           LAST.OCC = COUNT(STRING,OLD.TEXT)
        END ELSE
           LAST.OCC = FIRST.OCC
        END
     END
     FOR OCC = LAST.OCC TO FIRST.OCC STEP -1
        INDEX = INDEX(STRING,OLD.TEXT,OCC)
        IF(INDEX GT 0) THEN
           IF CHANGE.DELETE THEN
              STRING = STRING[1,INDEX - 1]:NEW.TEXT
           END ELSE
              STRING = STRING[1,INDEX - 1]:NEW.TEXT:STRING[INDEX + LEN(OLD.TEXT),LEN(STRING)]
           END
        END
     NEXT OCC
     RETURN
  END
