10	! ----- PRINT_FILE.FUN -----
	!
	! ----- FUNCTION TO ENTER A FILE INTO A VMS PRINT QUEUE -----
	!
	! ----- PASSED: -----
	!
	! -----		FILESPEC = FILE SPECIFICATION TO BE PRINTED -----
	! -----		QUEUE = NAME OF VMS PRINT QUEUE TO PRINT TO -----
	! -----		COPIES = NUMBER OF COPIES TO BE PRINTED, -----
	! -----		         (NEGATIVE NUMBER OF COPIES TO USE THE -----
	! -----			  /DELETE PRINT QUALIFIER ON THE FILESPEC) -----
	!
	! ----- RETURNED: -----
	!
	! -----		PRINT_FILE = VMS EXIT STATUS -----
	!
	! ----- Last Change 05/01/89 by Brian Lomasky -----
	!
	! ----- Teradyne, Inc., 179 Lincoln Street, Boston, MA  02111 -----
	! ----- (617) 482-2706, x3259 -----
	!
	! ----- Neither Brian Lomasky nor Teradyne, Inc. implicitly or -----
	! ----- explicitly implies this program is usable in any way. -----
	! ----- This program is released to the public domain in an -----
	! ----- "AS-IS" condition. -----
	!
	! ----- Restrictions: -----
	! -----   1) Requires VAX BASIC V2.4 or later. -----
	! -----   2) Must be linked with JBCDEF and SJCDEF -----
	!
	FUNCTION LONG PRINT_FILE(STRING FILESPEC, STRING QUEUE, LONG COPIES)

		OPTION TYPE = EXPLICIT		! ENSURE EVERYTHING IS DECLARED

		EXTERNAL LONG CONSTANT JBC$_NORMAL	! NORMAL SUCCESS STATUS
		EXTERNAL LONG CONSTANT SJC$_DELETE_FILE	! "PRINT/DELETE"
		EXTERNAL LONG CONSTANT SJC$_ENTER_FILE	! CREATE A PRINT JOB
		EXTERNAL LONG CONSTANT SJC$_FILE_COPIES	! NUMBER OF COPIES
		EXTERNAL LONG CONSTANT SJC$_FILE_SPECIFICATION ! FILESPEC
		EXTERNAL LONG CONSTANT SJC$_NO_NOTIFY	! "PRINT/NONOTIFY"
		EXTERNAL LONG CONSTANT SJC$_NO_PAGINATE	! "PRINT/NOFEED"
		EXTERNAL LONG CONSTANT SJC$_QUEUE	! QUEUE NAME TO USE
		EXTERNAL LONG CONSTANT SS$_NORMAL	! NORMAL SUCCESS STATUS

		RECORD JBCREC			! RECORD FOR $SNDJBC
			VARIANT
			CASE
				WORD BUFFER_LENGTH
				WORD ITEM_CODE
				LONG BUFFER_ADDRESS
				LONG RETURN_LENGTH_ADDR
			CASE
				LONG LIST_TERMINATOR
			END VARIANT
		END RECORD JBCREC

		DECLARE WORD CONSTANT TRUE = (1% = 1%)
		DECLARE WORD CONSTANT FALSE = NOT TRUE

		DECLARE WORD COPIES_LENGTH	! LENGTH OF COPIES
		DECLARE LONG DELETE_QUALIFIER	! TRUE TO USE THE /DELETE QUAL
		DECLARE WORD FILESPEC_LENGTH	! LENGTH OF FILESPEC
		DIM LONG IOSB(1%)		! I/O STATUS BLOCK
		DECLARE WORD QUEUE_LENGTH	! LENGTH OF QUEUE
		DIM JBCREC SNDJBC(6%)		! RECORD FOR SYS$SNDJBCW
		DECLARE LONG SYS_STATUS		! VMS EXIT STATUS

		MAP (JBCDAT)	LONG	THE_COPIES,			&
				STRING	THE_FILESPEC = 79%,		&
				STRING	THE_QUEUE = 39%

		THE_FILESPEC = FILESPEC		! MOVE TO MAP
		THE_QUEUE = QUEUE		! MOVE TO MAP
		IF COPIES < 0% THEN
			THE_COPIES = -COPIES	! NUMBER OF COPIES TO PRINT
			DELETE_QUALIFIER = TRUE	! USE THE /DELETE QUALIFIER
		ELSE
			THE_COPIES = COPIES	! NUMBER OF COPIES TO PRINT
			DELETE_QUALIFIER = FALSE! NO /DELETE QUALIFIER
		END IF

		! ----- SEND TO JOB CONTROLLER AND WAIT -----
		EXTERNAL LONG FUNCTION SYS$SNDJBCW

		! ----- STORE ITEM LIST FOR $SNDJBCW FUNCTION CALL -----
		SNDJBC(0%)::BUFFER_LENGTH	= LEN(QUEUE)
		SNDJBC(0%)::ITEM_CODE		= SJC$_QUEUE
		SNDJBC(0%)::BUFFER_ADDRESS	= LOC(THE_QUEUE)
		SNDJBC(0%)::RETURN_LENGTH_ADDR	= LOC(QUEUE_LENGTH)

		SNDJBC(1%)::BUFFER_LENGTH	= LEN(FILESPEC)
		SNDJBC(1%)::ITEM_CODE		= SJC$_FILE_SPECIFICATION
		SNDJBC(1%)::BUFFER_ADDRESS	= LOC(THE_FILESPEC)
		SNDJBC(1%)::RETURN_LENGTH_ADDR	= LOC(FILESPEC_LENGTH)

		SNDJBC(2%)::BUFFER_LENGTH	= 4%
		SNDJBC(2%)::ITEM_CODE		= SJC$_FILE_COPIES
		SNDJBC(2%)::BUFFER_ADDRESS	= LOC(THE_COPIES)
		SNDJBC(2%)::RETURN_LENGTH_ADDR	= LOC(COPIES_LENGTH)

		SNDJBC(3%)::BUFFER_LENGTH	= 0%
		SNDJBC(3%)::ITEM_CODE		= SJC$_NO_PAGINATE
		SNDJBC(3%)::BUFFER_ADDRESS	= 0%
		SNDJBC(3%)::RETURN_LENGTH_ADDR	= 0%

		SNDJBC(4%)::BUFFER_LENGTH	= 0%
		SNDJBC(4%)::ITEM_CODE		= SJC$_NO_NOTIFY
		SNDJBC(4%)::BUFFER_ADDRESS	= 0%
		SNDJBC(4%)::RETURN_LENGTH_ADDR	= 0%

		IF DELETE_QUALIFIER THEN	! IF /DELETE WANTED:
			SNDJBC(5%)::BUFFER_LENGTH	= 0%
			SNDJBC(5%)::ITEM_CODE		= SJC$_DELETE_FILE
			SNDJBC(5%)::BUFFER_ADDRESS	= 0%
			SNDJBC(5%)::RETURN_LENGTH_ADDR	= 0%

			SNDJBC(6%)::LIST_TERMINATOR	= 0%
		ELSE
			SNDJBC(5%)::LIST_TERMINATOR	= 0%
		END IF

		SYS_STATUS = SYS$SNDJBCW(,	! EVENT FLAG NUMBER	&
			SJC$_ENTER_FILE					&
				BY VALUE,	! FUNCTION CODE		&
			,			! <NULL>		&
			SNDJBC() BY REF,	! ITEM LIST		&
			IOSB() BY REF,		! I/O STATUS BLOCK	&
			,			! AST ADDRESS		&
			)			! AST PARAMETER

		IF SYS_STATUS <> SS$_NORMAL THEN
			PRINT_FILE = SYS_STATUS	! RETURN VMS STATUS
		ELSE
			! ----- SEE IF ANY ERROR STATUS IS SET -----
			SELECT IOSB(0%)
			CASE JBC$_NORMAL
				! ----- JOB WAS PRINTED SUCCESSFULLY -----
				! ----- (RETURN VMS SUCCESS STATUS) -----
				PRINT_FILE = SS$_NORMAL
			CASE ELSE
				! ----- RETURN VMS ERROR STATUS -----
				PRINT_FILE = IOSB(0%)
			END SELECT
		END IF

	END FUNCTION
