Google
 

Trailing-Edge - PDP-10 Archives - QT020_T20_4.1_6.1_SWSKIT_851021 - swskit-tools/swserr.mac
There are 4 other files named swserr.mac in the archive. Click here to see a list.
	TITLE	SWSERR	PRODUCE COMPACT LISTING OF BUGXXX ERRORS
	SUBTTL	J. G. ZIMA/JGZ   MAY 1980

	SEARCH	MACSYM,MONSYM	;GET SYMBOLS
	SEARCH	SERCOD		;GET SYSERR SYMBOLS
	SEARCH	ZSUBS		;GET THE SUBROUTINE PACKAGE
	.REQUIRE ZSUBS.REL	;GET THE ZSUBS CODE
	SALL			;NICE LOOKING MACROS
	.DIRECT	FLBLST		;AND NICE LISTING


;VERSION INFORMATION:


	VMAJOR==1		;MAJOR VERSION LEVEL
	VMINOR==0		;MINOR VERSION LEVEL
	VEDIT==^D38		;EDIT LEVEL
	VWHO==0			;WHO LAST EDITED




;SWSERR IS A PRODUCT OF THE MONITOR SUPPORT GROUP OF SOFTWARE SERVICES,
;PRIMARILY FOR INCLUSION ON THE TOPS-20 MONITOR SWSKIT.  THE PURPOSE
;OF THE PROGRAM IS TO PROVIDE A "CONCISE" LISTING OF SYSTEM SOFTWARE
;ERRORS, IN LIEU OF SYSERR.
;
;RELATED FILES:
;	SWSERR.MAC	THIS FILE
;	ZSUBS.UNV	COMND/LUUO PACKAGE UNIVERSAL
;	ZSUBS.REL	COMND/LUUO PACKAGE CODE
;	SERCOD.UNV	SYSERR SYMBOLS UNIVERSAL
	SUBTTL	TABLE OF CONTENTS



;	TABLE OF CONTENTS					  PAGE
;	-----------------					  ----
;
;  1. J. G. ZIMA/JGZ   MAY 1980. . . . . . . . . . . . . . . . . .   1
;  2. TABLE OF CONTENTS. . . . . . . . . . . . . . . . . . . . . .   2
;  3. REVISION HISTORY . . . . . . . . . . . . . . . . . . . . . .   3
;  4. COMMAND SCANNER AND INITIALIZATION . . . . . . . . . . . . .   7
;  5. HELP COMMAND . . . . . . . . . . . . . . . . . . . . . . . .   9
;  6. WHAT COMMAND TO SHOW PARAMETER SETTINGS. . . . . . . . . . .  10
;  7. INCLUDE COMMAND TO VARY LISTING. . . . . . . . . . . . . . .  12
;  8. IGNORE COMMAND TO MODIFY LISTING FORMAT. . . . . . . . . . .  13
;  9. TIME COMMAND TO SET TIME RANGE . . . . . . . . . . . . . . .  14
; 10. READ COMMAND TO SPECIFY ALTERNATE INPUT FILE . . . . . . . .  15
; 11. LIST COMMAND TO DO IT. . . . . . . . . . . . . . . . . . . .  16
; 12. THE MAIN PROCESSING LOOP . . . . . . . . . . . . . . . . . .  17
; 13. ENTRY INPUT AND VALIDATION ROUTINES. . . . . . . . . . . . .  21
; 14. OUTPUT CONVERSION ROUTINES . . . . . . . . . . . . . . . . .  27
; 15. PAGE HEADER PRINTING ROUTINE . . . . . . . . . . . . . . . .  28
; 16. SUMMARY PRINTING ROUTINE . . . . . . . . . . . . . . . . . .  29
; 17. THE DATA AREA. . . . . . . . . . . . . . . . . . . . . . . .  32
	SUBTTL	REVISION HISTORY

;REVISION HISTORY:
;
;   1	JGZ	7-MAY-80
;		BEGIN KEEPING REVISION HISTORY FROM NOW ON.
;
;   2	JGZ	7-MAY-80
;		ADD "YES" AND "NO" TABLES AND THEIR INITIALIZATION, SO
;		THAT THEY CAN BE USED TO "INCLUDE J0NRUN", OR TO DO A
;		"INCLUDE NO DN20ST" WITH A FEW MORE EDITS.
;		ADD ROUTINES TO SEARCH BOTH THE TABLES FOR A MATCH
;		AND CALL THEM FROM THE PROCESSING LOOP.  STILL HAVE TO
;		CHANGE THE COMMAND PARSING AND FILL THE TABLES.
;
;   3	JGZ	7-MAY-80
;		ADD A SINGLE LEVEL JFN STACK TO KEEP UNUSED JFNS FROM
;		PILING UP ON REPARSE ERRORS.
;
;   4	JGZ	8-MAY-80
;		PUT IN THE CODE TO PARSE SPECIFIC BUGNAMES IN THE
;		INCLUDE COMMAND.
;
;   5	JGZ	8-MAY-80
;		DISCOVERED A V4 COMND BUG.  WON'T PARSE THE STRING
;		"INCLUDE NO BUGNAME" UNLESS YOU ESC AFTER THE NO.
;		DECIDES TO DO INCLUDE OF "NO BUG".  HAS SOMETHING
;		TO DO WITH DEFAULT STRING ALSO.  SO CHANGED TO HAVE
;		NO DEFAULT STRING, AND TO REQUIRE BUGNAME BE QUOTED
;		UNTIL COMND FIXED AT LEAST.
;
;   6	JGZ	10-MAY-80
;		DECIDED TO ALLOW POSSIBLY WILD BUGNAMES IN INCLUDE
;		COMMAND, WHICH MEANS REWRITE OF ALL THE INCLUDE
;		STUFF.  GO ASCIZ ALL THE WAY WITH THE NON-INCLUDE PARTS.
;
;   7	JGZ	11-MAY-80
;		PRETTY UP LISTING, ADD TABLE OF CONTENTS, IMPROVE HELP
;		TEXT.
;
;  10	JGZ	14-MAY-80
;		PRETTY UP WHAT COMMAND OUTPUT BY PADDING IGNORE OUTPUT
;		WITH BLANKS IN "NO" POSITION.
;
;  11	JGZ	16-MAY-80
;		ON SECOND THOUGHT, TRAP AND NOTE ALL DIRST ERRORS IN PROCLP.
;
;  12	JGZ	26-JUN-80
;		TIME TO SUMMARY LINE, DO IGNORE COMMAND TO GET RID OF
;		QUOTED BUG NAMES, CLEANUP HELP TEXT, BEGIN CODE TO READ
;		BUGSTRINGS.TXT.
;
;  13	JGZ	26-JUN-80
;		COMPLETE CODE FOR READING SYSTEM:BUGSTRINGS.TXT FOR THOSE
;		BUG MESSAGES NOT IN SYSERR BLOCK: SLOW BUT EFFECTIVE.
;
;  14	JGZ	26-JUN-80
;		"FINAL" LISTING CLEANUP AND NEW TABLE OF CONTENTS.
;
;  15	JGZ	28-JUN-80
;		BETTER ERROR HANDLING FOR GETMSG ROUTINE, BKJFN STUFF
;		TO PROCLP CODE TOO...
;
;  16	JGZ	16-JAN-81
;		MAKE IT TYPE OUT THE VERSION NUMBER ON STARTUP.
;
;  17	JGZ	22-MAR-81
;		CONVERT FOR USE WITH THE ZSUBS PACKAGE.
;
;  20	JGZ	23-MAR-81
;		ADJUST SOME FOR THE POINT AFTER DECIMAL NUMBERS.
;
;  21	JGZ	31-MAY-81
;		REMOVE WIDTH PARAMETER FROM PAGE NUMBER OUTPUT; SOMETIMES
;		THERE ARE REALLY LOTS OF PAGES...
;
;  22	JGZ	23-JUN-81
;		PUT IN A .REQUIRE FOR THE ZSUBS CODE.
;
;  23	JGZ	23-JUN-81
;		FOR RELEASE 5 ERROR.SYS MOVES TO PS:<SYSTEM-ERROR>.
;
;  24	JGZ	24-JUN-81
;		CHANGE SUMMARY FORMAT LINES TO INCLUDE BUG TYPE.
;
;  25	JGZ	26-JUL-81
;		CHANGE DEFSTR FOR HDRVER, RELEASE 5 REDEFINES THE FIELD.
;
;  26	JGZ	29-JUL-81
;		JFNTMP IS IN ZSUBS NOW.
;
;  27	JGZ	9-AUG-81
;		"NO MESSAGE AVAILABLE..." NEEDS ADJUSTING.
;
;  30	JGZ	25-NOV-81
;		USE WARN AND ERROR UUOS A FEW PLACES WHERE APPROPRIATE
;
;  31	JGZ	4-JAN-82
;		CHANGE LIST PROCESSING USE OF OJFN SOME TO GIVE BETTER
;		ERRORS WHEN TROUBLE OCCURS.
;
;  32	JGZ	24-JAN-82
;		TEXT MACRO HAS MOVED TO ZSUBS.
;
;  33	JGZ	28-JAN-82
;		USE NEW ZSUBS FILESPEC OUTPUT LUUO, TYPJFN.
;
;  34	JGZ	28-MAY-82
;		NORMALIZE LSTDAT MIDNIGHT FOR TODAY, NOT YEAR ZERO.
;
;  35	JGZ	5-JUL-83
;		SYSTEM GENERATES SEVERAL VERSIONS NOW, OLD CHECK
;		FOR ONE VERSION NO LONGER WORKS....
;		BEGIN KEEPING DECIMAL EDIT NUMBER.
;
;  36	JGZ	26-SEP-83
;		BETTER ERROR MESSAGE IF CAN'T FIND ERROR FILE.
;
;  37	JGZ	9-APR-84
;		USE VI%DEC FOR DECIMAL VERSION NUMBER.
;
;  38	JGZ	28-APR-85
;		BACKWARDS COMPATIBILITY - TRY TO USE PS:<SYSTEM>ERROR.SYS
;		IF <SYSTEM-ERROR> IS A LOSER.
;
;DEFAULT PARAMETERS:


	PAGSIZ==^D54		;NUMBER OF LINES/PAGE
	SUMSIZ==^D100		;NUMBER OF ENTRIES ALLOWED IN SUMMARY TABLE



;CONSTANTS:


	HF.ERR==377		;ENTRY TYPE INDICATION ERROR IN FILE
	HF.EOF==777		;ENTRY TYPE INDICATING END-OF-FILE
	HF.T20==1B17		;ENTRY HEADER BIT FOR TOPS-20
	HF.VER==1		;EARLIEST SYSERR VERSION WE KNOW ABOUT
	HDRDAT==1		;OFFSET TO DATE-TIME WORD



	.CHSPC==40		;**;SPACE CHARACTER UNTIL IN MACSYM


;FLAGS:


	FL%TIM==1B0		;CHECK ENTRIES FOR TIME RANGE
	FL%CHK==1B1		;INCLUDE BUGCHKS
	FL%INF==1B2		;INCLUDE BUGINFS
	FL%HLT==1B3		;INCLUDE BUGHLTS
	FL%IFS==1B4		;INPUT FILE SPECIFIED
	FL%FDO==1B7		;FORCE DATE OUTPUT AT START OF PAGE
	FL%OFO==1B8		;OUTPUT FILE IS OPEN
	FL%NOF==1B9		;"NO" FLAG FOR "NO" SEEN


;MACROS, OPDEFS, AND DEFSTRS:



	DEFSTR	HDRLEN,HDRWRD,26,3	;HEADER LENGTH FIELD
	DEFSTR	ENTLEN,HDRWRD,35,9	;ENTRY LENGTH FIELD
	DEFSTR	HDRCOD,HDRWRD,8,9	;ENTRY TYPE CODE
	DEFSTR	HDRVER,HDRWRD,23,3	;VERSION LEVEL

	DEFSTR	BUGPI,BUGPIS,27,7	;PI LEVEL IN CONI PI, WORD
	SUBTTL	COMMAND SCANNER AND INITIALIZATION




EVEC:	JRST	SWSERR		;START
	JRST	REEN		;REENTER
	BYTE	(3)VWHO(9)VMAJOR(6)VMINOR(18)VI%DEC+VEDIT ;VERSION


SWSERR:	RESET			;CLEAR EVERYTHING
	$INIT			;INIT THE ZSUBS PACKAGE
	TYPE	<SWSERR BUGxxx LISTER %>
	SETZM	OJFN		;NO OUTPUT JFN YET
	VERSIO	EVEC+2		;OUTPUT THE VERSION NUMBER
	TYPE	<

>				;AND SPACE DOWN
REEN:	MOVE	P,[IOWD PDLSIZ,PDL]	;SET UP A STACK
	TXZ	F,FL%FDO!FL%OFO	;INITIALIZE FLAGS
	TXO	F,FL%HLT!FL%CHK!FL%INF ;INCLUDE EVERYTHING
	SETZM	NAMTAB		;CLEAR INCLUDE NAME TABLE


NEWCMD:	HRROI	T1,[ASCIZ/SWSERR>/] ;PROMPT
	MOVEM	T1,CMDBLK+.CMRTY ;SET IT UP
	MOVEI	T1,NEWPAR	;SETUP REPARSE ADDRESS
	HRRM	T1,CMDBLK+.CMFLG ;IN THE COMND BLOCK
	PARSE	[FLDDB. .CMINI]	;INITIALIZATION FUNCTION
	MOVEM	P,SAVEP		;SAVE STACK FOR REPARSING
	JRST	NEWPAR		;AND PARSE A NEW COMMAND


PARERR:	JRST	REEN		;REENTER ON LOSE-TYPE ERROR
NEWPAR:	MOVE	P,SAVEP		;RESTORE THE STACK TO KNOWN STATE
	SKIPE	T1,JFNTMP	;CLEAN UP ANY STACKED JFNS
	RLJFN			; FROM REPARSING
	 ERJMP	.+1		;IGNORE THIS CASE
	SETZM	JFNTMP		;AND MARK JFN FREED
	PARSE	[FLDDB. (.CMKEY,,CMDTAB)] ;PARSE FROM COMMAND TABLE
	MOVE	T2,(T2)		;GET ADDRESS OF ROUTINE
	CALL	(T2)		;CALL IT
	JRST	NEWCMD		;AND GET A NEW COMMAND

;TABLE OF COMMANDS:


CMDTAB:	CMDLEN,,CMDLEN			;HEADER
	AA	EXIT,.EXIT		;EXIT COMMAND
	AA	HELP,.HELP		;TYPE HELP MESSAGE
	AA	IGNORE,.IGNOR		;IGNORE STUFF
	AA	INCLUDE,.INCLU		;INCLUDE STUFF
	AA	LIST,.LIST		;SET UP OUTPUT SPEC
	AA	PUSH,.PUSH		;PUSH TO A NEW EXEC
	AA	READ,.READ		;SET UP INPUT SPEC
	AA	TAKE,.TAKE		;TAKE COMMANDS FROM FILE
	AA	TIME,.TIME		;SET BEGIN AND END TIMES
	AA	WHAT,.WHAT		;WHAT ARE SWITCH SETTINGS

	CMDLEN==.-CMDTAB-1		;NUMBER OF COMMANDS
	SUBTTL	HELP COMMAND

.HELP:	NOISE	(WITH COMMANDS)	;GUIDEWORDS
	CONFRM			;CONFIRM THE COMMAND
	TYPE.	HLPTXT		;OUTPUT THE MESSAGE
	RET			;AND ALL DONE


HLPTXT:TEXT	<


     SWSERR is a program designed to produce a compact  listing  of  the
BUGxxx   errors   recorded  in  a  SYSERR-format  ERROR.SYS  file.   The
information provided is date and time,  bug-type,  bug-name,  fork,  job
and  user  number,  program  name,  PI levels active, and username.  The
listing format can include or suppress the various bug-types.  The input
file  may be specified if desired, and a time range selected.  The final
summary  counts  the  occurances  of  each  BUGxxx  and   includes   the
informational bug-string if available.

     The commands are:

        EXIT            Exit from the program
        HELP            Type this text
        INCLUDE         Specify inclusion of BUGHLTs, BUGCHKs,
				and BUGINFs or specific,
				possibly wild, BUG names
        IGNORE          Specify exclusion of BUGHLTs, BUGCHKs,
				and BUGINFs or specific,
				possibly wild, BUG names
        LIST            Specify output file and begin processing
                                May be aborted with ^E
        PUSH            Push command level to a new EXEC
        READ            Specify alternate input ERROR.SYS format file
        TAKE            Take commands from specified file
        TIME            Set begin and end times for searching input
        WHAT            Tell current parameter settings

[End of SWSERR.HLP]

>
	SUBTTL	WHAT COMMAND TO SHOW PARAMETER SETTINGS

;WHAT COMMAND TO TELL SWITCH SETTINGS


.WHAT:	NOISE	(ARE PARAMETER SETTINGS)	;DO GUIDEWORDS
	CONFRM			;CONFIRM IT
CMDWH3:	TXNN	F,FL%TIM	;RANGES OF TIME?
	 JRST	CMDWH4		;NOT SET
	TYPE	<
Time Settings:	Begin: >	;SET--TYPE THEM
	MOVEI	T1,.PRIOU
	MOVE	T2,BGNTIM
	SETZ	T3,
	ODTIM
	 ERJMP	LOSE
	TYPE	<
		End:   >	;AND END VALUE
	MOVEI	T1,.PRIOU
	MOVE	T2,ENDTIM
	SETZ	T3,
	ODTIM
	 ERJMP	LOSE
	JRST	CMDWH5		;AND CONTINUE

CMDWH4:	TYPE	<
No Time Range Set>		;SAY NONE SET
CMDWH5:	TXNE	F,FL%IFS	;CHECK INPUT FILE SETUP
	 JRST	CMDWH6		;ONE SPECIFIED
	TYPE	<
Default Input Error File>	;NOT SET UP
	JRST	CMDWH7		;AND CONTINUE

CMDWH6:	TYPE	<
Input Error File Specified: >	;PREFIX
	HRROI	T1,JFNSTR	;POINT TO FILENAME STRING
	PSOUT			;TYPE IT
	 ERJMP	LOSE

	;...
CMDWH7:	TYPE	<
Listing includes:>		;FIRST PART
	TXNE	F,FL%HLT	;HLTS?
	 TYPE	<  BUGHLTs>	;YUP
	TXNE	F,FL%CHK	;CHKS?
	 TYPE	<  BUGCHKs>	;YES
	TXNE	F,FL%INF	;INFS?
	 TYPE	<  BUGINFs>	;YES
	TXNN	F,FL%HLT!FL%CHK!FL%INF ;SEE IF ANY
	 TYPE	<  Summary listing> ;JUST THE SUMMARY
	SKIPN	NAMTAB		;IF NO NAMES SET, THEN
	 RET			;RETURN
	MOVN	P1,NAMTAB	;BUILD AN
	HRLZ	P1,P1		;AOBJN POINTER
	HRRI	P1,NAMTAB+1	;TO INCLUDE STRINGS
CMDWLP:	MOVEI	T2,1		;CHECK "NO" FLAG
	TDNE	T2,0(P1)	; IN B35 OF FIRST WORD OF STRING
	TYPE	<
  INCLUDE >			;"YES"
	TDNN	T2,0(P1)	; IN B35 OF FIRST WORD OF STRING
	TYPE	<
  IGNORE  >			;NO FLAG IS SET
	TYPE.	0(P1)		;OUTPUT THE STRING
	AOS	P1		;BUMP FOR TWO WORD ENTRY
	AOBJN	P1,CMDWLP	;LOOP TIL DONE
	RET			;DONE
	SUBTTL	INCLUDE COMMAND TO VARY LISTING

;INCLUDE COMMAND TO MODIFY LISTING FORMAT FOR INCLUSION


.INCLU:	NOISE	(IN LISTING)	;PROCESS GUIDEWORDS
	TXZ	F,FL%NOF	;CLEAR "NO" FLAG
CMDINL:	PARSE	[FLDDB. (.CMKEY,,INCTAB,,,[
		FLDDB. (.CMTXT,CM%SDH,,<Specific BUG name>)])]
	TSC	T3,T3		;SEE WHICH BLOCK WAS USED
	JUMPN	T3,GETSTR	;IT WAS THE SPECIFIC NAME ONE...
	HRRZ	P1,(T2)		;GET CODE RETURNED
	CONFRM			;CONFIRM THE COMMAND
	TXNE	F,FL%NOF	;"NO" FLAG SET?
	ADDI	P1,4		;YUP, ADJUST TABLE INDEX
	XCT	INCXCT(P1)	;ADJUST LISTING BITS
	RET			; AND ALL DONE HERE


;HERE TO PICK UP A SPECIFIC BUGNAME AND STORE IN NAMTAB

GETSTR:	MOVE	T2,[POINT 7,ATMBUF]	;POINTER TO INPUT
	MOVE	T1,NAMTAB	;GET FIRST FREE
	IMULI	T1,2		;FOR TWO WORD ENTRIES
	ADDI	T1,NAMTAB+1		;AND OFFSET FOR COUNT
	MOVE	T4,T1		;COPY TO T4 FOR LATER
	HRLI	T1,(POINT 7,)	;FINALLY BUILD BYTE POINTER
	MOVEI	P1,6		;COUNTER, SIX CHARS MAX
STRL:	ILDB	T3,T2		;GET NEXT BYTE
	JUMPE	T3,STRFIN	;GO ON ENDING NULL
	CAIE	T3,.CHSPC	;SPACE?
	CAIN	T3,.CHTAB	; OR TAB?
	 JRST	STRL		;YUP, SKIP IT
	IDPB	T3,T1		;STORE
	SOJG	P1,STRL		;ONLY TAKE SIX
STRFIN:	SETZ	T3,		;TERMINATE WITH NULL
	IDPB	T3,T1		;TO END STRING
	MOVEI	T2,1		;USING 1B35 TO HOLD YES/NO
	ANDCAM	T2,0(T4)	;CLEAR
	TXNE	F,FL%NOF	;TEST FLAG
	IORM	T2,0(T4)	;"NO", SET NO FLAG
	CONFRM			;CONFIRM THE LINE
	AOS	NAMTAB		;ALLOCATE THE ENTRY, IT'S REAL
	RET			;AND RETURN
	SUBTTL	IGNORE COMMAND TO MODIFY LISTING FORMAT

;IGNORE COMMAND TO EXCLUDE CATEGORIES OR SPECIFICS FROM LISTING

.IGNOR:	NOISE	(IN LISTING)	;DO GUIDEWORDS
	TXO	F,FL%NOF	;SET "NO" FLAG
	CALLRET	CMDINL		;AND DO THE WORK IN COMMON CODE WITH INCLUDE



INCTAB:	INCLEN,,INCLEN
	AA	ALL,0		;INCLUDE EVERYTHING
	AA	BUGCHKS,1
	AA	BUGHLTS,2
	AA	BUGINFS,3
	INCLEN==.-INCTAB-1


INCXCT:	CALL [	TXO	F,FL%HLT!FL%CHK!FL%INF	;INCLUDE ALL
		SETZM	NAMTAB	;CLEAR INCLUDE TABLE
		RET]		;DONE
	TXO	F,FL%CHK
	TXO	F,FL%HLT
	TXO	F,FL%INF
	CALL [	TXZ	F,FL%HLT!FL%CHK!FL%INF	;EXCLUDE ALL
		SETZM	NAMTAB	;CLEAR INCLUDE TABLE
		RET]		;DONE
	TXZ	F,FL%CHK
	TXZ	F,FL%HLT
	TXZ	F,FL%INF
	SUBTTL	TIME COMMAND TO SET TIME RANGE

;TIME COMMAND TO SET BEGIN AND END THRESHOLDS


.TIME:	NOISE	(TO START LISTING ENTRIES) ;PROCESS GUIDEWORDS
	PARSE	[FLDDB.(.CMCFM,,,,,[FLDDB.(.CMTAD,,CM%IDA+CM%ITM,,,[
		FLDDB.(.CMTAD,,CM%IDA,,,[FLDDB.(.CMTAD,,CM%ITM)])])])]
	TSC	T3,T3		;CHECK FOR JUST A CRLF
	JUMPE	T3,[	TXZ	F,FL%TIM	;YES--CLEAR TIME CHECKING
			RET]			; AND DONE HERE
	MOVEM	T2,BGNTIM	;SAVE IT
	NOISE	(AND END AT)	;MORE NOISE
	PARSE	[FLDDB.(.CMCFM,,,,,[FLDDB.(.CMTAD,,CM%IDA+CM%ITM,,,[
		FLDDB.(.CMTAD,,CM%IDA,,,[FLDDB.(.CMTAD,,CM%ITM)])])])]
	TXO	F,FL%TIM	;REMEMBER
	MOVEM	T2,ENDTIM	;SAVE AWAY
	TSC	T3,T3		;CHECK FOR JUST CRLF (FIRST FLDDB.)
	JUMPE	T3,[GTAD	; IF SO, USE NOW
		    MOVEM T1,ENDTIM	; AS ENDING TIME
		    RET]		;AND DONE
	CONFRM			;OTHERWISE CONFIRM THE LINE
	RET			;AND RETURN
	SUBTTL	READ COMMAND TO SPECIFY ALTERNATE INPUT FILE

;READ COMMAND TO SET ALTERNATE INPUT FILE


.READ:	NOISE	(ERROR DATA FROM)
	MOVX	T2,GJ%OLD	;FILE MUST EXIST
	MOVEM	T2,JFNBLK	;SET FLAGS
	PARSE	[FLDDB. (.CMIFI,,,,<PS:<SYSTEM-ERROR>ERROR.SYS>)] ;PARSE INPUT FILENAME
	MOVEM	T2,JFNTMP	;SAVE THE INPUT JFN FOR LATER
	CONFRM			;CONFIRM THE LINE
	TXO	F,FL%IFS	;FILE SPECIFIED
	HRROI	T1,JFNSTR	;WHERE TO PUT THE STRING
	MOVE	T2,JFNTMP	;GET BACK THE JFN
	MOVEM	T2,IJFN		;AND SAVE IN IJFN
	SETZB	T3,T4		;DEFAULT STRING
	JFNS			;PUT IT IN STRING BLOCK
	 ERJMP	LOSE		;FAILED
	MOVE	T1,IJFN		;AND PROCEED TO
	RLJFN			; UNLOAD JFN, SAVING STRING
	 ERJMP	LOSE		;FAILED
	RET			;AND RETURN
	SUBTTL	LIST COMMAND TO DO IT

;LIST COMMAND TO SET OUTPUT FILE AND BEGIN


.LIST:	NOISE	(OUTPUT ON FILE) ;PROCESS GUIDEWORDS
	PARSE	[FLDDB. (.CMOFI,,,,<TTY:>)] ;GET OUTPUT SPEC
	MOVEM	T2,JFNTMP		;STORE JFN FOR OUTPUT
	NOISE	(AND BEGIN PROCESSING) ;FINAL NOISE
	CONFRM			;CONFIRM THE LINE
	SETABT	LSTABT		;SETUP ABORT TO LSTABT ON CONTROL-E
	CALL	PROCES		;DO THE JOB
LSTDON:	CLRABT			;CLEAR CONTROL-E ABORT
	RET			;AND RETURN FOR ANOTHER COMMAND




;DEBRK TRANSFERS CONTROL TO HERE TO ABORT THE LIST COMMAND

LSTABT:	MOVEI	T1,.PRIOU	;PRESUME TO CLEAR
	CFOBF			; THE OUTPUT IN CASE GOING TO TTY
	 ERJMP	LOSE
	WARN	Listing Aborted
	TXZ	F,FL%OFO	;ABORT CLOSE THE FILES
	MOVX	T1,CZ%ABT+.FHSLF; FOR THE JOB
	CLZFF
	 ERJMP	LOSE
	SETZM	OJFN		;MARK OJFN CLOSED
	MOVE	P,SAVPSI	;ADJUST STACK BACK FOR ABORT
	JRST	LSTDON		; AND FINISH UP THE COMMAND
	SUBTTL	THE MAIN PROCESSING LOOP


PROCES:	MOVX	T1,GJ%OLD+GJ%SHT	;GETJFN BITS
	HRROI	T2,[ASCIZ/PS:<SYSTEM-ERROR>ERROR.SYS/]	;ASSUME DEFAULT
	TXNE	F,FL%IFS	;SPECIAL FILE SPECIFIED?
	HRROI	T2,JFNSTR	;YES--POINT TO IT
	GTJFN			;TRY TO GET IT
	 ERJMP	.+2		;FAILED - TRY ALTERNATE DEFAULT
	JRST	PROC1		;GOT ONE
	MOVX	T1,GJ%OLD+GJ%SHT	;GETJFN BITS
	HRROI	T2,[ASCIZ/PS:<SYSTEM>ERROR.SYS/]	;OTHER DEFAULT
	TXNE	F,FL%IFS	;SPECIAL FILE SPECIFIED?
	HRROI	T2,JFNSTR	;YES--POINT TO IT
	GTJFN			;TRY TO GET IT
	 ERJMP [WARN	Cannot get JFN on error file:
		JRST	LOSE]	;FAILED
PROC1:	MOVEM	T1,IJFN		;SAVE JFN

	MOVE	T1,IJFN		;GET INPUT JFN
	MOVX	T2,^D36B5+OF%RD+OF%PLN ;TO READ
	OPENF			;OPEN IT
	 ERJMP	LOSE		;FAILED

	MOVE	T1,JFNTMP	;OUTPUT JFN STILL IN TEMP SLOT
	MOVEM	T1,OJFN		;NOW TRY OUTPUT JFN
	MOVX	T2,^D7B5+OF%WR	;TO WRITE IN ASCII
	OPENF			;OPEN IT
	 ERJMP LOSE		;FAILED
	TXO	F,FL%OFO	;MARK AS OPEN

	TYPE	<
[ PROCESSING >			;SAY WHO
	TYPJFN	IJFN		;OUTPUT THE FILESPEC
	TYPE	< ]

>				;AND A CRLF
	SETOM	LINENO		;INIT LINE COUNTER
	SETZM	PAGENO		;INIT PAGE NUMBER
	TXO	F,FL%FDO	;FORCE DATE OUTPUT
	SETZ	T4,		;NO FLAG BITS
	SETOM	T2		;TODAY
	ODCNV			;CONVERT TO PARTS
	 ERJMP	LOSE		;FAILED
	HLLZS	T4		;SET TIME TO MIDNIGHT
	IDCNV			;GET LOCAL MIDNITE
	 ERJMP	LOSE		;FAILED
	HRROM	T2,LSTDAT	;SET DATE PRINTING THRESHOLD

	MOVEI	T1,POOL		;INITIALIZE
	MOVEM	T1,FREPTR	; FREE POOL POINTER
	MOVEI	T1,SUMSIZ	;SIZE OF SUMMARY TBLUK TABLE
	MOVEM	T1,SUMTAB	;INIT THE TABLE TO EMPTY
	CALL	FILINI		;INIT INPUT FILE POINTERS

	;...
PROCLP:	CALL	NXTENT		;GET NEXT ENTRY TO BUFFER
	 JRST	PROCFN		;END OF FILE OR OTHER TERMINATION
	MOVE	P1,HDRTIM	;MAKE
	CALL	TIMCHK		; CHECK OF TIME
	 JRST	PROCSM		;UNWANTED--BUT SUMMARIZE
	MOVE	P1,[POINT 7,BUGNAM]	;GET THE PARTICULAR NAME
	CALL	NMYCHK		;REALLY WANT THIS ONE?
	 SKIPA			;NOT ESPECIALLY
	JRST	PROCLY		;YES, DO IT.
	MOVE	P1,[POINT 7,BUGNAM]	;GET THE PARTICULAR NAME
	CALL	NMNCHK		;REALLY WANT TO FORGET THIS ONE?
	 JRST	PROCSM		;YES, FORGET IT
	MOVE	P1,BUGFLG	;GET TYPE FLAGS
	CALL	TYPCHK		;SEE IF INCLUDING
	 JRST	PROCSM		;UNWANTED, BUT SUMMARIZE

;HERE WE REALLY WANT TO PRINT THIS ENTRY, SO DO SO

PROCLY:	CALL	TSTPAG		;WANT THIS ONE--
	SKIPGE	P1,BUGDAT	;GET BUG TIME IF SET
	MOVE	P1,HDRTIM	; ELSE USE ENTRY WRITTEN TIME
	CALL	DATOUT
	PSPACE	1
	MOVE	P1,BUGFLG	;GET THE BUG TYPE
	CAIN	P1,BG%HLT	;HLT?
	 PRINT	<HLT    >	;YES, SAY SO
	CAIN	P1,BG%CHK	;CHK?
	 PRINT	<  CHK  >	;YES
	CAIN	P1,BG%INF	;INF?
	 PRINT	<    INF>	;YES
PROCL1:	PSPACE	1
	HRROI	T2,BUGNAM	;POINT TO THE NAME
	MOVEI	T3,7		;SIX CHARACTERS
	SETZM	T4		;ASCIZ
	SOUT			;OUTPUT IT
	 ERJMP	LOSE
	AOS	P1,T3		;ACCOUNT FOR THE REMAINING
	DVCHR			;SEE IF OUTPUT TO TTY
	 ERJMP	LOSE
	MOVE	T1,OJFN		;SETUP JFN AGAIN
	LOAD	T2,DV%TYP,T2	;DEVICE TYPE
	CAIE	T2,.DVTTY	;IF TTY OR
	CAIN	T2,.DVPTY	;PTY THEN
	 SKIPA			;DON'T BKJFN
	BKJFN			;BACK OVER NULL (FOR FILES)
	 ERJMP	.+1		;IGNORE ANY ERROR (LIKE TTYS)
	PSPACE	0(P1)		; SPACES NEEDED
	;...
	HLRE	T2,BUGJOB	;GET FORK NUMBER
	JUMPL	T2,[PRINT < ---> ;FORK NOT GIVEN
		    JRST PROCL2];CONTINUE
	OCTOUT	T2,4		;4 DIGIT OCTAL FORK NUMBER
PROCL2:	HRRE	T2,BUGJOB	;GET JOB NUMBER
	JUMPL	T2,[PRINT < --->	;JOB NOT GIVEN
		    JRST PROCL3];CONTINUE
	DECOUT	T2,3		;3 DIGIT DECIMAL JOB NUMBER
PROCL3:	PSPACE	1
	HRRZ	T2,BUGUSR	;USER NUMBER
	JUMPE	T2,[PRINT < ---> ;NONE APPROPRIATE
		    JRST PROCL4];CONTINUE
	OCTOUT	T2,4		;4 DIGIT OCTAL USER NUMBER
PROCL4:	PSPACE	2
	SKIPN	P1,BUGPNM	;PROGRAM NAME
	MOVE	P1,[SIXBIT/  --  /] ;CHANGE IF NOT GIVEN
	CALL	SIXOUT		;OUTPUT SIXBIT PROGRAM NAME
PROCL6:	PSPACE	1
	LOAD	T3,BUGPI	;GET THE CURRENT PI LEVEL
	ROT	T3,-7		;MOVE TO BITS 0-6
	MOVSI	T4,-7		;NUMBER OF LEVELS
PROCL7:	MOVEI	T2,.CHSPC	;SPACE
	SKIPGE	T3		;PI LEVEL IN PROGRESS?
	MOVEI	T2,"1"(T4)	;YES, GET THE DIGIT
	BOUT			;OUTPUT SPACE OR LEVEL
	 ERJMP	LOSE
	LSH	T3,1		;AND SHIFT UP A BIT
	AOBJN	T4,PROCL7	; THEN LOOP

	PSPACE	4
	SKIPE	T2,BUGUSR	;USER NUMBER AGAIN
	DIRST			;PRINT IT
	 ERJMP [PRINT	<(DIRST Error)> ;NOTE
		JRST	.+1]	;CONTINUE IN LINE WITHOUT A NAME
	PRINT	<
>				;OUTPUT CRLF
	;...

PROCSM:	MOVEI	T1,SUMTAB	;SETUP THE TBLUK TABLE
	MOVE	T2,[POINT 7,BUGNAM] ;POINT TO THE NAME
	TBLUK			;SEE IF IT'S THERE
	TXNE	T2,TL%EXM	;EXACT MATCH?
	 JRST [	HRRZ	T1,0(T1) ;FETCH RH POINTER TO COUNT, MSG BLOCK
		AOS	0(T1)	;COUNT UP ANOTHER REFERENCE
		JRST	PROCS2]	;AND CONTINUE TO LOOP

;HERE WE HAVE A NEW ENTRY, SO BUILD THE COUNT, MESSAGE BLOCK AND DO
;A TBADD TO PUT IT INTO THE TABLE.

	MOVEI	T1,2		;NUMBER OF WORDS FOR BUG NAME STRING
	ADDB	T1,FREPTR	;ALLOCATE THE SPACE
	DMOVE	T3,BUGNAM	;PICK UP THE NAME
	DMOVEM	T3,-2(T1)	; AND STORE IN FREE POOL
	MOVE	P4,FREPTR	;SAVE THE START OF THE BLOCK
	MOVEI	T1,1		;INITIAL REFERENCE COUNT
	MOVEM	T1,0(P4)	;SET IT
	MOVE	T1,BUGFLG	;GET THE BUG TYPE
	HRLM	T1,0(P4)	; AND SAVE THE CODE
	HRLI	T1,BUGMSG	;SOURCE OF MESSAGE
	HRRI	T1,1(P4)	;DESTINATION
	BLT	T1,MSGSIZ+1(P4)	;BLT MESSAGE
	MOVEI	T1,MSGSIZ+1	; AND FINALLY ALLOCATE
	ADDM	T1,FREPTR	; THE SPACE

	MOVEI	T1,SUMTAB	;POINT TO THE TABLE
	HRLI	T2,-2(P4)	;BUGNAME POINTER IN LH
	HRR	T2,P4		;COUNT, MESSAGE POINTER IN RH
	TBADD			;ADD THE ENTRY
	 ERJMP	LOSE		;AWFUL ERROR LIKE TABLE FULL
PROCS2:	JRST	PROCLP		;AND LOOP


;HERE AFTER PROCESSING THE INPUT FILE

PROCFN:	CALL	SUMOUT		;PRINT THE SUMMARY
	MOVE	T1,IJFN		;INPUT JFN
	CLOSF			;CLOSE
	 ERJMP	LOSE
	MOVE	T1,OJFN		;OUTPUT JFN
	CLOSF			;SAME
	 ERJMP	LOSE
	SETZM	OJFN		;AND MARK IT CLOSED
	TXZ	F,FL%OFO	;MARK AS NOT OPEN
	RET			;AND DONE
	SUBTTL	ENTRY INPUT AND VALIDATION ROUTINES


;ALL ROUTINES HERE RETSKP IF VALID AND RET IF ENTRY IS UNWANTED


;TIMCHK	VERIFY ENTRY TIME IN P1 IN RANGE

TIMCHK:	TXNN	F,FL%TIM	;DO WE CARE?
	RETSKP			;NO
	CAML	P1,BGNTIM	;TOO EARLY
	CAMLE	P1,ENDTIM	; OR TOO LATE?
	RET			;YUP
	RETSKP			;IN RANGE


;TYPCHK - VERIFY ENTRY TYPE WANTED (HLT/CHK/INF) AGAINST TYPE IN P1

TYPCHK:	MOVE	T1,[FL%CHK	;GET BIT CORRESPONDING TO TYPE
		    FL%INF
		    FL%HLT]-1(P1)
	TDNE	F,T1		;SEE IF WE WANT IT
	RETSKP			;WANT IT
	RET			;SUPPRESSING


;NMYCHK - VERIFY PARTICULAR NAME WANTED, POINTER TO NAME IN P1

NMYCHK:	CALL	NAMCHK		;CALL THE REAL ROUTINE
	JUMPG	T1,RSKP		;T1 POSITIVE MEANS "YES" MATCH
	RET			;ELSE NO OR DON'T CARE


;NMNCHK - VERIFY PARTICULAR NAME NOT WANTED, POINTER TO NAME IN P1

NMNCHK:	CALL	NAMCHK		;CALL THE REAL ROUTINE
	JUMPL	T1,R		;T1 NEGATIVE MEANS "NO" MATCH
	RETSKP			;ELSE YES OR DON'T CARE
;NAMCHK - DO WILD NAME MATCHING LOOKUP.
;CALL WITH POINTER TO NAME IN P1.
;RETURNS WITH T1/  -1 ON A "NO" MATCH
;		    0 ON A "DON'T CARE"
;		   +1 ON A "YES" MATCH
;MAKES ALL CHECKS, IN ORDER, USES T1-T4.

NAMCHK:	SETZM	T4		;SET SENSE FLAG TO DON'T CARE
	MOVE	T3,P1		;STRING TO CHECK
	SKIPN	P1,NAMTAB	;GET COUNT IN P1
	 JRST [	MOVE	P1,T3	;NONE, RESTORE P1,
		SETZM	T1	; SET "DON'T CARE"
		RET]		; AND RETURN
	MOVN	P1,P1		;BUILD UP AN
	HRLZ	P1,P1		; AOBJN POINTER IN P1
NMCHLP:	HRROI	T2,NAMTAB+1(P1)	;POINT TO WILD STRING
	MOVX	T1,.WLSTR	;STRING CHECK FUNCTION
	WILD%			;MAKE THE CHECK
	 ERJMP	LOSE
	JUMPN	T1,NMCHLX	;CONTINUE ON NO MATCH
	MOVEI	T1,1		;WE ARE USING 1B35 AS THE YES/NO FLAG
	MOVEM	T1,T4		;ASSUME "YES" MATCH
	TDNE	T1,NAMTAB+1(P1)	;BUT CHECK ANYWAY
	SETOM	T4		;IT WAS A "NO" MATCH
NMCHLX:	AOS	P1		;BUMP FOR TWO WORD ENTRY
	AOBJN	P1,NMCHLP	; AND LOOP TIL DONE
	MOVE	P1,T3		;RESTORE P1
	MOVE	T1,T4		;AND SET SENSE FLAG IN T1
	RET			;THEN RETURN
;FILINI	INITIALIZE INPUT FILE...


FILINI:	MOVEI	T1,1		;ADDRESS OF FIRST HEADER WORD
	MOVEM	T1,HDRADR	;INIT HDRADR
	SETZM	HDRWRD		;AND FAKE HDRWRD SO WILL BEGIN AT START
	RET			;AND RETURN



;NXTENT	READ IN THE NEXT ENTRY.  RETSKP OK, RET ON EOF.

NXTENT:	LOAD	T2,HDRLEN	;HEADER LENGTH
	LOAD	T1,ENTLEN	;ENTRY LENGTH
	ADD	T2,T1		;COMBINE
	CALL	GETWRD		;READ NEXT HEADER
	 RET			;EOF???
	LOAD	T1,HDRCOD	;GET TYPE CODE
	CAIE	T1,HF.ERR	;IS IT AN ERROR MARKER
	CAIN	T1,HF.EOF	; OR THE NORMAL EOF MARKER?
	 RET			;YES
	MOVEM	T3,HDRADR	;SET NEW HEADER ADDRESS
	MOVEM	T2,HDRWRD	;SET NEW HEADER WORD
	LOAD	T1,HDRVER	;GET VERSION
	CAIGE	T1,HF.VER	;ONE WE KNOW?
	 JRST	LOST		;NO--SANITY CHECK LOSES
	MOVE	T1,HDRWRD	;WORD
	TXNN	T1,HF.T20	;TOPS-20 ENTRY?
	 JRST	LOST		;NO--SANITY CHECK LOSES
	LOAD	T1,HDRCOD	;GET TYPE CODE
	CAIE	T1,SEC%BG	;BUGXXX ENTRY?
	JRST	NXTENT		;NO--LOOP
	CALL	RDENT		;OK, SO READ VALUES
	RETSKP			;AND RETURN SKIP

LOST:	WARN	LOST SYNCHRONIZATION--ATTEMPTING TO CONTINUE

	MOVE	T1,HDRADR	;GET CURRENT ADDRESS
	ADDI	T1,^D128	;MOVE TO NEXT BLOCK
	TRZ	T1,177		;AND ROUND BACK TO BEGINNING
	MOVEM	T1,HDRADR	;THEN STORE BACK
	MOVEI	T2,0		;ZERO OFFSET
	CALL	GETWRD		;READ THE POINTER WORD AT START OF BLOCK
	 RET			;APPARENTLY END OF FILE...
	HRRZS	T2		;OFFSET IS IN THE RIGHT HALF
	ADDM	T2,HDRADR	;POINT TO START OF NEXT ENTRY
	SETZM	HDRWRD		;NO FURTHER OFFSETS
	JRST	NXTENT		; AND TRY THE NEXT ENTRY
;RDENT - READ IN THE DATA FOR THE CURRENT ENTRY

RDENT:	MOVEI	T2,HDRDAT	;GET DATE-TIME
	CALL	GETWRD
	 JRST	OOPS
	MOVEM	T2,HDRTIM	;SAVE IT

	LOAD	T2,HDRLEN
	ADDI	T2,BG%FLG	;GET FLAGS TYPE WORD
	CALL	GETWRD
	 JRST	OOPS
	MOVEM	T2,BUGFLG	;STORE

	LOAD	T2,HDRLEN
	ADDI	T2,BG%JOB	;GET FORK,,JOB WORD
	CALL	GETWRD
	 JRST	OOPS
	MOVEM	T2,BUGJOB	;STORE

	LOAD	T2,HDRLEN
	ADDI	T2,BG%USR	;USER NUMBER
	CALL	GETWRD
	 JRST	OOPS
	MOVEM	T2,BUGUSR	;STORE

	LOAD	T2,HDRLEN
	ADDI	T2,BG%PNM	;USER PROGRAM NAME
	CALL	GETWRD
	 JRST	OOPS
	MOVEM	T2,BUGPNM	;STORE

	SETZB	T1,T2		;PRE-CLEAR
	DMOVEM	T1,BUGNAM	;THE NAME WORDS
	LOAD	T2,HDRLEN
	ADDI	T2,BG%NAM	;GET BUG NAME
	CALL	GETWRD
	 JRST	OOPS
	MOVE	T3,[POINT 7,BUGNAM] ;WHERE TO PUT THE STRING
RDENTN:	SETZ	T1,		;ZERO
	LSHC	T1,6		;THEN SHIFT UP A BYTE
	ADDI	T1," "		;MAKE ASCII
	IDPB	T1,T3		;STASH IT IN NAME STRING
	JUMPN	T2,RDENTN	; AND LOOP TIL DONE
	;...
	;...
	LOAD	T2,HDRLEN
	ADDI	T2,BG%DAT	;GET DATE/TIME OF BUG
	CALL	GETWRD
	 JRST	OOPS
	MOVEM	T2,BUGDAT	;STORE

	LOAD	T2,HDRLEN
	ADDI	T2,BG%PIS	;CONI PI, WORD
	CALL	GETWRD
	 JRST	OOPS
	MOVEM	T2,BUGPIS	;STORE

	LOAD	T2,HDRLEN
	ADDI	T2,BG%MSG	;POINTER TO MESSAGE
	CALL	GETWRD
	 JRST	OOPS
	JUMPE	T2,[SETZM BUGMSG ;NO POINTER MEANS NO MESSAGE
		    JRST  NMSGDN] ;CONTINUE
	MOVE	P1,T2		;SAVE THE POINTER
	SETZ	P2,0		;OFFSET IN BUGMSG STORE
NMSGLP:	LOAD	T2,HDRLEN
	ADD	T2,P1		;NEXT WORD OF MESSAGE
	CALL	GETWRD
	 JRST	OOPS
	MOVEM	T2,BUGMSG(P2)	;SAVE IT
	AOS	P2
	TXNE	T2,177B34	;TRAILING NULL?
	AOJA	P1,NMSGLP	;NOPE, GET NEXT

NMSGDN:	RET			;AND RETURN


OOPS:	ERROR	UNEXPECTED END-OF-FILE ON INPUT
;GETWRD - ROUTINE TO RETURN DESIRED WORD FROM INPUT FILE
;CALLED WITH OFFSET FROM THE BEGINNING OF THE HEADER IN T2.
;RETURNS THE DESIRED WORD IN T2 RETSKP.  NONSKIP FOR END-OF-FILE.
;RETURNS WORD ADDRESS IN T3.
;COMPUTES THE ADJUSTMENTS NEEDED TO ACCOMODATE THE SYNCH WORD AT
;THE START OF EVERY 128-WORD BLOCK.


GETWRD:	MOVE	T1,HDRADR	;HEADER ADDRESS
	ADD	T2,T1		;PLUS OFFSET
	LSH	T1,-7		;DIVIDE BY BLOCKSIZE
	MOVE	T3,T2		;COPY FOR ADJUST
	LSH	T3,-7		;DIVIDE BY BLOCKSIZE
	SUB	T3,T1		;COUNT BLOCK CROSSINGS
	ADD	T3,T2		;UPDATE ADDRESS FOR PROPER ADJUSTMENT
	XOR	T2,T3		;AND CHECK TO SEE IF THE ADJUSTMENT
	TRNE	T2,200		; PUSHED US ACROSS ANOTHER BOUNDARY
	AOS	T3		;IT DID, ADD THE (FINAL!) ADJUSTMENT.
	MOVE	T1,IJFN		;INPUT JFN
	RIN			;READ THE WORD
	 ERJMP	CHKEOF		;WATCH FOR EOF
	RETSKP			;RETURN

CHKEOF:	GTSTS			;GET STATUS BITS
	TXNN	T2,GS%EOF	;END OF FILE?
	JRST	LOSE		;NO--SOME ERROR
	RET			;YES--NONSKIP
	SUBTTL	OUTPUT CONVERSION ROUTINES


;DATOUT	OUTPUT THE DATE-TIME PASSED IN P1.


DATOUT:	MOVE	T1,OJFN		;JFN
	MOVE	T2,P1		;THE DATE-TIME
	SETZ	T3,		;DEFAULT FORMAT
	TXNE	F,FL%FDO	;FORCED?
	JRST	DATOU1		;YES--MAKE SURE THRESHOLD OK
	CAMGE	T2,LSTDAT	;PAST THRESHOLD?
	 JRST [	PUSH	P,T2	;SAVE ACROSS CALL
		PSPACE	12	; DO SPACING
		POP	P,T2	;RESTORE
		JRST	DATOU2]	;AND CONTINUE
	TXO	F,FL%FDO	;YES, FORCE DATE OUT
DATOU1:	HLLM	T2,LSTDAT	;UPDATE THE THRESHOLD
	MOVSI	T4,1		; AND ADJUST IT
	CAML	T2,LSTDAT	; TO BE CORRECT
	ADDM	T4,LSTDAT	; FOR NEXT DAY
DATOU2:	TXZN	F,FL%FDO	;FORCING?
	TXO	T3,OT%NDA	;NO--SUPPRESSING
	ODTIM			;DO IT
	 ERJMP	LOSE		;FAILED
	RET			;DONE



;SIXOUT - ROUTINE TO OUTPUT A WORD IN SIXBIT TO THE SELECTED JFN
;ACCEPTS
;  P1/	VALUE TO BE OUTPUT
;	CALL	SIXOUT
;RETURNS  +1:	ALWAYS.  ALWAYS OUTPUTS SIX CHARACTERS
;USES T1-T4.

SIXOUT:	MOVE	T1,OJFN		;GET THE SELECTED JFN
SIXWRD:	MOVE	T3,P1		;COPY THE WORD
	MOVEI	T4,6		;NUMBER OF CHARACTERS TO DO
SIXWRL:	SETZ	T2,		;CLEAR T2
	LSHC	T2,6		;SHIFT UP A BYTE
	ADDI	T2," "-' '	;MAKE INTO ASCII
	BOUT			;OUTPUT THE CHARACTER
	SOJG	T4,SIXWRL	;AND LOOP FOR SIX
	RET			; THEN RETURN
	SUBTTL	PAGE HEADER PRINTING ROUTINE


;TSTPAG	ROUTINE CALLED PRIOR TO OUTPUTTING A LINE.  TESTS LINENO AND
;	PUTS OUT A NEW PAGE HEADER WHEN THE COUNTER EXPIRES.


TSTPAG:	AOSE	LINENO		;HEADER TIME
	 RET			;NOT YET
	AOS	PAGENO		;NEW PAGE
	PRINT.	[BYTE(7) 14,0,0,0,0] ;FORMFEED
	PRINT	<
SWSERR %>
	VERSIO	EVEC+2		;OUTPUT OUR VERSION NUMBER
	PRINT	<	>	;TAB
	MOVE	T1,OJFN		;GET OUTPUT JFN
	SETO	T2,		;-1=NOW
	ODTIM			;DATE AND TIME
	 ERJMP	LOSE
	PRINT	<						   PAGE  >
	DECOUT	PAGENO		;AND FINALLY THE PAGE NUMBER
	PRINT	<

   Date     Time     Type   Name  Fork Job User Program PIs-Active Username

>				;COLUMN HEADER

	MOVNI	T1,PAGSIZ	;RESET COUNTER
	MOVEM	T1,LINENO	; FOR NEXT TIME
	TXO	F,FL%FDO	;FORCE THE DATE ON FIRST LINE
	RET			;AND RETURN
	SUBTTL	SUMMARY PRINTING ROUTINE

;SUMOUT - ROUTINE TO OUTPUT THE SUMMARY LISTING

SUMOUT:	MOVE	T1,OJFN		;LOAD UP THE OUTPUT JFN
	HLRZ	P2,SUMTAB	;GET THE IN-USE COUNT OF THE TABLE
	JUMPE	P2,[WARN	No entries to summarize
		    RET]	; AND RETURN
	MOVNS	P2		;NEGATE COUNT
	HRLZI	P2,0(P2)	; AND PUT IN LH FOR AOBJN COUNTER
	PRINT.	[BYTE(7) 14,0,0,0,0] ;FORMFEED
	PRINT	<

Summary of BUG Occurances at >
	SETOM	T2		;CURRENT TIME
	SETZM	T3		;DEFAULT WAY
	ODTIM			;DO THE DATE TIME
	 ERJMP	LOSE
	PRINT	<

Number  Type  BUG Name  Bug Message

>				;HEADER
	MOVX	T1,GJ%SHT+GJ%OLD ;GET A HANDLE ON BUGSTRINGS FILE
	HRROI	T2,[ASCIZ/SYSTEM:BUGSTRINGS.TXT/]
	GTJFN			;TRY TO GET IT
	 ERJMP [SETZM	T1	;FAILED, TOUGH...
		JRST	.+1]	;CONTINUE IN LINE...
	MOVEM	T1,BUGJFN	;SAVE JFN
	MOVX	T2,7B5+OF%RD	;READ IN ASCII BYTES
	OPENF			;OPEN THE FILE
	 ERJMP [MOVE	T1,BUGJFN ;GET BACK JFN
		SETZM	BUGJFN	;MARK NOT IN USE
		RLJFN		;TRY TO UNLOAD
		 ERJMP	.+1	;IGNORE FAILURE HERE
		JRST	.+1]	;CONTINUE IN LINE...
	;...
SUMOLP:	HRRZ	P3,SUMTAB+1(P2)	;GET THE NEXT TABLE ENTRY RH
	MOVE	T1,OJFN		;LOAD UP OUTPUT JFN
	HRRZ	T2,0(P3)	;GET NUMBER OF OCCURANCES
	DECOUT	T2,5		;OUTPUT FIVE DIGIT DECIMAL OCCURANCE COUNT
	PSPACE	^D2		;...
	HLRZ	T2,0(P3)	;GET BUG TYPE FLAGS
	CAIN	T2,BG%HLT	;HLT?
	 PRINT	<HLT    >	;YES, SAY SO
	CAIN	T2,BG%CHK	;CHK?
	 PRINT	< CHK   >	;YES
	CAIN	T2,BG%INF	;INF?
	 PRINT	<  INF  >	;YES
	HLRO	T2,SUMTAB+1(P2)	;-1,,[ASCIZ/BUGNAME/]
	MOVEI	T3,7		;SIX CHARS MAX
	SETZM	T4		;ASCIZ
	SOUT			;OUTPUT THE STRING
	 ERJMP	LOSE
	MOVEI	P1,3(T3)	;MAKE JUSTIFICATION
	DVCHR			;SEE IF OUTPUT TO TTY
	 ERJMP	LOSE
	MOVE	T1,OJFN		;SETUP JFN AGAIN
	LOAD	T2,DV%TYP,T2	;DEVICE TYPE
	CAIE	T2,.DVTTY	;IF TTY OR
	CAIN	T2,.DVPTY	;PTY THEN
	 SKIPA			;DON'T BKJFN
	BKJFN			;BACK OVER NULL (FOR FILES)
	 ERJMP	.+1		;IGNORE ANY ERROR (LIKE TTYS)
	PSPACE	0(P1)		;AND DO SPACING
	HRRO	T2,SUMTAB+1(P2)	;POINT TOWARDS MESSAGE
	AOS	T2		;WHICH IS ACTUALLY IN NEXT WORD
	SKIPN	0(T2)		;SEE IF ANYTHING THERE
	CALL	GETMSG		;TRY TO GET THE MESSAGE FROM BUGSTRINGS.TXT
	SETZM	T3		;ASCIZ
	SOUT			;OUTPUT THE STRING
	 ERJMP	LOSE
	HRRO	T2,SUMTAB+1(P2)	;POINT TOWARDS MESSAGE FROM SYSERR BLOCK
	SKIPE	1(T2)		;SEE IF ANYTHING THERE
	PRINT	<
>				;END THE LINE IF MESSAGE FROM SYSERR BLOCK
	AOBJN	P2,SUMOLP	; AND LOOP TIL DONE
	MOVE	T1,BUGJFN	;JFN ON FILE
	CLOSF			;GET RID OF IT
	 ERJMP	.+1		;IGNORE ERRORS HERE
	RET			; THEN RETURN

;GETMSG - ATTEMPT TO READ THE BUG MESSAGE FOR THIS BUG FROM BUGSTRINGS.TXT

GETMSG:	SAVEAC	<T1>		;SAVE CALLER'S DESIGNATOR
	SKIPN	T1,BUGJFN	;SEE IF ANY FILE TO USE
	 JRST	NOBGMS		;BIG LOSE MESSAGE
	SETZM	T2		;RESET TO BEGINNING
	SFPTR			;OF BUGSTRINGS FILE
	 ERJMP	NOBGMS		;FLICK IT...

BGMSLP:	MOVE	T1,BUGJFN	;GET JFN AGAIN
	HRROI	T2,BUGBUF	;WHERE TO READ IT
	MOVX	T3,100*5-1	;MAX NUMBER OF BYTES
	MOVX	T4,.CHLFD	;TERMINATE ON LINEFEEDS
	SIN			;READ A LINE
	 ERJMP	NOBGMS		;FLICK IT IF DIDN'T WORK OR EOF...
	SETZM	T1		;GET A NULL
	IDPB	T1,T2		;AND FINISH LINE WITH IT
	HLRO	T1,SUMTAB+1(P2)	;POINT TO BUG NAME
	HRROI	T2,BUGBUF	;POINT TO BUGSTRINGS LINE
	STCMP			;SEE IF STRINGS MATCH
	 ERJMP	NOBGMS		;FLICK IT IF ERRORS...
	TXNN	T1,SC%SUB	;SUBSTRING MATCH?
	 JRST	BGMSLP		;NO, LOOP MORE
	MOVX	T3,7		;YES! NUMBER OF BYTES TO
	ADJBP	T3,T2		;ADJUST BY
	MOVE	T2,T3		;PUT POINTER IN T2
	RET			;AND RETURN


NOBGMS:	HRROI	T2,[ASCIZ/        (No message available for this BUG)
/]
	RET			;RETURN WITH LOSER MESSAGE
	SUBTTL	THE DATA AREA

	XLIST			;DUMP THE LITERALS
	LIT
	LIST

BUGJFN:	BLOCK	1		;JFN ON SYSTEM:BUGSTRINGS.TXT

SAVEP:	BLOCK	1		;STORAGE OF STACK

JFNSTR:	BLOCK	100		;STORAGE FOR INPUT FILENAME
IJFN:	BLOCK	1		;INPUT FILE JFN
PAGENO:	BLOCK	1		;PAGE NUMBER
LINENO:	BLOCK	1		;LINE NUMBER
BGNTIM:	BLOCK	1		;BEGIN TIME
ENDTIM:	BLOCK	1		;END TIME
LSTDAT:	BLOCK	1		;LAST DATE OUTPUT WORD

;ENTRY DATA

HDRADR:	BLOCK	1		;ADDRESS OF CURRENT HEADER WORD
HDRWRD:	BLOCK	1		;CURRENT HEADER WORD
HDRTIM:	BLOCK	1		;DATE-TIME

BUGNAM:	BLOCK	2		;ASCIZ BUG NAME
BUGDAT:	BLOCK	1		;DATE/TIME OF BUG
BUGJOB:	BLOCK	1		;FORK,,JOB
BUGPIS:	BLOCK	1		;CONI PI, WORD FOR PI LEVEL
BUGUSR:	BLOCK	1		;USER NUMBER
BUGPNM:	BLOCK	1		;PROGRAM NAME
BUGFLG:	BLOCK	1		;BUG TYPE FLAG
BUGMSG:	BLOCK	<MSGSIZ==^D80/5> ;SPACE FOR THE BUGSTRING

;STORAGE FOR PARTICULAR NAME TABLES

NAMTAB:	BLOCK	200		;BUG INCLUDE NAME TABLE, WORD 0
				;HAS COUNT, TWO WORD ASCIZ ENTRIES

;TBLUK TABLE FOR SUMMARY STUFF

SUMTAB:	BLOCK	1		;ALLOCATE SPACE
	BLOCK	SUMSIZ		; FOR TABLE OF POINTERS INTO FREE SPACE

;BUFFER FOR READING BUGSTRINGS.TXT

BUGBUF:	BLOCK	100		;LINE BUFFER

;FREE POOL FOR STRING STORAGE

FREPTR:	BLOCK	1		;FREE POINTER
POOL:	BLOCK	2000		;SOME FREE SPACE

	END	<3,,EVEC>