Everhart, Glenn From: GWDVMS::MOELLER [moeller@gwdvms.dnet.gwdg.de] Sent: Tuesday, March 09, 1999 11:26 AM To: Info-VAX@Mvb.Saic.Com Subject: re^2: System Service call to put item into print a print queue. Brian Schenkenberger, VAXman- writes: >[...] > The item list functions for queuing a file to a print queue can also > be a bit cumbersome to the uninitiated. Perhaps it's time to add new > LIB$ routines such as a LIB$PRINT_FILE to simplify this. I have seen > far too many developers give up on the $SNDJBC service and spawn off > a process to execute a composed DCL PRINT command. Bleach! >[...] Below is some code (VAX MACRO, not yet adapted to Alpha) that I wrote eons ago, hardly ever used. The proposed interface may help someone - it provides for the general case of multiple files in a print job, so it could be simplified even more ... Wolfgang J. Moeller, Tel. +49 551 2011516 or -510, moeller@gwdvms.dnet.gwdg.de GWDG, D-37077 Goettingen, F.R.Germany | Disclaimer: No claim intended! ----- ----- ----- PRINTSUBS.MAR ------------------------------------------------------------ .title printsubs print command subroutines ; ; w.j.m. feb 86 ; ; entries: ; integer*4 PRINT_OPEN(jobname,queuename,[formname],[more],[jnout]) ; character*(*) jobname,queuename ! in ; character*(*) formname ! in ; integer*4 more(*) ! in, zero-terminated itemlist ext. ; integer*4 jnout ! out, job number ; ; integer*4 PRINT_FILE([filename],[file_id],[delete],[more]) ; character*(*) filename ! in \ either filename or ; byte file_id(28) ! in, dvi//fid//did / file_id must be given ; logical*1 delete ! in ; integer*4 more(*) ! in, zero-terminated itemlist ext. ; ; integer*4 PRINT_CLOSE([statusout],[statusoutlen]) ; character*(*) statusout ! out, len() used ; integer*4 statusoutlen ! out ; ; ;***** ; $sjcdef ; ; ;***** ; .entry print_open,^m ; clrl -(sp) ;push itmlst cmpb (ap),#4 blssu 10$ ;no "more" moval @4*4(ap),r0 beql 10$ clrl r1 5$: tstl (r0) beql 8$ addl #3*4,r1 addl #3*4,r0 brb 5$ 8$: subl r1,sp movc3 r1,@4*4(ap),(sp) 10$: ; cmpb (ap),#5 ;handle "entry_number_output" blssu 20$ moval @5*4(ap),r0 beql 20$ clrl -(sp) pushl r0 pushl #4+ 20$: ; cmpb (ap),#3 ;handle formname blssu 30$ moval @3*4(ap),r0 beql 30$ movq (r0),r0 clrl -(sp) pushl r1 movw #sjc$_form_name,-(sp) movw r0,-(sp) 30$: ; movq @2*4(ap),r0 ;queue name clrl -(sp) pushl r1 movw #sjc$_queue,-(sp) movw r0,-(sp) ; movq @1*4(ap),r0 ;job name clrl -(sp) pushl r1 movw #sjc$_job_name,-(sp) movw r0,-(sp) ; movl sp,r6 ;r6 -> itmlst clrq -(sp) movl sp,r5 ;r5 -> iosb jsb get_ef_r2 ;r2 = efn ; $sndjbcw_s - efn=r2,- func=#sjc$_create_job,- itmlst=(r6),- iosb=(r5) pushl r0 jsb free_ef_r2 movl (sp)+,r0 blbc r0,99$ ;return bad status ... movl (r5),r0 ;... or iosb status 99$: ret ; ; ;***** ; .entry print_file,^m ; clrl -(sp) ;push itmlst cmpb (ap),#4 blssu 10$ ;no "more" moval @4*4(ap),r0 beql 10$ clrl r1 5$: tstl (r0) beql 8$ addl #3*4,r1 addl #3*4,r0 brb 5$ 8$: subl r1,sp movc3 r1,@4*4(ap),(sp) 10$: ; cmpb (ap),#3 ;handle delete flag blssu 30$ movab @3*4(ap),r0 beql 30$ blbc (r0),30$ clrq -(sp) pushl #sjc$_delete_file@16 30$: ; cmpb (ap),#2 ;handle file_id (supersedes filespec) blssu 40$ movab @2*4(ap),r0 beql 40$ clrl -(sp) pushl r0 pushl #28+ brb 50$ ;ignore 1st parameter (filespec) 40$: ; movq @1*4(ap),r0 ;filespec (must be present) clrl -(sp) pushl r1 movw #sjc$_file_specification,-(sp) movw r0,-(sp) 50$: ; movl sp,r6 ;r6 -> itmlst clrq -(sp) movl sp,r5 ;r5 -> iosb jsb get_ef_r2 ;r2 = efn ; $sndjbcw_s - efn=r2,- func=#sjc$_add_file,- itmlst=(r6),- iosb=(r5) pushl r0 jsb free_ef_r2 movl (sp)+,r0 blbc r0,99$ ;return bad status ... movl (r5),r0 ;... or iosb status 99$: ret ; ; ;***** ; .entry print_close,^m ; clrl -(sp) movl sp,r7 ;r7 -> retlen ; clrl -(sp) ;push itmlst ; cmpb (ap),#1 ;handle "job_status_output" text blssu 20$ moval @1*4(ap),r0 beql 20$ movq (r0),r0 pushl r7 pushl r1 movw #sjc$_job_status_output,-(sp) movw r0,-(sp) 20$: ; movl sp,r6 ;r6 -> itmlst clrq -(sp) movl sp,r5 ;r5 -> iosb jsb get_ef_r2 ;r2 = efn ; $sndjbcw_s - efn=r2,- func=#sjc$_close_job,- itmlst=(r6),- iosb=(r5) pushl r0 jsb free_ef_r2 ; ;ggf. return length cmpb (ap),#2 blssu 70$ moval @2*4(ap),r0 beql 70$ movzwl (r7),(r0) 70$: ; movl (sp)+,r0 blbc r0,99$ ;return bad status ... movl (r5),r0 ;... or iosb status 99$: ret ; ; ;***** subroutines ; get_ef_r2: clrl -(sp) movl sp,r1 pushl r1 calls #1,g^lib$get_ef blbs r0,10$ pushl r0 calls #1,g^lib$stop 10$: movl (sp)+,r2 rsb ; free_ef_r2: pushl r2 movl sp,r1 pushl r1 calls #1,g^lib$free_ef blbs r0,10$ pushl r0 calls #1,g^lib$stop 10$: tstl (sp)+ rsb ; ; .end -------------------------------------------------------------------------------- Wolfgang J. Moeller, Tel. +49 551 2011516 or -510, moeller@gwdvms.dnet.gwdg.de GWDG, D-37077 Goettingen, F.R.Germany | Disclaimer: No claim intended! ----- -----