;MSC:<BUDNE.HACKS>COUNT.MAC.107 25-Jun-84 LQ+4D.18H.13M.48S., by BUDNE
; PUT INPUT BUFFER AT 400K
;MSC:<BUDNE.HACKS>COUNT.MAC.104 29-May-84 LQ+6D.18H.9M.45S., by BUDNE
; LIST DISK PAGES (INSTEAD OF BLOCKS), HACK ^H
;MSC:<BUDNE.HACKS>COUNT.MAC.93 28-May-84 LQ+6D.17H.33M.54S., by BUDNE
; STAND ALONE; REQUIRES NO FORTRAN OUTPUT ROUTINE

	TITLE	COUNT	Hack Page Density
	SEARCH	MACSYM, MONSYM, CMD ;Sorry Charlie
	.REQUI	SYS:CMD, SYS:MACREL
	SALL

; WHAT ABOUT ^K ^S, /FORTRAN? JCL??
	;Stolen from PR
	;version 3, file name,ext,structures.
	;written by Charles R. Colbert,1979

	TAB=="I"-100
	LF=="J"-100
	FF=="L"-100
	CR=="M"-100
	BS=="H"-100

	PSIZE==^D66		;PHYSICAL LINES ON A PAGE
	WIDTH==^D132		;COMUMNS ON A PAGE
	TXTSIZ==PSIZE-4		;PRINTED LINES ON A PAGE

	T1==1
	T2==2
	T3==3

	P1==7

	CNT==11
	P==17

FTSIN==1			;== 0 FOR BIN, <> 0 FOR SIN
IBUFSZ==5*340K			;SIZE OF INPUT BUFFER
IBUF=400K			;ADDRESS FOR INPUT BUFFER
LPDL==50

BEGIN:	JFCL
	RESET
	MOVE	P, [-LPDL,,PDL-1]
	TMSG	<COUNT -- Count pages in a file
>

	SETZM	PAGCNT
	SETZM	CHRCNT
	SETZM	LINCNT

CONT:	CALL	CMDINI		;< HERE ON @CONTINUE
	PROMPT	(->)		;EMIT PROMPT
	SETZM	SEPARF		;NO-SEP
	SETZM	NOECHF		;ECHO

	MOVSI	T1, (GJ%OLD!GJ%IFG) ;ALLOW WILDS, OLD FILES
	HLLM	T1, CJFNBK+.GJGEN

	HRROI	T1, [ASCIZ 'LST']
	MOVEM	T1, CJFNBK+.GJEXT

	MOVEI	T1, [	FLDDB. .CMFIL,,,,,[ ;READ FILESPEC
			FLDDB. .CMIFI,CM%SDH ] ] ;TRY AGAIN
	CALL	RFIELD
	MOVEM	T2, IJFN

DOSWIT:	MOVEI	T1, [	FLDDB. .CMSWI,,SWITAB,,,[
			FLDDB. .CMCFM ] ]
	CALL	RFIELD
	TSZ	T3, T3		;FIRST?
	JUMPN	T3, SWDONE	;SECOND
	HRRZ	T2, (T2)	;GET SWITCH DATA
	SETOM	(T2)		;SET THE FLAG
	JRST	DOSWIT

SWDONE:
DOFILE:	SETZM	CHRLIN
	HRRZ	T1, IJFN
	MOVE	T2, [FLD(7,OF%BSZ)!OF%RD] ;Read, Byte size of 7
	OPENF
	 ERJMP	DONEXT		;CANNOT OPEN FILE..
	SETZM	ICNT		;ZERO BYTES AVAIL.

	SETZ	CNT,
	CALL	LOOP		;PROCESS THIS FILE

	HRRZ	T1, IJFN	;JUST JFN
	TLO	T1, (CO%NRJ)	;DO NOT RELEASE
	CLOSF			;CLOSE THE JFN
	 TRN			;??

DONEXT:	MOVE	T1, IJFN	;JFN + FLAGS
	TLNN	T1, (GJ%DEV!GJ%DIR!GJ%NAM!GJ%EXT!GJ%VER) ;WILD?
	 JRST	DONE		;NOPE, WE'RE DONE

	SKIPN	SEPARF		;DO EACH FILE SEPARATE??
	 JRST	GETNXT		;NOPE

	CALL	TYPNAM		;YES
	CALL	DOTYPE		;YES, TYPE STATS
	SETZM	PAGCNT		;ZERO PAGES
	SETZM	CHRCNT		;ZERO CHARS
	SETZM	LINCNT		;ZERO LINES

GETNXT:	MOVE	T1,IJFN
	GNJFN
	 JRST	DONE		;ALL DONE..
	JRST	DOFILE

DONE:	RLJFN
	 TRN

	MOVE	T1, IJFN	;GET OLD JFN
	TLNE	T1, (GJ%DEV!GJ%DIR!GJ%NAM!GJ%EXT!GJ%VER) ;WILD?
	 SKIPN	SEPARF		;WAS WILD, DONE SEP.?
	  CALL	DOTYPE		;NO, DO SUMMARY
	MOVEI	1, "G"-100	;GET A FEEP
	PBOUT			;PRINT IT OUT
	HALTF			;STOP!!

	TMSG	<Continued; Page count not zeroed...
>
	JRST	CONT

TYPNAM:	TMSG	<
FILE:		>

	MOVEI	T1,.PRIOU	;TTY
	HRRZ	T2, IJFN	;GET INPUT JFN
	SETZ	T3,
	JFNS
	RET

DOTYPE:	STKVAR	<DPAGES,BPP>
	MOVEI	T1, .PRIOU

	PUSHJ	P, CRLF
	FMSG	<BYTES:  >
	MOVE	T2, CHRCNT
	PUSHJ	P, I12

	PUSHJ	P, CRLF
	FMSG	<LINES:  >
	MOVE	T2, LINCNT
	PUSHJ	P, I12

	PUSHJ	P, CRLF
	FMSG	<PAGES:  >
	MOVE	T2, PAGCNT
	PUSHJ	P, I12

	PUSHJ	P, CRLF
	FMSG	<DPAGES: >
	MOVE	T2, CHRCNT
	ADDI	T2, ^D<5*512>-1
	IDIVI	T2, ^D<5*512>
	MOVEM	T2, DPAGES	;SAVE DISK PAGES
	PUSHJ	P, I12

	SKIPE	CHRCNT
	 SKIPN	PAGCNT
	  POPJ	P,

	PUSHJ	P, CRLF
	PUSHJ	P, CRLF
	FMSG	<DPAGES/PAGE: >
	FLTR	T2, DPAGES
	FLTR	T3, PAGCNT
	FDVR	T2, T3
	MOVEM	T2, BPP
	PUSHJ	P, F12.4

	PUSHJ	P, CRLF
	FMSG	<PAGES/DPAGE: >
	MOVSI	T2, (1.0)
	FDVR	T2, BPP
	PUSHJ	P, F12.4

	PUSHJ	P, CRLF
	FMSG	<BYTES/PAGE:  >
	FLTR	T2, CHRCNT
	FLTR	T3, PAGCNT
	FDVR	T2, T3
	PUSHJ	P, F12.4

	PUSHJ	P, CRLF
	FMSG	<BYTES/LINE:  >
	FLTR	T2, CHRCNT
	FLTR	T3, LINCNT
	FDVR	T2, T3
	PUSHJ	P, F12.4

CRLF:	FMSG	<
>
	POPJ	P,

LOOP:	PUSHJ	P,GETC
	 JRST	EOF

	AOS	CHRCNT		;TOTAL CHARS
	AOS	CHRLIN		;CHARACTERS ON THIS LINE

	CAIN	T1, CR
	 JRST	[SETZM	CHRLIN
		 JRST	LOOP.2]

	CAIN	T1, FF
	 JRST	[PUSHJ	P,PAGE	;if form feed call pager
		 JRST	LOOP.2]

	CAIN	T1, BS
	 JRST [	SOSGE	CHRLIN
		 SETZM	CHRLIN
		JRST	LOOP.2 ]

	CAIN	T1, LF
	 JRST	[PUSHJ	P,INC	;if line feed call line counter.
		 JRST	LOOP.2]

LOOP.2:	MOVE	T2, CHRLIN	;GET THIS LINE
	CAIL	T2, WIDTH	;OVER THE WIDTH?
	 PUSHJ	P, INC		;YES, NEW LINE

	CAILE	CNT, TXTSIZ	;Leave a space at the bottom of a page.
	 PUSHJ	P, PAGE

	JRST	LOOP

EOF:	CALLRET	PAGE		;No more data in file, end of file.

IFE FTSIN,<
GETC:	HRRZ	1,IJFN		;HERE TO GET A NEW CHARACTER
	BIN
	 ERJMP	.POPJ
.POPJ1:	AOS	(P)
.POPJ:	POPJ	P,
>
IFN FTSIN,<
GETC:	SOSGE	ICNT		;COUNT DOWN
	 JRST	GETSTR		;GET MORE
	ILDB	1, IPTR		;LOAD A BYTE
.POPJ1:	AOS	(P)
.POPJ:	POPJ	P,

GETSTR:	HRRZ	1, IJFN
	HRROI	2, IBUF
	MOVX	3, -IBUFSZ
	SIN
	ADD	3, [IBUFSZ]	;GET COUNT OF BYTES READ
	JUMPE	3, .POPJ	;NONE?
	MOVEM	3, ICNT		;OK, KEEP GOING
	MOVE	3, [POINT 7,IBUF] ;FRESH BP
	MOVEM	3, IPTR
	JRST	GETC
> ;FTSIN

INC:	AOS	CNT		;HERE ON A <LF>
	SETZM	CHRLIN		;START A FRESH LINE
	POPJ	P,

PAGE:	AOS	T1,PAGCNT	;HERE ON <FF>
	IDIVI	T1,^D10		;MOD BY 10
	MOVEI	T1,"0"(T2)	;DIGITIFY THE LOW ORDER 10
	SKIPN	NOECHF		;ECHO??
	 PBOUT			;TYPE IT
	ADDM	CNT,LINCNT
	SETZB	CNT,CHRLIN	;ZERO LINES/PAGE & CHARACTERS ON THIS LINE
	POPJ	P,

SWITAB:	2,,2
	T	NO-ECHO,NOECHF
	T	SEPARATE,SEPARF

	SUBTTL	NEW I/O

I10:	SKIPA	T3, [NO%LFL!FLD(^D10,NO%COL)!^D10]
I12:	 MOVE	T3, [NO%LFL!FLD(^D12,NO%COL)!^D10]
	NOUT
	 JSERR
	POPJ	P,

F12.4:	MOVE	T3, [FL%ONE!FL%PNT!FLD(7,FL%FST)!FLD(4,FL%SND)]
	FLOUT
	 JSERR
	POPJ	P,

	SUBTTL	STORAGE

IJFN:	BLOCK	1		;INPUT FILE JFN
IFN FTSIN,<
ICNT:	BLOCK	1
IPTR:	BLOCK	1
> ;FTSIN

CHRLIN:	BLOCK	1		;TALLY OF CHARS ON THIS LINE
CHRCNT:	BLOCK	1		;TALLY OF CHARS PRINTED
PAGCNT:	BLOCK	1		;TALLY OF PAGES PRINTED
LINCNT:	BLOCK	1		;TALLY OF ALL LINES
NOECHF:	BLOCK	1		;ECHO OF DIGITS
SEPARF:	BLOCK	1		;DO WILD FILES SEPARATELY
PDL:	BLOCK	LPDL		;PUSH DOWN LIST

	CMDSTG			;STORAGE FOR CMD PACKAGE

	END	BEGIN
