	SUBROUTINE SET_CONTROLC_AST
C
C	Routine to enable Control/C AST's.
C
	INCLUDE 'COM.INC/NOLIST'
	EXTERNAL CONTROLC_AST

	IF (.NOT. BATCH_MODE) THEN
		STATUS = SYS$QIOW(,%VAL(LCHAN_IN),
	1		%VAL(IO$_SETMODE + IO$M_CTRLCAST),,,,
	1		CONTROLC_AST,,,,,)
		CALL CHECK_STATUS('SET_CONTROLC_AST',STATUS)
	ENDIF
	RETURN
	END

	SUBROUTINE CONTROLC_AST
C
C	This routine is entered when a CTRL/C is typed to abort a
C	function.  It cancels the local and remote I/O (if any), sets
C	the CTRL/C typed flag, and calls wakup incase we were hibernating
C	in the mainline code (shouldn't happen normally).
C
	INCLUDE 'COM.INC/NOLIST'

	CALL CANCEL_IO()		! Cancel all I/O.

	CONTROLC_TYPED = .TRUE.		! Show CTRL/C was typed.
	IF (IN_A_COMMAND) THEN		! If in a command,
		IN_A_COMMAND = .FALSE.	! Turn off command flag and return.
	ELSE
		INTERRUPT_TYPED = .TRUE.! Treat like interrupt character.
		CALL WAKE_UP()		! Wake up hibernate in mainline.
	ENDIF
	RETURN
	END

	SUBROUTINE CANCEL_IO
C
C	This routine is used to cancel the local and remote I/O.
C
	INCLUDE 'COM.INC/NOLIST'
C
C	Cancel the local I/O (if any).
C
	IF (.NOT. BATCH_MODE) THEN
		STATUS = SYS$CANCEL(%VAL(LCHAN_IN))
		STATUS = SYS$CANCEL(%VAL(LCHAN_OUT))
		CALL CHECK_STATUS('CANCEL_LOCAL',STATUS)
	ENDIF
C
C	Cancel the remote I/O (if any).
C
	STATUS = SYS$CANCEL(%VAL(RCHAN_IN))
	STATUS = SYS$CANCEL(%VAL(RCHAN_OUT))
	CALL CHECK_STATUS('CANCEL_REMOTE',STATUS)
	RETURN
	END

	SUBROUTINE WAKE_UP
C
C	Subroutine to wake up hibernate state.
C
	INTEGER*4 STATUS, SYS$WAKE, CHECK_STATUS

	STATUS = SYS$WAKE(,)	! Wake us up.
	CALL CHECK_STATUS('WAKE_UP',STATUS)
	RETURN
	END

	SUBROUTINE RESET_WORLD
C
C	Exit handler.
C
	CALL SYS$SETSWM(%VAL(0)) 	! Reenable swapping.
C	CALL SYS$SETPRI(,,%VAL(4),) 	! Lower priority.
	RETURN
	END
