2! PROGRAM : NPRSRV.BAS - Network Print Request Server 5! VERSION : V1.0 6! EDIT : 00 7! EDIT DATE : 06-Jul-87 10 EXTEND 11 ! & & & ! C O P Y R I G H T & & & ! Copyright (C) 1987 by Terence M. Kennedy & ! & ! & ! 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 either & ! Terence M. Kennedy or Saint Peter's College. & ! & !******************************************************************* & & 20 ! & & & ! M O D I F I C A T I O N H I S T O R Y & & & ! VER/ED EDIT DATE REASON & ! 00 06-Jul-87 Original Version & & & 30 ! & & & ! V A R I A B L E U S A G E & & & ! VARIABLE USAGE & ! A$ Dummy for SYS calls & ! A%(30%) Holds results of SYS calls & ! COMND$ Command line retrieved from file & ! CVTFLG% PBS no convert (0 vs O) flag & ! DEFAULT% Default numeric value in functions & ! DEFAULT$ Default string value in functions & ! ERNO% Last error number & ! FEDFLG% PBS no feed (skipover) flag & ! FRMNAM$ PBS form name & ! HLDFLG% PBS hold flag & ! I% Scratch integer variable & ! INDEX% File lookup index & ! JOBCNT% PBS job count (copies) & ! OFILE$ Name of file to print before queueing & ! OPTL% Pointer to optional part of switch & ! OPTL$ String of optional part of switch & ! PRIRTY% PBS job priority & ! QFILE$ Name of file to print after queueing & ! QUENAM$ PBS queue name & ! REQD% Pointer to required part of switch & ! REQD$ String of required part of switch & ! REST$ Rest of user switch & ! TEMP$ Scratch string variable & ! TEMPLATE$ Template option variable & ! TERM% Position in string of switch terminator & ! TRNFLG% PBS truncate flag & ! URP$ User Request Packet issued to PBS & & 100 ! ENTRY - SET UP FOR BUSINESS & & GOSUB 32300 & \ DIM A%(30%) & ! SET UP ERROR TRAP, PRINT SIGNON & 1000 ! MAIN LOOP - SEE IF WE HAVE ANY FILES TO PROCESS & & INDEX%=0% & ! START WITH FIRST FILE 1010 CHANGE SYS(CHR$(6%)+CHR$(17%)+CHR$(INDEX%)+CHR$(SWAP%(INDEX%))+ & STRING$(2%,0%)+CHR$(229%)+CHR$(185%)+CHR$(229%)+CHR$(185%)+ & CHR$(18%)+CHR$(90%)) TO A% & \ INDEX%=INDEX%+1% & \ GOTO 1010 IF A%(30%)<>0% & \ OFILE$=RAD$(A%(7%)+SWAP%(A%(8%)))+RAD$(A%(9%)+SWAP%(A%(10%))) & \ QFILE$=OFILE$+".NPQ" & \ OFILE$=OFILE$+".NPR" & \ GOSUB 10000 & \ GOTO 1000 & ! LOOKUP NEXT FILE MATCHING '??????.NPR' & ! INCREMENT 'NEXT FILE' POINTER & ! SKIP IF FILE IS OPEN OR 'SPECIAL' & ! CONSTRUCT OLD, NEW NAMES & ! GO ISSUE SPOOL REQUEST, LOOP & 1030 PRINT "** yawn..." & \ SLEEP(30%) & \ GOTO 1000 & ! ARRIVE HERE ON 'NO FILES' ERROR & ! DELAY A WHILE AND LOOP & 10000 ! PRINT SERVICE - DETERMINE OPTIONS AND QUEUE THE FILE & & PRINT "** we should be printing ";OFILE$ & \ NAME OFILE$ AS QFILE$ & \ QUENAM$="NET$PRINT" & \ FRMNAM$="NORMAL" & \ PRIRTY%=0% & \ JOBCNT%=1% & \ HLDFLG%=0% & \ CVTFLG%=0% & \ FEDFLG%=1% & \ TRNFLG%=0% & \ OPEN QFILE$ FOR INPUT AS FILE #1% & \ INPUT LINE #1%,COMND$ & \ CLOSE #1% & \ COMND$=CVT$$(COMND$,189%) & \ GOTO 10100 IF LEFT(COMND$,6%)<>"NPRINT" & \ QUENAM$=FNA$("/QU*EUE",QUENAM$) & \ FRMNAM$=FNA$("/FO*RMS",FRMNAM$) & \ PRIRTY%=FNN%("/PR*IORITY",PRIRTY%) & \ JOBCNT%=FNN%("/JO*B_COUNT",JOBCNT%) & \ JOBCNT%=FNN%("/JO*BCOUNT",JOBCNT%) & \ HLDFLG%=FNB%("/HO*LD",HLDFLG%) & \ CVTFLG%=FNB%("/CO*NVERT",CVTFLG%) & \ FEDFLG%=FNB%("/FE*ED",FEDFLG%) & \ TRNFLG%=FNB%("/TR*UNCATE",TRNFLG%) & ! FIRST, RENAME THE FILE SO WE WON'T SEE IT AGAIN & ! SET ALL OPTION SWITCHES TO DEFAULTS & ! OPEN THE PRINT FILE, READ THE FIRST LINE, AND CLOSE & ! UPCASE AND COMPRESS THE LINE & ! IF LINE WASN'T OPTIONS, SKIP & ! ELSE PROCESS THE OPTIONS & 10100 QUENAM$=FNO$(QUENAM$) & \ FRMNAM$=FNO$(FRMNAM$) & \ QFILE$=FNO$(QFILE$) & \ PRINT "CONSTRUCTED COMMAND IS:" & \ PRINT " PRINT ";QFILE$;"/QUEUE=";QUENAM$;"/FORMS=";FRMNAM$; & "/PRIORITY=";NUM1$(PRIRTY%);"/JOB_COUNT=";NUM1$(JOBCNT%);" -" & \ PRINT " /"; & \ PRINT "NO"; IF HLDFLG%=0% & \ PRINT "HOLD/"; & \ PRINT "NO"; IF CVTFLG%=0% & \ PRINT "CONVERT/"; & \ PRINT "NO"; IF FEDFLG%=0% & \ PRINT "FEED/"; & \ PRINT "NO"; IF TRNFLG%=0% & \ PRINT "TRUNCATE/NOFLAG_PAGES/DELETE" & \ PRINT & ! PAD THE STRINGS TO ENSURE ODD START ADDRESSES & ! PRINT THE CONSTRUCTED COMMAND FOR DEBUGGING & 10110 URP$=CHR$(1%)+CHR$(6%)+"NPRSRV"+CHR$(2%)+CHR$(LEN(QUENAM$))+ & QUENAM$+CHR$(4%)+CHR$(PRIRTY%)+CHR$(5%)+CHR$(JOBCNT%)+ & CHR$(6%)+CHR$(LEN(FRMNAM$))+FRMNAM$+CHR$(12%)+CHR$(HLDFLG%)+ & CHR$(128%)+CHR$(LEN(QFILE$))+QFILE$+CHR$(130%)+CHR$(CVTFLG%)+ & CHR$(132%)+CHR$(1%)+CHR$(133%)+CHR$(FEDFLG%)+CHR$(134%)+CHR$(0%)+ & CHR$(135%)+CHR$(TRNFLG%) & \ A$=SYS(CHR$(6%)+CHR$(22%)+CHR$(-11%)+CHR$(128%+5%)+ & STRING$(8%,0%)+CVT%$(SWAP%(LEN(URP$)))+STRING$(14%,0%)+CHR$(1%)+ & STRING$(11%,0%)+URP$) & \ RETURN & ! BUILD THE USER REQUEST PACKET & ! ISSUE THE PBS MESSAGE SEND & ! AND EXIT & 32300 ! INITIALIZE ERROR HANDLING, DEFINE FUNCTIONS, PRINT SIGNON MESSAGE & & ON ERROR GOTO 32500 & \ DEF* FNE$(ERNO%) & \ FNE$=CVT$$(RIGHT(SYS(CHR$(6%)+CHR$(9%)+CHR$(ERNO%)),3%),5%) & \ FNEND & ! FUNCTION TO RETURN ERROR MSG & \ DEF* FNA$(TEMPLATE$,DEFAULT$) & \ REQD%=INSTR(1%,TEMPLATE$,"*") & \ REQD$=LEFT(TEMPLATE$,REQD%-1%) & \ OPTL%=INSTR(1%,COMND$,REQD$) & \ OPTL$=MID(TEMPLATE$,REQD%+1%,LEN(TEMPLATE$)) & \ GOTO 32310 IF OPTL%=0% & \ REST$=MID(COMND$,OPTL%+REQD%-1%,LEN(COMND$)) & \ FOR I%=1% TO LEN(OPTL$)+1% & \ GOTO 32320 IF MID(REST$,I%,1%)="=" & \ GOTO 32310 IF MID(OPTL$,I%,1%)<>MID(REST$,I%,1%) & \ NEXT I% & \ GOTO 32320 32310 FNA$=DEFAULT$ & \ GOTO 32340 32320 TEMP$=MID(REST$,I%+1%,LEN(REST$)) & \ TERM%=INSTR(1%,TEMP$,"/") & \ GOTO 32330 IF TERM%<>0% & \ TERM%=INSTR(1%,TEMP$," ") & \ GOTO 32330 IF TERM%<>0% & \ FNA$=TEMP$ & \ GOTO 32340 32330 FNA$=MID(TEMP$,1%,TERM%-1%) 32340 FNEND & ! FUNCTION TO PARSE ALPHA SWITCHES & \ DEF* FNN%(TEMPLATE$,DEFAULT%) & \ REQD%=INSTR(1%,TEMPLATE$,"*") & \ REQD$=LEFT(TEMPLATE$,REQD%-1%) & \ OPTL%=INSTR(1%,COMND$,REQD$) & \ OPTL$=MID(TEMPLATE$,REQD%+1%,LEN(TEMPLATE$)) & \ GOTO 32350 IF OPTL%=0% & \ REST$=MID(COMND$,OPTL%+REQD%-1%,LEN(COMND$)) & \ FOR I%=1% TO LEN(OPTL$)+1% & \ GOTO 32360 IF MID(REST$,I%,1%)="=" & \ GOTO 32350 IF MID(OPTL$,I%,1%)<>MID(REST$,I%,1%) & \ NEXT I% & \ GOTO 32360 32350 FNN%=DEFAULT% & \ GOTO 32380 32360 TEMP$=MID(REST$,I%+1%,LEN(REST$)) & \ TERM%=INSTR(1%,TEMP$,"/") & \ GOTO 32370 IF TERM%<>0% & \ TERM%=INSTR(1%,TEMP$," ") & \ GOTO 32370 IF TERM%<>0% & \ FNN%=VAL(TEMP$) & \ GOTO 32380 32370 FNN%=VAL(MID(TEMP$,1%,TERM%-1%)) 32380 FNEND & ! FUNCTION TO PARSE NUMERIC SWITCHES & \ DEF* FNB%(TEMPLATE$,DEFAULT%) & \ REQD%=INSTR(1%,TEMPLATE$,"*") & \ REQD$=MID(TEMPLATE$,2%,REQD%-2%) & \ PRINT "REQD$=";REQD$ & \ OPTL%=INSTR(1%,COMND$,REQD$) & \ GOTO 32390 IF OPTL%=0% & \ GOTO 32410 IF MID(COMND$,OPTL%-3%,3%)="/NO" & \ GOTO 32400 32390 FNB%=DEFAULT% & \ GOTO 32420 32400 FNB%=1% & \ GOTO 32420 32410 FNB%=0% & \ GOTO 32420 32420 FNEND & ! FUNCTION TO (INCOMPLETELY) PARSE BOOLEAN SWITCHES & \ DEF* FNO$(A$) & \ FNO$=A$ & \ FNO$=A$+CHR$(0%) IF LEN(A$)/2.<>INT(LEN(A$)/2.) & \ FNEND & ! FUNCTION TO PAD ARGUMENTS & \ PRINT "NPRSRV V1.0-00 "; & \ PRINT FNE$(0%) & \ PRINT & \ RETURN & 32500 ! ERROR HANDLERS & & ERNO%=ERR & \ RESUME 1030 IF ERL=1010% & \ RESUME 32350 IF ERL=32360% & \ RESUME 32350 IF ERL=32370% & ! SAVE ERROR NUMBER & ! 1030 IF NO FILES FOUND & ! 32350 IF BAD NUMERIC SWITCH VALUE & 32510 PRINT FNE$(ERNO%);" at line";ERL & \ RESUME 32767 & ! ERROR WE DON'T HANDLE, PANIC & 32767 END