Google
 

Trailing-Edge - PDP-10 Archives - BB-LW55A-BM_1988 - galaxy-sources/batlog.mac
There are 30 other files named batlog.mac in the archive. Click here to see a list.
	TITLE	BATLOG	--	BATCH CONTROLLER LOG FILE HANDLER
	SUBTTL	Preliminaries

;	COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1975, 1988.
;	ALL RIGHTS RESERVED.
;
;	THIS SOFTWARE IS FURNISHED UNDER A  LICENSE AND MAY BE USED AND  COPIED
;	ONLY IN  ACCORDANCE  WITH  THE  TERMS OF  SUCH  LICENSE  AND  WITH  THE
;	INCLUSION OF THE ABOVE  COPYRIGHT NOTICE.  THIS  SOFTWARE OR ANY  OTHER
;	COPIES THEREOF MAY NOT BE PROVIDED  OR OTHERWISE MADE AVAILABLE TO  ANY
;	OTHER PERSON.  NO  TITLE TO  AND OWNERSHIP  OF THE  SOFTWARE IS  HEREBY
;	TRANSFERRED.
;
;	THE INFORMATION IN THIS  SOFTWARE IS SUBJECT  TO CHANGE WITHOUT  NOTICE
;	AND SHOULD  NOT  BE CONSTRUED  AS  A COMMITMENT  BY  DIGITAL  EQUIPMENT
;	CORPORATION.
;
;	DIGITAL ASSUMES NO  RESPONSIBILITY FOR  THE USE OR  RELIABILITY OF  ITS
;	SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.

	SEARCH	GLXMAC		;GET GALAXY SYMBOLS
	PROLOG(BATLOG)

	SEARCH	QSRMAC		;GET QUASAR SYMBOLS
	SEARCH	BATMAC		;GET BATCON SYMBOLS
	SEARCH	ORNMAC		;GET ORION SYMBOLS

	BMLMAN==:0		;Maintenance edit number
	BMLDEV==:42		;Development edit number
	VERSIN (BML)		;Generate edit number

	BMLWHO==0
	BMLVER==6
	BMLMIN==0

	;THE FOLLOWING ARE DEFINED EXTERNAL

	EXTERNAL ATOKJB		;JOB LOGOUT CODE
	EXTERNAL CURTIM		;CURRENT TIME AS TEXT STRING
	EXTERNAL CLOS.1		;CLOSE OUT JOB ROUTINE
	EXTERNAL JOBTOT		;TOTAL NUMBE OF JOBS PROCESSED TO DATE
	EXTERNAL JIBTXT		;JOB INFO BLOCK ITEXT
	Subttl	Table of Contents

;		     Table of Contents for BATLOG
;
;				  Section		      Page
;
;
;    1. Revision History . . . . . . . . . . . . . . . . . . .   3
;    2. L$INIT - LOG FILE INITIALIZATION AND SETUP . . . . . .   4
;    3. L$OUTP - LOG FILE PAGE OUTPUT ROUTINE  . . . . . . . .   5
;    4. L$OUT1 - OUTPUT CHARACTER IN S1 TO LOG . . . . . . . .   6
;    5. L$OPEN - LOG FILE OPEN ROUTINE . . . . . . . . . . . .   7
;    6. L$OPNE - LOG FILE OPEN ERROR ROUTINE . . . . . . . . .   8
;    7. L$IOER - LOG FILE I/O ERROR ROUTINE  . . . . . . . . .   9
;    8. L$NAME - GENERATE NEW LOG FILE NAME  . . . . . . . . .  10
;    9. L$PLOG - PUT A CHARACTER IN LOG WITH FORMATTING  . . .  11
;   10. L$TIME - LOG THE TIME ROUTINE  . . . . . . . . . . . .  12
;   11. L$IDEN - LOG THE LINE IDENTIFIER . . . . . . . . . . .  13
;   12. L$BLNK - LOG A BLANK LINE  . . . . . . . . . . . . . .  14
;   13. L$SIXU - LOG SIXBIT FROM LUUO  . . . . . . . . . . . .  15
;   14. L$LCMA - LOG A COMMA . . . . . . . . . . . . . . . . .  16
;   15. L$CMNT - LOG A COMMENT TO THE LOG FILE . . . . . . . .  17
;   16. L$CHKP - CHECKPOINT THE LOG FILE ROUTINE . . . . . . .  18
;   17. L$LSTP - LOG THE TIME STAMP AND TYPE . . . . . . . . .  19
;   18. PRVOFF - TURN PRIVILEGES OFF FOR QUOTA ENFORCEMENT . .  20
	SUBTTL	Revision History

COMMENT \

*****	Release 4.2 -- begin maintenance edits	*****

EDIT    0		26-January-84
		Currently no edits

*****	Release 5.0 -- begin development edits	*****

EDIT   10	5.1073  27-Jan-84
		Move to new development area. Add version vector. Clean
		up edit organization. Update TOC.

EDIT   11	5.1168	17-Oct-84
		When logging tabs, carriage returns and line feeds to the log
		file do not check for a	generated control character. 

*****	Release 5.0 -- begin maintenance edits	*****

20	Increment maintenance edit level for version 5 of GALAXY.

*****	Release 6.0 -- begin development edits	*****

40	6.1037		26-Oct-87
	Move sources from G5: to G6:

41	6.1057		4-Nov-87
	Change PS: to BS: and PS:[SPOOL] to SPOOL: for Non PS: login feature.

42	6.1225		8-Mar-88
	Update copyright notice.

\	;End of Revision History
	SUBTTL	L$INIT - LOG FILE INITIALIZATION AND SETUP

	;THIS ROUTINE WILL SETUP A PAGE FOR LOG FILE OUTPUT THAT WILL
	;GET OUTPUT TO THE LOG FILE

L$INIT:: $CALL	M%GPAG			;GET THE PAGE
	MOVEM	S1,.JLPAG(R)		;SAVE THE PAGE ADDRESS
	MOVEI	S2,<1000*5>-2		;SETUP FIRST TIME COUNT
	SKIPA				;SKIP OVER NORMAL SETTING
L$SETO:: MOVEI	S2,<1000*5>		;GET NUMBER OF BYTES
	MOVE	S1,.JLPAG(R)		;GET PAGE ADDRESS
	MOVEM	S2,.JLPCT(R)		;SAVE THE COUNT
	MOVSI	S2,(POINT 7,0)		;SETUP BYTE POINTER
	TRNN	F,FR.LFO		;WAS LOG FILE OPEN YET?
	MOVSI	S2,(POINT 7,0,13)	;NO..SKIP FIRST TWO BYTES
	HRR	S2,S1			;PUT ADDRESS IN POINTER
	MOVEM	S2,.JLPTR(R)		;SAVE THE POINTER
	POPJ	P,			;RETURN
	SUBTTL	L$OUTP - LOG FILE PAGE OUTPUT ROUTINE

	;THIS ROUTINE WILL DUMP THE LOG FILE PAGE TO THE FILE AND
	;RESET ALL THE DATA POINTERS

L$OUTP:: TRNE	F,FR.LFO		;IS LOG FILE OPEN YET
	PJRST	OUTP.1			;YES..JUST DUMP THE BUFFER
	PUSHJ	P,L$OPEN		;OPEN THE LOG FILE
	MOVE	S1,.JLJFN(R)		;GET LOG FILE IFN
	MOVEI	S2,FI.SIZ		;GET FILE SIZE
	$CALL	F%INFO			;GET SIZE FROM FILE
	MOVSI	S2,(POINT 7,0)		;MAKE A POINTER
	HRR	S2,.JLPAG(R)		;PUT PAGE ADDRESS IN POINTER
	JUMPE	S1,OUTP.0		;NONE..PROCESS AS  NEW FILE
	MOVEI	S1,CHR.CR		;GET CARRIAGE RETURN
	IDPB	S1,S2			;SAVE THE BYTE
	MOVEI	S1,CHR.FF		;SET UP FORM FEED
	IDPB	S1,S2			;SAVE THE BYTE
	JRST	OUTP.1			;CONTINUE..OUTPUT THE PAGE
OUTP.0:	MOVEI	S1,CHR.CR		;SETUP CARRIAGE RETURN
	IDPB	S1,S2			;SAVE THE BYTE
	MOVEI	S1,CHR.LF		;SETUP LINE FEED
	IDPB	S1,S2			;SAVE THE BYTE
OUTP.1:	TLNE	R,RL.NLG		;LOG FILE AVAILABLE
	PJRST	L$SETO			;SETUP OUTPUT PAGE
IFN	FTJSYS,<
	MOVE	S1,.JQJBB+JIB.SQ(R)	;GET SUBMITTERS ACTIVE PRIVS.
	TXNN	S1,EQ.PRV		;SKIP IF HE WAS ENABLED
	PUSHJ	P,PRVOFF		;TURN OFF PRIVILEGES
>;END FTJSYS
	MOVE	S2,.JLPAG(R)		;GET PAGE ADDRESS IN S2
	MOVEI	S1,<1000*5>		;GET MAX COUNT
	SUB	S1,.JLPCT(R)		;SUBTRACT COUNT REMAINING
	CAILE	S1,<1000*5>		;CHECK IF WITHIN PAGE
	MOVEI	S1,<1000*5>		;MAKE IT 5000
	HRL	S2,S1			;PLACE COUNT IN LEFT HALF
	MOVE	S1,.JLJFN(R)		;GET THE IFN
	$CALL	F%OBUF			;DUMP THE BUFFER
IFN	FTJSYS,<
	PUSH	P,TF			;REMEMBER TRUTH VALUE
	PUSHJ	P,PRVON			;TURN PRIVILEGES BACK ON
	POP	P,TF			;RESTORE TRUTH VALUE
>;END FTJSYS
	SKIPF				;SKIP IF ERROR
	PJRST	L$SETO			;SETUP PAGE AND RETURN
OUTP.E:	$WTO	(<Batch Log File Error>,<^I/JIBTXT/^I/LOGERR/>,.JQOBJ(R),<$WTNOD(.JQLOC(R))>)
	TLO	R,RL.NLG		;NO LOG FILE AVAILABLE
	TLZ	R,RL.OPR!RL.DIA		;CLEAR SOME POSSIBLE FLAGS
	PUSHJ	P,L$IOER		;LOG FILE I/O ERROR
	$RETF				;RETURN FALSE
	SUBTTL	L$OUT1 - OUTPUT CHARACTER IN S1 TO LOG
	SUBTTL	L$OUTC - OUTPUT CHARACTER INTO BUFFER

	;THIS ROUTINE WILL PLACE A CHARACTER IN THE BUFFER FOR OUTPUT
	;AND ADJUST THE COUNTS
	;
	;CALL	:	CH/	CHARACTER TO OUTPUT
	;
L$OUT1:: MOVE	CH,S1			;PLACE CHARACTER IN CH

L$OUTC:: SOSGE	.JLPCT(R)		;DECREMENT COUNT SKIP IF ROOM
	  JRST	OUTC.1			;NO ROOM..DUMP BUFFER AND CONTINUE
	IDPB	CH,.JLPTR(R)		;DEPOSIT THE BYTE
	$RETT				;RETURN
OUTC.1:	PUSHJ	P,L$OUTP		;OUTPUT THE PAGE
	PJRST	L$OUTC			;PUT OUT THE CHARACTER
	SUBTTL	L$OPEN - LOG FILE OPEN ROUTINE

	;THIS ROUTINE WILL OPEN UP THE LOG FILE FOR THE STREAM
	;AND IF THERE IS AN ERROR ATTEMPT TO OPEN A TEMPORARY LOG FILE
	;TO BE PRINTED INDICATING THE ERROR TO THE USER



L$OPEN:: MOVEI	S1,.JQLFD(R)		;LOG FILE FD
	MOVEM	S1,FOB.FD+.JLFOB(R)	;SAVE IN FILE OPEN BLOCK
	MOVEI	S1,7			;7 BIT BYTES
	MOVEM	S1,FOB.CW+.JLFOB(R)	;SAVE CONTROL WORD
	MOVE	S1,.JQLFP(R)		;GET FP PARAMETERS
	TXNN	S1,FP.SPL		;SPOOL BIT ON
	JRST	OPEN.1			;NO..DO IN BEHALF
	MOVEI	S1,FOB.MZ		;SHORT BLOCK SIZE
	JRST	OPEN.2			;CONTINUE LOG FILE OPEN
OPEN.1:
IFN	FTUUOS,<
	MOVE	S1,.JQPPN(R)		;GET USERS PPN IN BEHALF
	MOVEI	S2,0			;0 FOR CONSISTENCY
>;END FTUUOS
IFN	FTJSYS,<
	HRROI	S1,.JQNAM(R)		;USERS NAME
	HRROI	S2,.JQCON(R)		;CONNECTED DIRECTORY
>;END FTJSYS
	MOVEM	S1,FOB.US+.JLFOB(R)	;SAVE USER FIELD
	MOVEM	S2,FOB.CD+.JLFOB(R)	;SAVE CONNECTED DIRECTORY(-20)
	MOVEI	S1,FOB.SZ		;GET FILE OPEN BLOCK SIZE
	MOVX	T1,EQ.PRV		;GET PRIVILEGE FLAG
	TDNE	T1,.JQJBB+JIB.SQ(R)	;WAS IT SET?
	MOVEI	S1,FOB.MZ		;USE MINIMUM SIZE
OPEN.2:	MOVEI	S2,.JLFOB(R)		;ADDRESS OF BLOCK
	SKIPE	T1,.JCHRQ(R)		;SEEN BEFORE?
	JRST	OPEN.3			;YES..OPEN WITH APPEND
	GETLIM	T1,.JQLIM(R),BLOG	;GET BATCH LOG FILE DATA
	CAIN	T1,%BSCDE		;WAS IT SUPERCEDE
	JRST	OPEN.5			;DO SUPERCEDE OPEN
OPEN.3:	$CALL	F%AOPN			;OPEN THE FILE
OPEN.4:	JUMPF	L$OPNE			;LOG FILE ERROR
	MOVEM	S1,.JLJFN(R)		;SAVE IFN FOR LOG FILE
	TRO	F,FR.LFO		;LOG FILE NOW OPEN
IFN	FTJSYS,<
	MOVX	S2,FI.CHN		;GET THE JFN
	PUSHJ	P,F%INFO		;GET THE VALUE
	HRROI	S2,.JQACT(R)		;GET THE ACCOUNT STRING
	SACTF				;SET THE ACCOUNT FOR USER
	   JFCL				;IGNORE ANY ERRORS FOR NOW ***
>;END FTJSYS
	POPJ	P,			;RETURN
OPEN.5:	$CALL	F%OOPN			;DO SUPERCEDE OPEN
	JRST	OPEN.4			;CHECK THE RETURNS
	SUBTTL	L$OPNE - LOG FILE OPEN ERROR ROUTINE

	;THIS ROUTINE WILL PROCESS LOG FILE OPEN ERRORS

L$OPNE:: TROE	F,FR.LFE		;LOG FILE ERROR OCCUR YET
	JRST	OPNE.1			;YES,,EXIT NOW
	$WTO	(<Batch Log File Open Error>,<^I/JIBTXT/^I/LOGERR/
A Temporary Log File will be Created, Printed, and Deleted 
for This User. The Job will be Canceled.>,.JQOBJ(R),<$WTNOD(.JQLOC(R))>)
	MOVX	S1,E.LFOE		;LOG FILE OPEN ERROR
	MOVEM	S1,.JERRO(R)		;SAVE ERROR CODE
	TLO	F,FL.ERR		;ERROR BIT SET
	PUSHJ	P,L$CMNT		;LOG A COMMENT LINE
	$TEXT	(L$OUT1,<?  -- Batch Log File Open Error --
		^I/LOGERR/>)
	PUSHJ	P,L$NAME		;FIND LOG NAME...NEW NAME
	JUMPF	OPNE.1			;ERROR IN SPOOL OR 3,3..EXIT
	MOVX	S1,<FP.DEL!FP.SPL>	;GET DELETE BIT AND SPOOL BIT
	IORM	S1,.JQLFP(R)		;SAVE IN FILE FP
	PUSHJ	P,L$OPEN		;TRY TO OPEN FILE
	PUSHJ	P,L$OUTP		;DUMP THE CURRENT DATA
	$TEXT	(L$OUT1,<		A Temporary Log File ^F/.JQLFD(R)/
		Will be Created Printed and Deleted.>)
	PUSHJ	P,L$BLK1		;END AND ADD BLANK LINE
	TLZ	R,RL.OPR!RL.DIA		;CLEAR SOME POSSIBLE FLAGS
	PUSHJ	P,ATOKJB		;LOG OUT THE JOB****
	MOVEI	S1,%EQOLG		;OUTPUT LOG FILE
	STOLIM	S1,.JQLIM(R),OUTP	;RESET THE VALUE
	PJRST	CLOS.1			;AND DISMISS IT
OPNE.1:	$WTO	(<Batch Log File Error>,<^I/JIBTXT/^I/FNDLMS/>,.JQOBJ(R),<$WTNOD(.JQLOC(R))>)
OPNE.2:	TLZ	R,RL.OPR!RL.DIA		;CLEAR SOME POSSIBLE FLAGS
	PUSHJ	P,L$IOER		;LOG FILE I/O ERROR
	PUSHJ	P,ATOKJB		;LOG OUT THE JOB****
	PJRST	CLOS.1			;KILL THE JOB



FNDLMS:	ITEXT	(<Log Error Recovery Failed
^I/LOGERR/
--	 JOB CANCELED	-->)
LOGERR:: ITEXT	(<^E/[-1]/ FOR ^F/.JQLFD(R)/>)

IFN	FTJSYS,<
BATNAM:	ASCIZ /SPOOL:BATERR/		;[41]
>;END FTJSYS
	SUBTTL	L$IOER - LOG FILE I/O ERROR ROUTINE

	;THIS ROUTINE WILL SETUP ERROR CODE FOR USER AND OPERATOR

L$IOER:: MOVX	S1,E.LFIO		;SET LOG FILE I/O ERROR
	MOVEM	S1,.JERRO(R)		;SAVE THE CODE FOR END MESSAGE
	TLO	F,FL.ERR		;MARK ERROR CODE SET
	PUSHJ	P,L$CMNT		;LOG THE COMMENT LINE
	$TEXT	(L$OUT1,<? -- Batch Log File I/O Error --
		^I/LOGERR/>)
	PUSHJ	P,L$BLK1		;LOG A BLANK LINE
	POPJ	P,			;RETURN
	SUBTTL	L$NAME - GENERATE NEW LOG FILE NAME

	;THIS ROUTINE WILL GENERATE A LOG FILE NAME IN THE
	;SPOOL AREA FOR THE SYSTEM

IFN	FTUUOS,<
L$NAME:	MOVX	S1,FSSSTR		;GET STRUCTURE NAME OF SPOOL AREA
	MOVEM	S1,.JQLFD+.FDSTR(R)	;SAVE IN STRUCTURE WORD
	MOVX	S1,%LDQUE		;GET PPN OF SPOOL AREA
	GETTAB	S1,			;OBTAIN VALUE
	  JRST	.RETF			;BAD RETURN EXIT
	MOVEM	S1,.JQLFD+.FDPPN(R)	;SAVE PPN OF AREA
	MOVE	S1,[POINT 6,.JQLFD+.FDNAM(R)];NAME POINTER
	MOVEM	S1,.JQBYT(R)		;SAVE BYTE POINTER
	$CALL	I%NOW			;GET CURRENT TIME
	$TEXT	(FILNAM,<B^D4R0/S1,FILEMK/^D1R0/.JQSTR(R)/LOG^A>)
	MOVX	S1,FDMSIZ		;GET MINIMUM SIZE FD(NO PATH)
	STORE	S1,.JQLFD+.FDLEN(R),FD.LEN ;SAVE NEW LENGTH
	SETZM	.JQLFD+.FDPAT(R)	;CLEAR FIRST WORD OF SFD TO BE SAFE
	$RETT				;GIVE GOOD RETURN
>;END FTUUOS
IFN	FTJSYS,<
L$NAME:	HRLI	S2,(POINT 7,0)		;MAKE A BYTE POINTER
	HRRI	S2,.JQLFD+1(R)		;GET THE START OF FD
	MOVEM	S2,.JQBYT(R)		;SAVE BYTE POINTER
	$CALL	I%NOW			;GET THE TIME
	$TEXT	(FILNAM,<^T/BATNAM/-^D/JOBTOT/-^D6R0/S1,FILEMK/.LOG^0>)
	HRRZ	S1,.JQBYT(R)		;GET ENDING POINTER
	SUBI	S1,.JQLFD-1(R)		;GET THE LENGTH
	STORE	S1,.JQLFD(R),FD.LEN	;SAVE THE NEW COUNT
	$RETT				;GIVE GOOD RETURN
>;END FTJSYS


FILNAM:	
IFN	FTUUOS,<
	SUBI	S1,40		;CONVERT TO 6 BIT
	ANDI	S1,77		;ONLY WANT TO DIGITS
>;END FTUUOS
	IDPB	S1,.JQBYT(R)	;STORE THE BYTE
	$RETT			;RETURN
	SUBTTL	L$PLOG - PUT A CHARACTER IN LOG WITH FORMATTING

	;THIS ROUTINE WILL ANALYZE THE CHARACTER AND CONVERT CONTROL
	;CHARACTERS AND INSERT APPROPRIATE TABS


L$PLOG:: CAIL	CH,40		;IS THIS A CONTROL CHARACTER
	  JRST	PLOG.1		;NO, OUTPUT AS IS
	TLNE	F,FL.XCC	;IS THIS A GENERATED CTRL CHARACTER?
	  JRST	PLOG.0		;YES, OUTPUT AS ^CHAR
	CAILE	CH,CHR.CR	;HT, LF, VT, FF, AND CR ARE OK
	  JRST	PLOG.0		;ABOVE CR SHOWS AS ^CHAR
	CAIL	CH,CHR.HT	;BELOW HT SHOWS AS ^CHAR
	  JRST	PLOG.1		;SEND HT THRU CR IN IMAGE MODE
PLOG.0:	HRLM	CH,(P)		;SAVE THE ORIGINAL
	MOVEI	CH,"^"		;GET AN UPARROW
	PUSHJ	P,PLOG.1	;OUTPUT IT
	HLRZ	CH,(P)		;GET THE ORIGINAL
	MOVEI	CH,100(CH)	;MAKE THE APPROPRIATE CHARACTER
	PUSHJ	P,PLOG.1	;AND OUTPUT IT
	HLRZ	CH,(P)		;GET THE ORIGINAL AGAIN FOR THE CALLER
	POPJ	P,		;AND RETURN
PLOG.1:	TLZN	F,FL.CRS	;WAS LAST CHARACTER A CARRIAGE RETURN
	  JRST	PLOG.2		;NO, JUST OUTPUT IT
	CAIG	CH,CHR.FF	;CHECK FOR CR NOT FOLLOWED BY VERTICAL MOTION
	CAIGE	CH,CHR.LF	;SAME CHECK AS BELOW FOR TIME STAMP
	  SKIPA			;NOT VERTICAL MOTION, OUTPUT 2 TABS
	JRST	PLOG.2		;OUTPUT THE MOTION CHARACTER
	HRLM	CH,(P)		;SAVE THE CHARACTER ON THE STACK
	PUSHJ	P,L$2TAB	;OUTPUT 2 TABS
	HLRZ	CH,(P)		;RESTORE THE CHARACTER AND OUTPUT IT
PLOG.2:	SKIPE	.JRTIM(R)	;NEED A TIME STAMP
	  PUSHJ	P,L$LSTP	;YES, DO IT
PLOG.3:	CAIN	CH,CHR.CR	;IS THIS A CARRAIGE RETURN
	  TLO	F,FL.CRS	;YES, MARK IT FOR OVERPRINTING CHECK
	PUSHJ	P,L$OUTC	;OUTPUT THE CHARACTER
	CAIG	CH,CHR.FF	;CHECK IF IT WAS VERTICAL PAPER MOTION
	CAIGE	CH,CHR.LF	;THOSE CAUSE A TIME STAMP
	  $RETT			;NO MOTION..RETURN
	SETOM	.JRTIM(R)	;YES,NEXT LINE NEEDS A TIME STAMP
	$RETT			;RETURN TRUE
	SUBTTL	L$TIME - LOG THE TIME ROUTINE

	;THIS ROUTINE WILL PUT TIME STAMP IN THE LOG

L$TIME:: SETZM	.JRTIM(R)		;CLEAR THE TIME-STAMP NEEDED FLAG
	MOVSI	T1,(POINT 7,0)		;MAKE A BYTE POINTER
	HRRI	T1,CURTIM		;GET THE CURRENT TIME
TIME.1:	ILDB	CH,T1			;GET A BYTE
	JUMPE	CH,.POPJ		;NULL..RETURN
	PUSHJ	P,L$OUTC		;OUTPUT THE CHARACTER TO LOG
	JRST	TIME.1			;FINISH THE TIME STAMP
	SUBTTL	L$IDEN - LOG THE LINE IDENTIFIER
	SUBTTL	L$TXTL - LOG TEXT FROM LUUO CALL
	SUBTTL	L$LSTG - LOG THE STRING IN LOG FILE

	;THESE ROUTINES WILL PUT A STRING IN THE LOG FILE

L$IDEN:: SKIPN	.JRTIM(R)		;NEED TO END THE PREVIOUS LINE?
	    PUSHJ P,L$CRLF		;LOG A CRLF TO LOG
	PUSHJ	P,L$TIME		;LOG THE TIME
L$TXTL:: HRR	T1,.JBUUO##		;SETUP FOR UUO
L$LSTG:	HRLI	T1,(POINT 7,0)		;SETUP THE POINTER
LSTG.1:	ILDB	CH,T1			;GET A BYTE
	JUMPE	CH,.POPJ		;ZERO..RETURN
	PUSHJ	P,L$OUTC		;OUTPUT THE BYTE
	JRST	LSTG.1			;GET NEXT BYTE
	SUBTTL	L$BLNK - LOG A BLANK LINE
	SUBTTL	L$BLK1 - LOG A BLANK LINE WITHOUT CRLF
	SUBTTL	L$CRLF - LOG A CARRIAGE RETURN AND LINE-FEED
	SUBTTL	L$CRL2 - LOG A CRLF AND ADD ANOTHER WITHOUT STAMP



L$BLNK:: SKIPN	.JRTIM(R)	;NEED TO END THE PREVIOUS LINE?
L$CRL2::   PUSHJ P,L$CRLF	;OUTPUT A CR-LF
L$BLK1:: SETZM	.JRTIM(R)	;CLEAR FLAG TO ADD ANOTHER ONE
L$CRLF:: MOVEI	CH,CHR.CR	;THE CARRIAGE RETURN
	PUSHJ	P,PLOG.1	;OUTPUT IT
	MOVEI	CH,CHR.LF	;AND THE LINE FEED
	PJRST	PLOG.1		;AND EXIT THROUGH PUTLOG
	SUBTTL	L$SIXU - LOG SIXBIT FROM LUUO
	SUBTTL	L$LSIX - LOG SIXBIT ROUTINE

	;THIS ROUTINE WILL OUTPUT SIXBIT TO THE LOG FILE

L$SIXU:: MOVE	T1,@.JBUUO##	;SET UP FROM UUO ENTRY
L$LSIX:: MOVE	T2,[POINT 6,T1]	;GET BYTE POINTER
LSIX.1:	ILDB	CH,T2		;GET THE BYTE
	JUMPE	CH,.POPJ	;NULL..RETURN
	MOVEI	CH," "(CH)	;MAKE ASCII
	PUSHJ	P,L$OUTC	;OUTPUT THE CHARACTER
	TLNN	T2,770000	;GOT IT ALL?
	  POPJ	P,		;YES,,RETURN
	JRST	LSIX.1		;GET THE NEXT
	SUBTTL	L$LCMA - LOG A COMMA
	SUBTTL	L$LCOL - LOG A COLON



L$LCMA:: SKIPA	CH,[","]	;A COMMA
L$LCOL:: MOVEI	CH,":"		;A COLON
	JRST	L$OUTC		;OUTPUT THE CHARACTERS
	SUBTTL	L$CMNT - LOG A COMMENT TO THE LOG FILE
	SUBTTL	L$2TAB - LOG 2 TABS TO LOG FILE
	SUBTTL	L$LTAB - LOG A TAB TO LOG FILE
	SUBTTL	L$LPER - LOG A PERIOD TO LOG FILE

	;THIS ROUTINE WILL LOG A COMMENT INTO THE LOG FILE


L$CMNT:: SKIPN	.JRTIM(R)	;NEED TO END THE PREVIOUS LINE
	  PUSHJ	P,L$CRLF	;YES, DO IT
	SETZM	.JRTIM(R)	;NO TIME STAMP NEEDED
L$2TAB:: PUSHJ	P,L$LTAB	;OUTPUT A TAB
L$LTAB:: SKIPA	CH,[CHR.HT]	;AND ANOTHER ONE
L$LPER:: MOVEI	CH,MONCHR	;A PERIOD (OR SOMETHING LIKE THAT)
	JRST	PLOG.1		;OUTPUT THE PERIOD
	SUBTTL	L$CHKP - CHECKPOINT THE LOG FILE ROUTINE

	;THIS ROUTINE WILL DUMP THE LOG FILE AND THEN CHECKPOINT IT
	;ON ERROR WILL ABORT THE USER


L$CHKP:: TRNN	F,FR.LFO		;IS LOG FILE OPEN
	PUSHJ	P,L$OPEN		;GO OPEN LOG FILE
	PUSHJ	P,L$OUTP		;DUMP THE DATA
	JUMPF	.POPJ			;ERROR...RETURN
IFN	FTJSYS,<
	MOVE	S1,.JQJBB+JIB.SQ(R)	;GET SUBMITTERS ACTIVE PRIVS.
	TXNN	S1,EQ.PRV		;SKIP IF HE WAS ENABLED
	PUSHJ	P,PRVOFF		;TURN OFF PRIVILEGES
>;END FTJSYS
	MOVE	S1,.JLJFN(R)		;IFN FOR FILE
	$CALL	F%CHKP			;CHECKPOINT THE FILE
IFN	FTJSYS,<
	PUSH	P,TF			;REMEMBER TRUTH VALUE
	PUSHJ	P,PRVON			;TURN PRIVILEGES BACK ON
	POP	P,TF			;RESTORE TRUTH VALUE
>;END FTJSYS
	JUMPF	CHKP.1			;ABORT TRANSACTION
	MOVEM	S1,.JLUSI(R)		;LOG FILE POINTER
	POPJ	P,			;RETURN
CHKP.1:	$WTO	(<Batch Log Error>,<^I/JIBTXT/^I/LOGERR/
JOB BEING CANCELED>,.JQOBJ(R),<$WTNOD(.JQLOC(R))>)
	TLO	R,RL.NLG		;NO LOG AVAILABLE
	PUSHJ	P,L$IOER		;LOG THE I/O ERROR
	$RETF				;RETURN FALSE
	SUBTTL	L$LSTP - LOG THE TIME STAMP AND TYPE

L$LSTP:: PUSH	P,CH		;SAVE THE CHARACTER
	PUSHJ	P,L$TIME	;PUT TIME STAMP IN LOG FILE
	MOVEI	T1,[ASCIZ/ MONTR	/]
	TLNN	J,JL.UML	;WAS JOB AT MONITOR LEVEL
	  MOVEI	T1,[ASCIZ/ USER	/] ;NO, SAY USER MODE
	PUSHJ	P,L$LSTG	;LOG THE STRING
	POP	P,CH		;RESTORE CH
	POPJ	P,		;RETURN
	SUBTTL	PRVOFF - TURN PRIVILEGES OFF FOR QUOTA ENFORCEMENT

	;THIS ROUTINE WILL DISABLE WHEEL AND/OR OPERATOR PRIVILEGES SO
	;THAT DIRECTORY QUOTA CHECKING WILL BE ENFORCED ON SUBSEQUENT
	;WRITES.  (TOPS-20 ONLY).  TOH, 4-APR-80

IFN	FTJSYS,<
PRVOFF:	PUSH	P,T1			;SAVE BYTE POINTER
	$CALL	I%IOFF			;TURN OFF INTERRUPTS
	MOVEI	S1,.FHSLF		;GET PROCESS HANDLE
	RPCAP				;READ OUR CAPABILITIES
	ERJMP	[$STOP (CRC,Couldn't Read/set Capabilities)] 
	TXZ	T1,SC%WHL!SC%OPR	;TURN OFF WHEEL AND OPERATOR
	EPCAP				;AND ENABLE EVERYTHING BUT
	ERCAL	S..CRC			;HANDLE ERROR
	POP	P,T1			;RESTORE BYTE POINTER
	POPJ	P,			;RETURN TO CALLER
>;END FTJSYS


	SUBTTL	PRVON - TURN PRIVILEGES BACK ON

	;THIS ROUTINE WILL RE-ENABLE WHEEL AND/OR OPERATOR PRIVILEGES
	;(TOPS-20 ONLY).  TOH, 4-APR-80

IFN	FTJSYS,<
PRVON:	PUSH	P,T1			;SAVE BYTE POINTER
	MOVEI	S1,.FHSLF		;GET PROCESS HANDLE
	RPCAP				;READ OUR CAPABILITIES
	ERCAL	S..CRC			;HANDLE ERROR
	TXO	T1,SC%WHL!SC%OPR	;TURN ON WHEEL AND OPERATOR
	EPCAP				;ENABLE THESE CAPABILITIES
	ERCAL	S..CRC			;HANDLE ERROR
	$CALL	I%ION			;TURN INTERRUPTS BACK ON
	POP	P,T1			;RESTORE BYTE POINTER
	POPJ P,				;RETURN TO CALLER
>;END FTJSYS
	END