	.TITLE	UTL_STRIP - Remove trailing spaces/tabs
	.IDENT /1-001/
;++
; Facility:
;	General Utility Programs
; Abstract:
;	This program is used to remove trailing spaces and/or tabs that exist
;	on the end of records.
; Environment:
;	Runs at User access mode via DCL command. Uses the Command Language
;	Interface of DCL. (SET COMMAND command).
; Author:
;	Scott Nelson.
; Date Created:
;	09-March-1983.
; Modification Log:
;	1-001 09-Mar-1983 Scott Nelson, original program.
;--
	.PAGE
	.SBTTL DECLARATIONS
;
; Library Macro Calls:
;
	$NAMDEF
;
; External Declarations:
;
;	None.
;
; Macros:
;
;	None.
;
; Equated Symbols:
;
REC_SIZE =	256
SPACE =		^X20
TAB =		^X09
;
; Own Storage:
;
	.PSECT _UTL_DATA PIC, USR, CON, REL, LCL, NOSHR, NOEXE, RD, WRT, LONG
INFAB:	$FAB	DNM=<.DAT>, -
		FAC=<GET>, -
		FNA=GET_IN_FILENAME, -
		FNS=NAM$C_MAXRSS, -
		FOP=<NAM>, -
		NAM=INNAM
INNAM:	$NAM	ESA=INESA, -
		ESS=NAM$C_MAXRSS, -
		RSA=INRSA, -
		RSS=NAM$C_MAXRSS
INRAB:	$RAB	FAB=INFAB, -
		UBF=REC_BUF, -
		USZ=REC_SIZE
OUTFAB:	$FAB	FAC=<PUT>, -
		FNA=GET_OUT_FILENAME, -
		FNS=NAM$C_MAXRSS, -
		FOP=<MXV,NAM,OFP>, -
		NAM=OUTNAM, -
		ORG=SEQ, -
		RFM=VAR
OUTNAM:	$NAM	RLF=INNAM
OUTRAB:	$RAB	FAB=OUTFAB, -
		RBF=REC_BUF
INESA:	.BLKB	NAM$C_MAXRSS
INRSA:	.BLKB	NAM$C_MAXRSS
REC_BUF:
	.BLKB	REC_SIZE
GET_IN_ARG:
	.LONG	2
	.ADDRESS GET_IN_NAME
	.ADDRESS GET_IN_RES
GET_IN_NAME:
	.ASCID	"INPUT"
GET_IN_RES:
	.LONG	NAM$C_MAXRSS
	.ADDRESS GET_IN_FILENAME
GET_IN_FILENAME:
	.BLKB	NAM$C_MAXRSS
GET_OUT_ARG:
	.LONG	2
	.ADDRESS GET_OUT_NAME
	.ADDRESS GET_OUT_RES
GET_OUT_NAME:
	.ASCID	"OUTPUT"
GET_OUT_RES:
	.LONG	NAM$C_MAXRSS
	.ADDRESS GET_OUT_FILENAME
GET_OUT_FILENAME:
	.BLKB	NAM$C_MAXRSS
;
; PSECT Declarations:
;
	.PSECT _UTL_CODE PIC, USR, CON, REL, LCL, SHR, EXE, RD, NOWRT, LONG
	.PAGE
	.SBTTL UTL_STRIP_FILE
;++
; Functional Description:
;	This program removes the spaces that occur at the end of the records
;	of the input file.
; Calling Sequence:
;	(From DCL)
;	$ STRIP input-filename output-filename
; Formal Parameters:
;	input-filename	The file to be "stripped".
;	output-filename	The file to be created with the "stripped" records.
; Implicit Inputs:
;	None.
; Implicit Outputs:
;	None.
; Completion Status:
;	SS$_NORMAL	Normal completion status
;	RMS$_xyz	RMS error messages
; Side Effects:
;	None.
;--
	.ENTRY	UTL_STRIP_FILE, ^M<R2>
	CALLG	GET_IN_ARG, G^CLI$GET_VALUE
	CMPL	R0, #SS$_NORMAL
	BNEQU	100$
	CALLG	GET_OUT_ARG, G^CLI$GET_VALUE
	CMPL	R0, #SS$_NORMAL
	BEQLU	200$
100$:	$EXIT_S	R0
200$:	$PARSE	FAB=INFAB
	BLBS	R0, SEARCH
	BRW	EXIT
SEARCH:	$SEARCH	FAB=INFAB		; Find next file
	CMPL	R0, #RMS$_NMF		; NMF = name not found
	BNEQU	300$
	BRW	FINI			; If none, quit
300$:	BLBC	R0, EXIT1
	$OPEN	FAB=INFAB
	BLBC	R0, EXIT1
	MOVB	INFAB + FAB$B_RAT, -
		OUTFAB + FAB$B_RAT
	$CONNECT RAB=INRAB
	BLBC	R0, EXIT1
	$CREATE	FAB=OUTFAB
	BLBC	R0, EXIT1
	$CONNECT RAB=OUTRAB
	BLBC	R0, EXIT1
;
; Loop to copy records:
;
READ:	$GET	RAB=INRAB
	BLBS	R0, STRIP
	CMPL	R0, #RMS$_EOF
	BEQLU	DONE
EXIT1:	BRW	EXIT

STRIP:	MOVZWL	INRAB+RAB$W_RSZ, R0	; Get the record size.
	MOVAB	REC_BUF, R2		; Get the address of the buffer
NXTCHR:	TSTL	R0			; If no characters, write it.
	BEQLU	WRITE
	CMPB	-(R0)[R2], #SPACE	; Check the character
	BEQLU	NXTCHR
	CMPB	(R0)[R2], #TAB
	BEQLU	NXTCHR
	ADDL2	#1, R0			; Change pointer to length

WRITE:	CVTLW	R0, OUTRAB + RAB$W_RSZ	; Save the new record size
	$PUT	RAB=OUTRAB
	BLBC	R0, EXIT
	BRB	READ
;
; Close files
;
DONE:	$DISCONNECT RAB=INRAB
	BLBC	R0,EXIT
	$CLOSE	FAB=INFAB
	BLBC	R0, EXIT
	$DISCONNECT RAB=OUTRAB
	BLBC	R0, EXIT
	$CLOSE	FAB=OUTFAB
	BLBC	R0, EXIT
	BRW	SEARCH
FINI:	MOVL	#SS$_NORMAL, R0
EXIT:	$EXIT_S	R0
	.END	UTL_STRIP_FILE
