      SUBROUTINE RANGE(INPUT)
C
C     FIND THE RANGE OF RECORDS TO BE OPERATED UPON BY
C     KEYPUNCH AND EMULATOR PROGRAMS. VALUES PASSED VIA
C     CHARACTER STRING ARE CHARACTER LINE NUMBERS AND/OR
C     VAX S.O.S. CHARACTERS ('.', ':', '^', '*').
C
C****************************************************************
C
C     KEYPUNCH COMMON
C
      CHARACTER*96 BUFFER,SAVE
      CHARACTER*80 MASK,MASKA,MASKB
      CHARACTER*6  LKEY,HKEY,CKEY,TKEY,PKEY
      CHARACTER*4  PROG
      CHARACTER*1  FIELD
C
      INTEGER*4    SK1,IRCNT,ICOL,LCOL
C
      LOGICAL*1    MMODE,AMODE,EMODE,VMODE,IMODE
C
      COMMON/COM1/BUFFER,SAVE,MASK,MASKA,MASKB,PROG,FIELD
      COMMON/COM2/LKEY,HKEY,TKEY
      COMMON/COM3/SK1,IRCNT,ICOL,LCOL
      COMMON/COM4/MMODE,AMODE,EMODE,VMODE,IMODE
C
      EQUIVALENCE (BUFFER(83:88),CKEY(1:6)),(BUFFER(89:94),PKEY(1:6))
C
C*****************************************************************
C
C     LOCAL DECLARATIONS
C
      CHARACTER*(*) INPUT
      CHARACTER*80  STRING
      CHARACTER*6   KEY, ERRKEY
      CHARACTER*1   CHAR
      LOGICAL*1     DIGIT, CFLAG
C
C     IF FILE IS NEW, INFORM USER AND RETURN
C
      IF(HKEY.EQ.'000000') THEN
         PRINT *,' No such line... '
         RETURN
      END IF
C
C     INITIALIZE EVERYTHING
C
      DIGIT = .FALSE.
      CFLAG = .TRUE.
      TKEY  = '000000'
      KEY   = '000000'
      ERRKEY = CKEY
      LENGTH = LEN(INPUT) + 1
      STRING(1:LENGTH-1) = INPUT(1:LENGTH-1)
      STRING(LENGTH:) = ' '
C
C     LOOP THRU INPUT STRING AND PARSE OUT NUMBERS AND/OR CHARACTERS
C
      DO 100  LOOP=1,LENGTH
         CHAR = STRING(LOOP:LOOP)
         IF(.NOT.DIGIT.AND.(CHAR.GE.'0'.AND.CHAR.LE.'9')) THEN
            DIGIT = .TRUE.
            IA = LOOP
         END IF
C
         IF(DIGIT.AND.(CHAR.LT.'0'.OR.CHAR.GT.'9')) THEN
            DIGIT = .FALSE.
            L = 7 - (LOOP - IA)
            KEY(L:6) = STRING(IA:LOOP-1)
            IF(CFLAG) THEN
               CKEY = KEY
               KEY = '000000'
               CFLAG = .FALSE.
            ELSE
               TKEY = KEY
            END IF
         END IF
C
         IF(CHAR.EQ.'.'.OR.CHAR.EQ.'^'.OR.CHAR.EQ.'*') THEN
            IF(CHAR.EQ.'.') KEY = CKEY
            IF(CHAR.EQ.'^') KEY = LKEY
            IF(CHAR.EQ.'*') KEY = HKEY
            IF(CFLAG) THEN
               CKEY = KEY
               KEY  = '000000'
               CFLAG = .FALSE.
            ELSE
               TKEY = KEY
            END IF
         END IF
C
  100 CONTINUE
C
C     PUT FIRST RECORD INTO COMMON
C
      IF(TKEY.GT.HKEY) TKEY = HKEY
      IF(TKEY.LT.CKEY) TKEY = CKEY
      IF(IMODE.AND.(CKEY.LT.LKEY)) CKEY = LKEY
      READ(SK1,KEY=CKEY,ERR=900) BUFFER
      READ(BUFFER(81:82),1000) ICOL
C
C     IF NOT MAIN MODE, READ THE PREVIOUS RECORD INTO COMMON
C
      IF(.NOT.MMODE) THEN
         IF(CKEY.EQ.LKEY) THEN
            SAVE = BUFFER
            LCOL = ICOL
         ELSE
            READ(SK1,KEY=PKEY) SAVE
            READ(SAVE(81:82),1000) LCOL
            READ(SK1)
         END IF
      END IF
C
C
      RETURN
C
C     HANDLE FILE ERRORS
C
  900 PRINT *, 'NO SUCH LINE '
      CKEY = ERRKEY
      TKEY = CKEY
      READ(SK1,KEY=CKEY) BUFFER
      READ(BUFFER(81:82),1000) ICOL
      MMODE = .TRUE.
      RETURN
C
C     FORMAT STATEMENTS
C
 1000 FORMAT(I2)
      END
