	SUBROUTINE	CHECK_EXCEPTION()
	IMPLICIT NONE
C
C   Module:	WATCHDOG EXCEPTION CHECK
C
C   Original:	George H. Walrod III
C
C   Purpose:	Read in for Watchdog Exception File and Makes
C		Entry in the Correct Table
C
C   Arguments:
C		DEFLT_START_MSG	: Default Start Message Value
C		DEFLT_STOP_PROC	: Default Stop Process Value
C
C   Corrected Modification:
C		None
C   Notes:
C	DEBUG TOOLS
C		PROGRAM		WATCHDOG_PARSE
C     +		DEFLT_START_MSG	= 1,		! Default Start Message
C     +		DEFLT_STOP_PROC	= 2,		! Default Stop Process
C
*
	INCLUDE	'WATCHITMLST.INC'		! Item List
	INCLUDE	'WATCHWORD.INC'			! Get Word Common
	INCLUDE	'WATCHREC.INC'			! Get Record Common
	INCLUDE	'WATCHTERM.INC'			! Common Terminal Table
	INCLUDE	'WATCHUSER.INC'			! Common Username Table
	INCLUDE	'WATCHACCT.INC'			! Common Account  Table
	INCLUDE	'WATCHIMAG.INC'			! Common Image    Table
	INCLUDE	'WATCHPROC.INC'			! Common Process  Table
	INCLUDE	'WATCHUIC.INC'			! Common Uic      Table
*
	PARAMETER
     +		MAX_FILENAME	= 100,		! Maximum Filename Length
     +		NORMAL		= 1,		! Normal (non-EOF) Symbol
     +		EOF 		= 0,		! EOF Symbol
     +		COMMENT		= '!',		! Comment Symbol
     +	  	TERMINAL	= 1,		! Terminal Array Index
     +		PROCESS		= 2,		! Process  Array Index
     +		USERNAME	= 3,		! Username Array Index
     +		ACCOUNT		= 4,		! Account  Array Index
     +		IMAGE		= 5,		! Image    Array Index
     +		UIC		= 6,		! UIC      Array Index
     +		MAX_KEYWORDS	= 6		! Max Number of Keywords
*
	LOGICAL*1
     +		GET_VALUE,			! Get Numeric Value
     +		UIC_CHECK,			! UIC  Syntax Routine 
     +		TERM_CHECK,			! Terminal Syntax Routine 
     +		ACCT_CHECK,			! Account Syntax Routine 
     +		USER_CHECK,			! Username Syntax Routine 
     +		IMAG_CHECK,			! Image Routine 
     +		PROC_CHECK,			! Process Name Syntax Routine 
     +		CHECK_EOLN			! Function to for Eoln

	CHARACTER
     +		FILENAME*(MAX_FILENAME),	! Exception Filename
     +		KEYWORDS(6)*8			! Illegal Procedure Verbs

	INTEGER*2
     +		FILE_LENGTH,			! File Name Length
     +		TEMP_PTR			! Temporary Pointer

	INTEGER*4
     +		DEFLT_START_MSG,		! Default Start Message Values
     +		DEFLT_STOP_PROC,		! Default Stop  Process Values
     +		SYS$TRNLNM,			! System Service Translate Log
     +		NEW_START_MSG,			! New Start Message Values
     +		NEW_STOP_PROC,			! New Stop Process Values
     +		STATUS,				! Function Status Return
     +		GET_WORD			! Function Get Word

	RECORD	/ITEM_LIST/
     +		TRN_ITMLST(2)			! Translate Logical Item List

	EXTERNAL
     +		LNM$_STRING,			! Logical Name Item Ret String
     +		SS$_NORMAL,			! Successful Completion
     +		SS$_NOLOGNAM			! No Logical Name Found

	DATA	KEYWORDS
     +	  /'TERMINAL', 'PROCESS', 'USERNAME', 'ACCOUNT', 'IMAGE', 'UIC'/

C
C   Formatted I/O Statements
C

200	FORMAT(' ERROR COULD FIND/OPEN FILE ',A)
800	FORMAT(' ERROR ON LINE ',I5,' UNKNOWN KEYWORD ',A)
801	FORMAT(' ERROR ON LINE ',I5,
     +			' UNEXPECTED END OF LINE EXPECTED ',A,' NAME')
802	FORMAT(' ERROR ON LINE ',I5, ' CANNOT USE VALUE ', A, ' FOR ',
     +	                                   A, ' VALUE USING DEFAULT ')

C
C
C   Initialize Line Number
C

	LINE = 0
	
C
C  Translate Logical Name Item List
C

	TRN_ITMLST(1).BUFFER_LENGTH	 = MAX_FILENAME
	TRN_ITMLST(1).ITEM_CODE		 = %loc(LNM$_STRING)
	TRN_ITMLST(1).BUFFER_ADDR	 = %loc(FILENAME)
	TRN_ITMLST(1).RETURN_LENGTH_ADDR = %loc(FILE_LENGTH)
	TRN_ITMLST(2).END_LIST		 = 0

C
C   Translate Logical Name to Get File, If There is No Logical
C   Then Assume No Exception File
C

	STATUS = SYS$TRNLNM(,LOGICAL_TABLE, EXCEPTION_FILE,,TRN_ITMLST)
	IF (STATUS .eq. %loc(SS$_NOLOGNAM))	! No Logical Found
     +	  GOTO 900
	IF (STATUS .ne. %loc(SS$_NORMAL))	! Unexpected Error
     +	  CALL LIB$STOP(%val(STATUS))

C
C   Open Watchdog Exception File
C

	OPEN (UNIT=1, FILE=FILENAME(1:FILE_LENGTH), STATUS='OLD', 
     +        ERR=980, READONLY, CARRIAGECONTROL='LIST')

C
C   Read a Record and Parse and To Verify Data Til EOF
C

	STATUS = GET_WORD(.true.)
	DO WHILE (STATUS .ne. EOF)

C
C   Skip Comment Lines
C

     	  IF (WORD(1:WORD_LEN) .eq. COMMENT) GOTO 10

C
C    Do Keyword Look up
C

	      TEMP_PTR = 1
	      DO WHILE ((TEMP_PTR .le. MAX_KEYWORDS) .and.
     +	             (WORD(1:WORD_LEN) .ne. KEYWORDS(TEMP_PTR)))
	        TEMP_PTR = TEMP_PTR + 1
	      END DO

	      IF (TEMP_PTR .gt. MAX_KEYWORDS) then
	        WRITE(6,800) LINE, KEYWORDS(TEMP_PTR)
	        GOTO 10
	      END IF

C
C   Check for Unexpected End of Line
C

	      IF (CHECK_EOLN()) then
	        WRITE(6,801) LINE, KEYWORDS(TEMP_PTR)
	        GOTO 10
	       END IF

C
C   Get the Next Word and Make Sure It's Just a Comment
C

	      STATUS = GET_WORD(.false.)
     	      IF (WORD(1:WORD_LEN) .eq. COMMENT) THEN
	        WRITE(6,801) LINE, KEYWORDS(TEMP_PTR)
	        GOTO 10
	       END IF

C
C   Check Terminal Exemptions
C

	      IF ((TEMP_PTR .eq. TERMINAL) .and.
     +	          (.not. TERM_CHECK(WORD(1:WORD_LEN)))) THEN
	        GOTO 10
	       END IF

C
C   Check Process Name Exemptions
C

	      IF ((TEMP_PTR .eq. PROCESS) .and.
     +	          (.not. PROC_CHECK(WORD(1:WORD_LEN)))) THEN
	        GOTO 10
	       END IF

C
C   Check Username Exemptions
C

	      IF ((TEMP_PTR .eq. USERNAME) .and.
     +	          (.not. USER_CHECK(WORD(1:WORD_LEN)))) THEN
	        GOTO 10
	       END IF

C
C   Check Account Exemptions
C

	      IF ((TEMP_PTR .eq. ACCOUNT) .and.
     +	          (.not. ACCT_CHECK(WORD(1:WORD_LEN)))) THEN
	        GOTO 10
	       END IF

C
C   Check Image Exemptions
C

	      IF ((TEMP_PTR .eq. IMAGE) .and.
     +	          (.not. IMAG_CHECK(WORD(1:WORD_LEN)))) THEN
	        GOTO 10
	       END IF

C
C   Check Uic Exemptions
C

	      IF ((TEMP_PTR .eq. UIC) .and.
     +	          (.not. UIC_CHECK(WORD(1:WORD_LEN)))) THEN
	        GOTO 10
	       END IF

C
C   At This Point, A Very Safe Assume is That All Keyword Parameters
C   Have Check The Last Two Parameters are Optional. Check For This
C   Optionality Now. Special Note On Errors til next Record is Read
C   in, Must Clear Table Entry Made From the Above Routines.
C

	      IF (CHECK_EOLN()) then
	        GOTO 10
	       END IF

C
C   Get the Next Word and Make Sure It's Just a Comment
C

	      STATUS = GET_WORD(.false.)
     	      IF (WORD(1:WORD_LEN) .eq. COMMENT) THEN
	        GOTO 10
	       END IF

C
C   Translate Start and Apply the Default If Neccessary
C

	      IF (.not. GET_VALUE(WORD(1:WORD_LEN), DEFLT_START_MSG,
     +						NEW_START_MSG)) THEN
	        WRITE(6,802) LINE, WORD(1:WORD_LEN), 'START MESSAGE'
	       END IF

C
C   Have Check The Last Parameter Note it is Optional. Check For This
C   Optionality Now.
C

	      IF (CHECK_EOLN()) then
	        GOTO 10
	       END IF

C
C   Get the Next Word and Make Sure It's Just a Comment
C

	      STATUS = GET_WORD(.false.)
     	      IF (WORD(1:WORD_LEN) .eq. COMMENT) THEN
	        GOTO 10
	       END IF

C
C   Translate Stop Process Value and Apply the Default If Neccessary
C

	      IF (.not. GET_VALUE(WORD(1:WORD_LEN),DEFLT_STOP_PROC,
     +						NEW_STOP_PROC)) THEN
	        WRITE(6,802) LINE, WORD(1:WORD_LEN), 'STOP PROCESS'
	       END IF

C
C   Set New Start and Stop Values
C

	      IF (TEMP_PTR .eq. TERMINAL) THEN
	        TERMINAL_LIST(MAX_TERMINAL).START_MSG = NEW_START_MSG 
	        TERMINAL_LIST(MAX_TERMINAL).STOP_PROC = NEW_STOP_PROC
	       END IF

	      IF (TEMP_PTR .eq. PROCESS) THEN
	        PROCESS_LIST(MAX_PROCESS).START_MSG = NEW_START_MSG 
	        PROCESS_LIST(MAX_PROCESS).STOP_PROC = NEW_STOP_PROC
	       END IF

	      IF (TEMP_PTR .eq. USERNAME) THEN
	        USERNAME_LIST(MAX_USERNAME).START_MSG = NEW_START_MSG 
	        USERNAME_LIST(MAX_USERNAME).STOP_PROC = NEW_STOP_PROC
	       END IF

	      IF (TEMP_PTR .eq. ACCOUNT) THEN
	        ACCOUNT_LIST(MAX_ACCOUNT).START_MSG = NEW_START_MSG 
	        ACCOUNT_LIST(MAX_ACCOUNT).STOP_PROC = NEW_STOP_PROC
	       END IF

	      IF (TEMP_PTR .eq. IMAGE) THEN
	        IMAGE_LIST(MAX_IMAGE).START_MSG = NEW_START_MSG 
	        IMAGE_LIST(MAX_IMAGE).STOP_PROC = NEW_STOP_PROC
	       END IF

	      IF (TEMP_PTR .eq. UIC) THEN
	        UIC_LIST(MAX_UIC).START_MSG = NEW_START_MSG 
	        UIC_LIST(MAX_UIC).STOP_PROC = NEW_STOP_PROC
	       END IF

C
C   Get Next Record
C

 10	  CONTINUE
	  STATUS = GET_WORD(.true.)
	 END DO

C
C   End Processing
C

 900	CONTINUE

C
C   Debugging Include Instructions for Dumping Tables
C

D	INCLUDE	'WATCHDUMP.INC'

	GOTO 990
C
C   Warning/Error While Trying Locate/Open Exception File
C

 980	CONTINUE
	WRITE(6,200) FILENAME(1:FILE_LENGTH)
	GOTO 999

 990	CONTINUE
	CLOSE(UNIT=1,err=999)
 999	STOP ' '
	END
