TITLE SPCUSG -- DISK STORAGE ACCOUNTING PROGRAM %3(71) SUBTTL CLEMENTS/WLH/PFC 9-FEB-81 ;COPYRIGHT (C) 1971,1975,1979,1981 BY ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; ;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 DIGITAL EQUIPMENT ;CORPORATION. ; ;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. ; THIS PROGRAM IS ACTUALLY "SPACE" MODIFIED TO PRODUCE USAGE ENTRIES AS ; WELL AS FACT ENTRIES. THIS "EXAMPLE" WAS DONE FOR 2 REASONS. FIRST, ; IF A SITE IS CONVERTING FROM FACT TO USAGE ACCOUNTING, THERE IS A GOOD ; CHANCE THAT THE SITE HAS INCLUDED LOCAL FACT ENTRY TYPES FOR THEIR OWN ; ACCOUNTING. FOR TOTAL CONVERSION, PROGRAMS MAKING THOSE FACT ENTRIES ; MUST MAKE USAGE ENTRIES INSTEAD. TO PROVIDE AN EXAMPLE OF THE CONVERSION ; THE SITE PROGRAMMERS MUST DO, WE DID THE CONVERSION ON A PROGRAM MOST SITES ; ARE FAMILIAR WITH. THIS INCLUDES INSTRUCTIONS FOR ADDING LOCAL ENTRY ; DEFINITIONS FOR ACTDAE TO MAKE A RECORD CONTAINING THE SAME DATA THAT THE ; OLD FACT FILE RECORD CONTAINED. THE SECOND REASON WAS THE SEVERAL FIELD TEST ; SITES INDICATED THAT ALTHOUGH THE DATA FROM SPACE WAS LESS ACCURATE THAN ; THE DISK UTILIZATION RECORDS PRODUCED FROM BACKUP (/USAGE), IT WAS SUFFICIENT ; FOR THEIR PURPOSES. SINCE OTHER SITES MAY FEEL THE SAME WAY, CHANCES ARE ; VERY GOOD THAT "SPACE" WILL BE THE FIRST PROGRAM MODIFIED BY SITES. THE ; READER IS DIRECTED TO THE SUBROUTINE "MAKUSG" FOUND IN THIS PROGRAM FOR ; ADDITIONAL CCMMENTS AND INSTRUCTIONS. ; THIS PROGRAM IS PROVIDED AS A CONVIENENCE TO SITES AND DOES NOT CONSTITUTE ; SUPPORT OF THIS "EXAMPLE". ; THIS PROGRAM ACCEPTS AN OPERATOR COMMAND. BASED ON THIS, IT ; LOOKS AT THE UFD'S FOR EACH USER ON ONE OR ALL STRUCTURES AND ; PRINTS THEIR QUOTAS AND SPACE USED. OPTIONALLY, IT WILL ; MAKE FACT.SYS ENTRIES (VIA DAEMON) OR SUBMIT BATCH JOBS ; TO RECOMPUTE THEIR QUOTAS. TWOSEG ;REENTRANT SEARCH MACTEN,UUOSYM,QPRM ND FTUSAGE,-1 ;DEFAULT TO USAGE ACCOUNTING IN THIS EXAMPLE IFN FTUSAGE,< SEARCH ACTSYM ;ACCOUNTING SYMBOLS > SALL ;CLEAN LISTING .REQUE REL:QUEUER ;USES QUEUER.REL .REQUE REL:HELPER ;USES HELPER.REL SPCWHO==0 ;LAST PATCHER SPCVER==3 ;MAJOR VERSION SPCMIN==0 ;MINOR VERSION SPCEDT==71 ;EDIT LEVEL LOC 137 BYTE (3)SPCWHO (9)SPCVER (6)SPCMIN (18) SPCEDT RELOC 400000 ;DEFAULT VALUES ND FLGUSR,^D500 ;FLAG USER IF GREATER THAN THIS ND LN$PDL,60 ;PUSH DOWN LIST LENGTH ND OQDELT,^D100 ;IF THIS MUCH OVER QUOTA, SEND BATCH JOB SUBTTL REVISION HISTORY ;%2(45) APRIL, 1972 ;46 REPLACE HALTS WITH MESSAGES ;47 FIND BIGGEST USER UNDER 100K BLOCKS ;50 HANDLE NEGATIVE USED BLOCKS AND LARGE USED BLOCKS ;51 DATE 75 FIXES ;52 FLAG USERS OVER 500 BLOCKS ;53 EXIT WHEN DONE ;54 USE C AS A UNIVERSAL ;55 TYPE STR.TXT ;56 MAKE REENTRANT ;57 REMOVE _ AND ALTMODE IN COMMAND SCANNER ;60 CLEAN UP LISTING AND SOME SYMBOL NAMES ;61 CHANGE TO NEW FORMAT SPACE FACT FILE ENTRY (161) ;62 (10-7286) ALSO BATCH USERS ABOVE QUOTA ;63 (10-7286) ALLOW .CTL TO BE READ BY ALL ;64 (10-7286) ADD .DIRECT/F/W TO CTL FILE SUBMITTED ;65 (10-7286) CLEAN UP Q REQUEST BLOCK ;66 IMPLEMENT ERROR MESSAGE STANDARD WITH MONITOR /VERB:NOPREFIX ;67 ALLOW DEFAULT PROJECT OR PROGRAMMER ;70 USE QPRM ;71 ADD FTUSAGE TO ALLOW USAGE RECORDS. THIS IS DEFAULTED TO OFF SINCE ; THE STANDARD ACTDAE DOESN'T KNOW ABOUT ANY USER DEFINED ENTRIES AND ; THIS MAKES ONE OF THOSE. SEE MAKUSG ROUTINE FOR DIRECTIONS. SUBTTL DEFINITIONS ; AC'S F=0 A=1 B=2 C=3 D=4 T=5 T1=6 T2=7 T3=10 N=11 N1=12 M=13 TMP1=14 TMP2=15 CH=16 P=17 ; I/O CHANNELS MFD==1 UFD==2 LST==3 CTL==4 TXT==5 ;STR.TXT READING DEFINE $MSG (A)< MOVEI T,[ASCIZ \A\] PUSHJ P,MSG > ; FLAG AC BITS R.USG==1B19 ; MAKE USAGE ENTRIES R.QUUR==1B18 ; REPORTED QUEUE. UUO ERROR L.TTY==(1B17) ; OUTPUT TO TTY L.GOD==(1B16) ; RUNNING UNDER 1,2 L.BATC==(1B15) ; BATCH SWITCH L.FACT==(1B14) ; FACT SWITCH L.ARO==(1B13) ; ARROW SEEN ON INPUT L.DSK==(1B12) ; PROCESS ALL STRUCTURES L.BKT==(1B11) ; LEFT BRACKET SEEN ON INPUT L.DOT==(1B10) ; DOT SEEN ON INPUT L.ANY==(1B9) ; SOMETHING SEEN ON INPUT L.DAER==(1B8) ; REPORTED DAEMON ERROR L.TTL==(1B7) ; PRINTED HEADING LINE L.TTLD==(1B6) ; PRINTED NAME OF THIS STRUCTURE L.ISIN==(1B5) ; THIS USER IS LOGGED IN L.FPAG==(1B4) ; HEADER FLAG L.EVAL==(1B3) ; NUMBER COULD NOT BE EVALUATED L.COMA==(1B2) ; COMMA TYPED FE$SPC==161 ; FACT FILE ENTRY (DATE-75 FORMAT) SUBTTL INITIALIZE SPCUSG: JFCL ; DEFEND AGAINST CCL RUN RESET MOVE P,PDP MOVEI F,0 ; CLEAR FLAGS MOVX T,%LDMFD GETTAB T, ; GET MFD PPN MOVE T,[1,,1] MOVEM T,MFDPPN ; AND SAVE IT MOVX T,%LDSYS GETTAB T, ;GET SYS PPN MOVE T,[1,,1] MOVEM T,SYSPPN ;AND SAVE IT GETPPN T, ;GET OUR PPN JFCL MOVEM T,MYPPN MOVX T1,%LDFFA GETTAB T1, ; GET GOD'S PPN MOVE T1,[1,,2] MOVEM T1,FFAPPN ; AND SAVE IT CAMN T,T1 ; ARE WE GOD? TLO F,L.GOD ; YES, LET'S REMEMBER THAT PUSHJ P,COMAND ; GO GET COMMAND LINE MOVE T,IDEV ; DETERMINE IF SPECIFIED DEVICE IS A DSK MOVE T1,[1,,T] DSKCHR T1, JRST [MOVEI T,IDEV JRST UNIERR] TXNN T1,DC.TYP TLO F,L.DSK SETZB A,D ; INITIALIZE DEFAULTS FOR LIST DEVICE SKIPN OFILE SKIPE OEXT MOVSI D,'DSK' SKIPE OPPN MOVSI D,'DSK' SKIPN D MOVSI D,'TTY' SKIPN B,ODEV MOVE B,D MOVSI C,OHED OPEN LST,A E$$ODA: JRST [PUSHJ P,ERR ASCII /ODA/ OUTSTR [ASCIZ / Output device not available/] JRST COMERX] DEVCHR B, ; LIST DEVICE'S CHARACTERISTICS TXNE B,DV.TTA TLO F,L.TTY SKIPN A,OFILE MOVE A,['SPCUSG'] ; DEFAULT FILENAME FOR DIRECTORY DEVICE SKIPN B,OEXT MOVSI B,'TXT' HLLZS B MOVEI C,0 MOVE D,OPPN ENTER LST,A E$$CWO: JRST [PUSHJ P,ERR ASCII /CWO/ OUTSTR [ASCIZ / Can't write output file/] JRST COMERX] OUTBUF LST,0 MOVE T,.JBFF MOVEM T,SJBFF TLNE F,L.TTY ; ENTER SPACE VERSION LINE IF NOT A TTY JRST SKPTIT $MSG < SPCUSG v> LDB T,[POINT 9,.JBVER,11] SKIPE T PUSHJ P,OCTOUT LDB T,[POINT 6,.JBVER,17] MOVEI CH,"A"-1(T) SKIPE T PUSHJ P,TYO HRRZ T,.JBVER JUMPE T,V1 MOVEI CH,"(" PUSHJ P,TYO HRRZ T,.JBVER PUSHJ P,OCTOUT MOVEI CH,")" PUSHJ P,TYO V1: LDB T,[POINT 3,.JBVER,2] JUMPE T,V2 MOVEI CH,"-" PUSHJ P,TYO LDB T,[POINT 3,.JBVER,2] PUSHJ P,OCTOUT V2: PUSHJ P,TAB DATE A, IDIVI A,^D31 MOVEI T,1(B) PUSHJ P,DECOUT $MSG <-> IDIVI A,^D12 MOVE C,MONTAB(B) MOVEI D,0 MOVEI T,C PUSHJ P,MSG $MSG <-> MOVEI T,^D64(A) IDIVI T,^D100 ;ALLOW FOR .GT. 2000 MOVE T,T1 PUSHJ P,DECOUT PUSHJ P,TAB MSTIME A, IDIVI A,^D60000 IDIVI A,^D60 MOVEI T,(A) PUSHJ P,DECPR2 PUSHJ P,COLON MOVEI T,(B) PUSHJ P,DECPR2 PUSHJ P,TAB ; SPACE OVER SOME MOVSI T,-5 ; SET FOR 5 WORD LINE SV1: HRLZ T1,T ; GET INDEX IN TABLE HRRI T1,.GTCNF ; SET FOR CONFIGURATION TABLE GETTAB T1, ; READ SYSTEM HEADER MOVEI T1,0 ; (JUST IN CASE) MOVEM T1,SYSHDR(T) ; SAVE FOR MESSAGE AOBJN T,SV1 ; LOOP UNTIL DONE SETZM SYSHDR(T) ; CLEAR EXTRA WORD MOVEI T,SYSHDR ; POINT TO MESSAGE PUSHJ P,MSG ; TYPE IT TO USER SKPTIT: MOVX A,%LDQUS ; QUE STR GETTAB A, MOVSI A,'DSK' MOVEM A,QSTR SETZM TOTUSD ; ZERO TOTAL AND SUBTOTAL SETZM TOTFRE SETZM STRUCT TLNE F,L.DSK JRST SPACEL SPCCAL: MOVE B,IDEV DEVNAM B,0 E$$DUF: JRST [RELEAS LST, PUSHJ P,ERR ASCII /DUF/ OUTSTR [ASCIZ / DEVNAM UUO FAILURE /] EXIT] MOVEM B,STRUCT ; SAVE REAL STRUCTURE JRST SPC1 SUBTTL MAIN PROCESSING LOOP SPACEL: MOVE B,STRUCT SYSSTR B, E$$SUF: JRST [RELEAS LST, PUSHJ P,ERR ASCII /SUF/ OUTSTR [ASCIZ / SYSSTR UUO Failure /] EXIT] MOVEM B,STRUCT TLNE F,L.DSK SKIPN B JRST EOSYS SPC1: SETZM BADUSR ; CLEAR WORST CASE USERS SETZM WSTCAS MOVE A,[3,,IOB2] ; ARG TO DSKCHR MOVEM B,IOB2 ; STRUCTURE WANTED DSKCHR A,UU.PHY SETZB A,IOB2+.DCFCT ; CLEAR ANSWER IF WE CANT GET IT LDB T,[POINTR (A,DC.TYP)] CAIE T,.DCTFS JRST [MOVEI T,IOB2 JRST UNIERR] MOVE A,IOB2+.DCFCT ; GET FREE ON STR MOVEM A,STRTAL ; SAVE FOR TYPEOUT AND FACT SETZM STRUSD TLNN F,L.TTY PUSHJ P,CRLF TLZ F,L.TTLD ; CLEAR TITLE FOR STR FLAG MOVEI A,.IODMP TXO A,UU.PHS ; PHYSICAL STR MOVEI C,0 OPEN UFD,A JRST NOSTR SKIPE T,IPPN JRST NOPMFD OPEN MFD,A JRST OPNHLT MOVE A,MFDPPN MOVSI B,'UFD' MOVEI C,0 MOVE D,MFDPPN LOOKUP MFD,A JRST LOKHLT NOPMFD: MOVE A,SJBFF MOVEM A,.JBFF TLNN F,L.BATC JRST CTL1 ; DONT NEED CONTROL FILES MOVX A,UU.PHS MOVE B,QSTR MOVSI C,CTLHED OPEN CTL,A JRST CTL1 MOVE A,STRUCT LSH A,-6 TLO A,'Q ' MOVEM A,QFILN MOVSI B,'CTL' MOVSI C,(055B8) ;FRIENDLY PROTECTION MOVE D,FFAPPN ENTER CTL,A JRST CTL1 MOVEI A,CTLM1 PUSHJ P,CTLMSG MOVE A,[POINT 6,STRUCT] CTLL1: ILDB CH,A JUMPE CH,CTL2 ADDI CH,40 PUSHJ P,CTLTYO TLNE A,77B23 JRST CTLL1 CTL2: MOVEI A,CTLM2 PUSHJ P,CTLMSG RELEAS CTL, CTL1: SUBTTL LOOP FOR EACH USER SKIPE IPPN JRST ONEUSR ML: MOVE T,IOL MOVEI T1,0 IN MFD,T JRST GOTBLK ; PROCEED IF OK STATZ MFD,IO.EOF ; NO--CHECK FOR END OF FILE JRST EOSTR GOTBLK: MOVSI M,-200 LOOP: HLRZ T,IOB+1(M) CAIE T,'UFD' JRST NEXT MOVE T,IOB(M) ONEUSR: STORE T1,IOB2,IOB2+25,0 MOVEM T,USER MOVEM T,IOB2+.RBNAM MOVSI T,'UFD' MOVEM T,IOB2+.RBEXT MOVE T,MFDPPN MOVEM T,IOB2+.RBPPN MOVEI T,25 MOVEM T,IOB2 LOOKUP UFD,IOB2 JRST NEXT CLOSE UFD,CL.DAT!CL.ACS ; THROW AWAY NAME BLOCKS, ETC. PUSHJ P,DHEAD ; GO TYPE HEADER FOR THIS STR MOVE T,IOB2+.RBNAM MOVEM T,TMPPPN ; SAVE AS TMP PPN FOR WORST USER PUSHJ P,PPNOUT ; OUTPUT THE PPN PUSHJ P,TAB MOVE T,IOB2+.RBQTF PUSHJ P,DECTAB ; OUTPUT QTA IN MOVE T,IOB2+.RBQTO PUSHJ P,DECTAB ; QTA OUT MOVE T,IOB2+.RBUSD MOVE T1,IOB2+.RBSTS ;GET RIB STATUS TRNE T1,RP.NDL ;SEE IF NEVER-DELET JRST ISINF ;YES--NOT QUOTA COUNTED EITHER JUMPGE T,OVRZER ;JUMP IF POS USED MOVM T,T ADD T,IOB2+.RBQTO MOVEM T,IOB2+.RBUSD OVRZER: CAIG T,^D99999 ; VERY LARGE NUMBER? JRST TLOT ; NO ISINF: $MSG < ? + > TLO F,L.EVAL ; SET FLAG JRST PDON TLOT: MOVEM T,TMPSIZ ; SAVE BLOCKS USED TEMPORARILY CAMG T,WSTCAS ; IS THIS WORSE THAN WORST CASE? JRST NOCAS ; NO MOVEM T,WSTCAS ; YES, SAVE IT MOVE TMP1,TMPPPN MOVEM TMP1,WSTPPN NOCAS: PUSH P,T ; SAVE # USED PUSHJ P,DECOU6 ; PRINT USED POP P,T ; RESTORE # USED JUMPGE T,CHKOVR ; NEGATIVE USED? $MSG < ? > JRST PDON CHKOVR: CAXG T,FLGUSR ; OVER 500 BLOCKS USED? JRST OKUSED ; NO $MSG < * > JRST PDON OKUSED: $MSG < > PDON: MOVE T,IOB2+.RBDEV ; GET UNIT PUSHJ P,SIXOUT ; AND OUTPUT IT PUSHJ P,TAB SKIPGE IOB2+.RBSTS ; LOGGED OUT USER? JRST STATCK ;NO--SEE IF LOGGED IN MOVSI T,'OUT' ;YES--SET LOGGED OUT MOVE T1,IOB2+.RBUSD ;GET AMOUNT USED SUB T1,IOB2+.RBQTO ;LESS QUOTA CAXGE T1,OQDELT ;IF WORSE THAN OQDELT, JRST CHKBAD ;(NO--LOOK FOR WORST USER) TLNE F,L.BATC ;YES--SEE IF /BATCH PUSHJ P,QJOB ;YES--START IT JRST CHKBAD ;THEN GO LOOK FOR WORST USER STATCK: TLO F,L.ISIN ; NOTE THAT USER IS LOGGED IN MOVX T,%NSHJB GETTAB T, JFCL MOVE N,T STATL: HRLZ T,N HRRI T,.GTPPN GETTAB T, SETOB N,T CAMN T,IOB2+.RBNAM JRST STATP1 SOJG N,STATL TLNE F,L.BATC PUSHJ P,QJOB TLZ F,L.ISIN ; NOT REALLY LOGGED IN SO CLEAR FLAG SKIPA T,['RECOMP'] STATP1: MOVSI T,'IN ' STATPT: MOVEM T,INOURE ; SAVE FOR FACT FILE ITEM PUSHJ P,SIXOUT ; OUTPUT IN,OUT, OR RECOMP MOVE T,IOB2+.RBQTO TLNE F,L.ISIN ; SEE IF GOING TO ISSUE DATE CAME T,[.INFIN] ; NO--SEE IF GOING TO DO FREE PUSHJ P,TAB ; YES--SPACE OVER TO IT CAMN T,[.INFIN] JRST NOFREE SUB T,IOB2+.RBUSD ; QUOTA OUT-USED=FREE PUSHJ P,DECOU6 ; OUTPUT BLOCKS FREE NOFREE: TLZE F,L.ISIN ; SEE IF LOGGED IN JRST ISIN ; YES--DON'T GIVE DATE PUSHJ P,TAB ; SPACE OVER FOR DATE LDB N,[POINTR (IOB2+.RBEXT,RB.CRX)] ; DATE(75) CODE LSH N,WID(RB.CRD) LDB N1,[POINTR (IOB2+.RBPRV,RB.CRD)] IOR N,N1 IDIVI N,^D31*^D12 ; GET DATE IN YEAR MOVE N,N1 ; POSITION IT IDIVI N,^D31 ; GET MONTH MOVEI T,MONTAB(N) ; GET ASCII OF MONTH PUSHJ P,MSG ; TYPE IT $MSG < > MOVEI T,1(N1) ; GET DAY IN MONTH PUSHJ P,DECOUT ; TYPE IT IN DECIMAL ISIN: PUSHJ P,CRLF TLNE F,L.FACT PUSHJ P,MAKFCT IFN FTUSAGE,< TRNE F,R.USG ;WANT TO MAKE USAGE ENTRIES PUSHJ P,MAKUSG ;YES, MAKE ONE > MOVE N,IOB2+.RBSTS ;GET RIB STATUS TRNE N,RP.NDL ;SEE IF NEVER-DELETE TDZA N,N ;YES--CLEAR FROM COUNT MOVE N,IOB2+.RBUSD CAIG N,^D99999 SKIPG N MOVEI N,0 ADDM N,TOTUSD ADDM N,STRUSD NEXT: SKIPE IPPN JRST SPACEL AOBJN M,.+1 AOBJN M,LOOP JRST ML OPNHLT: PUSHJ P,WRN E$$OFU: ASCII /OFU/ OUTSTR [ASCIZ / Open/] TLNE F,L.TTY JRST CERR $MSG < % Open> JRST CERR LOKHLT: PUSHJ P,WRN E$$LFU: ASCII /LFU/ OUTSTR [ASCIZ / Lookup/] TLNE F,L.TTY JRST CERR $MSG < % Lookup> CERR: OUTSTR [ASCIZ / failure for /] TLNE F,L.TTY JRST TYERR $MSG < failure for > MOVE T,STRUCT PUSHJ P,SIXOUT TYERR: MOVEI T,STRUCT PUSHJ P,TYSIX OUTSTR [ASCIZ /:[1,1].UFD /] TLNE F,L.TTY JRST SPACEL $MSG <:[1,1].UFD > JRST SPACEL ; HERE TO SAVE WORST LOGGED OUT USER CHKBAD: MOVE TMP1,TMPSIZ ; GET BLOCKS OF LAST USER CAMG TMP1,BADUSR ; .GT. BADUSR? JRST STATPT ; NO, CONTINUE MOVEM TMP1,BADUSR ; YES, SAVE HIS BLOCKS MOVE TMP1,TMPPPN ; AND REMEMBER THIS GUY MOVEM TMP1,BADPPN JRST STATPT EOSTR: CLOSE MFD,CL.ACS ; DONE WITH MFD RELEAS MFD, RELEAS UFD, $MSG < Structure used total > MOVE T,STRUSD PUSHJ P,DECOU6 $MSG < free > MOVE T,STRTAL ADDM T,TOTFRE PUSHJ P,DECOU6 SETZB T,T1 ; CLEAR ACCUMULATION AND STR EOS1: SYSPHY T1, ; GET NEXT UNIT JRST EOS2 ; GIVE UP JUMPE T1,EOS2 ; DONE MOVEM T1,IOB2 ; SAVE FOR DSKCHR MOVE T2,[7,,IOB2] ; POINT TO DSKCHR DSKCHR T2,UU.PHY ; GET INFO JRST EOS1 ; GIVE UP IF FAILS MOVE T2,IOB2+.DCSNM ; GET STR NAME CAMN T2,STRUCT ; SEE IF THIS STR ADD T,IOB2+.DCUSZ ; YES--INCLUDE IT'S SIZE JRST EOS1 ; LOOP UNTIL DONE EOS2: JUMPE T,EOST ; GIVE UP IF NO SPACE PUSH P,T ; SAVE SPACE $MSG < system+lost > MOVE T,(P) ; GET SPACE SUB T,STRUSD ; SUBTRACT AMOUNT USED SUB T,STRTAL ; AND AMOUNT FREE PUSHJ P,DECOU6 ; TYPE IT $MSG < total > POP P,T ; RESTORE TOTAL SPACE PUSHJ P,DECOU6 ; TYPE IT EOST: $MSG < * Using over 500 blocks > TLZN F,L.EVAL ; DID WE ENCOUNTER A # WE COULDN'T EVALUATE? JRST EVAL ; NO $MSG <+ Could not be evaluated > EVAL: $MSG < Logged out user holding most space: [> HLRZ T,BADPPN PUSHJ P,OCTOUT $MSG <,> HRRZ T,BADPPN PUSHJ P,OCTOUT $MSG <] User with most space overall: [> HLRZ T,WSTPPN PUSHJ P,OCTOUT $MSG <,> HRRZ T,WSTPPN PUSHJ P,OCTOUT $MSG <] > TLZN F,L.COMA JRST SPACEL SETZM FILE SETZM EXT PUSHJ P,COML1 JRST SPCCAL EOSYS: TLNN F,L.DSK JRST EOSY2 $MSG < Total used on all structures : > MOVE T,TOTUSD PUSHJ P,DECOUT SKIPE IPPN JRST EOSY1 $MSG < Total free on all structures : > MOVE T,TOTFRE PUSHJ P,DECOUT EOSY1: PUSHJ P,CRLF EOSY2: PUSHJ P,CRLF RELEAS LST, ; CLOSE THE LISTING FILE CALLI 1,12 ; EXIT JRST SPCUSG ; IN CASE OF CONTINUE CTLMSG: HRLI A,(POINT 7,) CTLML1: ILDB CH,A JUMPE CH,CPOPJ PUSHJ P,CTLTYO JRST CTLML1 CTLTYO: SOSG CTLHED+2 OUTPUT CTL, IDPB CH,CTLHED+1 POPJ P, CTLM1: ASCIZ \; Dummy job submitted by SPCUSG ; because your quota had not been recomputed ; or because you exceeded your logged out disk quota. .MOUNT \ CTLM2: ASCIZ \: .DIRECT /F/W .R QUOLST \ SUBTTL SUBROUTINES COLON: MOVEI CH,":" JRST TYO TAB: MOVEI CH,11 TYO: SOSLE OHED+2 JRST TYOOK OUT LST, SKIPA JRST LSTERR TYOOK: IDPB CH,OHED+1 TLNN F,L.TTY POPJ P, CAIN CH,12 OUTPUT LST, CPOPJ: POPJ P, LSTERR: PUSHJ P,ERR E$$OEL: ASCII /OEL/ OUTSTR [ASCIZ / Output error on listing device /] EXIT MSG: HRLI T,(POINT 7,) MSGL: ILDB CH,T JUMPE CH,CPOPJ PUSHJ P,TYO JRST MSGL CRLF: JSP T,MSG ASCIZ / / MONTAB: ASCIZ /Jan/ ASCIZ /Feb/ ASCIZ /Mar/ ASCIZ /Apr/ ASCIZ /May/ ASCIZ /Jun/ ASCIZ /Jul/ ASCIZ /Aug/ ASCIZ /Sep/ ASCIZ /Oct/ ASCIZ /Nov/ ASCIZ /Dec/ UNIERR: PUSHJ P,ERR E$$IND: ASCII /IND/ OUTSTR [ASCIZ / Input device /] PUSHJ P,TYSIX OUTSTR [ASCIZ /: not a DSK structure/] JRST COMERX ; OUTPUT SIXBIT WORD ON TTY ; T POINTS TO SIXBIT WORD TYSIX: HRLI T,(POINT 6,) ; SIXBIT BP TYS: ILDB CH,T JUMPE CH,CPOPJ ADDI CH,40 ; MAKE ASCII OUTCHR CH TLNE T,77B23 JRST TYS POPJ P,0 NOSTR: PUSHJ P,WRN E$$CAS: ASCII /CAS/ OUTSTR [ASCIZ / Can't access structure "/] MOVEI T,STRUCT ; TYPE OUT THE LOSING STR PUSHJ P,TYSIX OUTSTR [ASCIZ /" /] JRST SPACEL MINUS: MOVEI CH,"-" JRST TYO DECPR2: MOVEI CH,"0" CAIG T,11 PUSHJ P,TYO DECOUT: CAMN T,[.INFIN] JRST INFINI SKIPGE T PUSHJ P,MINUS MOVMS T IDIVI T,12 HRLM T1,(P) SKIPE T PUSHJ P,DECOUT HLRZ CH,(P) ADDI CH,"0" JRST TYO PPNOUT: PUSH P,T ; LINE-UP THE PROJECT CODE HLRZ T,T ..Z==7B20 REPEAT 5,< TRNN T,..Z PUSHJ P,BLANK ..Z==<..Z!<..Z_<-3>>>> HLRZ T,(P) PUSHJ P,OCTOUT MOVEI CH,"," PUSHJ P,TYO HRRZ T,(P) PUSHJ P,OCTOUT POP P,T POPJ P, OCTOUT: SKIPGE T PUSHJ P,MINUS MOVMS T IDIVI T,10 HRLM T1,(P) SKIPE T PUSHJ P,OCTOUT HLRZ CH,(P) ADDI CH,"0" JRST TYO SIXOUT: MOVE T3,[POINT 6,T] SIXOUL: ILDB CH,T3 JUMPE CH,CPOPJ ADDI CH,40 PUSHJ P,TYO TLNE T3,77B23 JRST SIXOUL POPJ P, BLANK: MOVEI CH,40 JRST TYO DHEAD: TLOE F,L.TTLD ; SEE IF STR TITLE DONE YET POPJ P, ; YES--RETURN SKIPN IPPN ; SEE IF SINGLE USER PUSHJ P,CRLF ; NO--SET IT OFF FROM PREVIOUS LINES PUSHJ P,HEAD ; GIVE MASTER TITLE IF NEEDED TLNE F,L.TTY ; TTY? JRST DHT ; YES MOVEI T,STRUCT ; MONITOR STR PROCESSING PUSHJ P,TYSIX OUTSTR [ASCIZ / /] DHT: SKIPN IPPN ; IF MULTI-USER, PUSHJ P,CRLF ; END LINE PJRST CRLF ; GIVE A BLANK LINE HEAD: MOVEI CH,.CHFFD ; OUTPUT A FORM-FEED TLOE F,L.FPAG ; FIRST PAGE HEADER? PUSHJ P,TYO ;NO--OUTPUT PUSH P,.JBFF## ;SAVE .JBFF MOVX A,UU.PHY ;INDICATE ASCII/PHYSICAL MOVE B,STRUCT ;GET DEVICE MOVEI C,IHED ;POINT TO BUFFER POINTERS OPEN TXT,A ;OPEN DEVICE JRST HD4 ;CAN'T! MOVSI A,'STR' ;GET STR MOVSI B,'TXT' ; .TXT MOVEI C,0 ; MOVE D,SYSPPN ; [1,4] LOOKUP TXT,A ;OPEN FILE JRST HD4 ;NOT THERE HD2: SOSGE IHED+.BFCTR ;COUNT DOWN BYTES JRST [INPUT TXT, ;GET ANOTHER BUFFER STATO TXT,IO.EOF ;SEE IF DONE JRST HD2 ;NO--LOOP ON JRST HD3] ;YES--DONE ILDB CH,IHED+.BFPTR ;GET NEXT BYTE MOVE T,@IHED+.BFPTR ;GET WORD TRNE T,1 ;SEE IF SEQUENCED JRST [AOS IHED+.BFPTR ;YES--ADVANCE ANOTHER WORD MOVNI T,5 ;AND TOTAL OF 6 CHARS ADDM T,IHED+.BFCTR ; .. JRST HD2] ;AND TRY AGAIN JUMPE CH,HD2 ;DISCARD NULLS PUSHJ P,TYO ;OUTPUT IT JRST HD2 ;LOOP UNTIL DONE HD3: PUSHJ P,CRLF ;END OF LINE PUSHJ P,CRLF ;AND A BLANK HD4: RELEAS TXT, ;CLEAR CHANNEL POP P,.JBFF## ;RESTORE .JBFF $MSG < *** > MOVE T,STRUCT ; GET STR NAME PUSHJ P,SIXOUT ; TYPE IN SIXBIT $MSG < ***> JSP T,MSG ASCIZ / Proj,Prog Qta in Qta out Used Unit Login? Free Last In / DECTAB: PUSH P,T PUSHJ P,DECOU6 POP P,T CAME T,[.INFIN] CAMG T,[EXP ^D9999999] JRST TAB JRST BLANK INFINI: JSP T,MSG ASCIZ /+Infin/ QJOB: MOVE T,[QDATAH,,QDATA] ;COPY TO LOW SEG BLT T,QEND-1 MOVE T,QFILN MOVEM T,QFNAM MOVE T,USER MOVEM T,QUSER MOVEM T,QUSR2 MOVEM T,QUSR3 MOVE T,STRUCT ;GET THIS STRUCTURE MOVEM T,LSTR ;USE FOR LOG FILE MOVE T,QSTR ;GET QUE STR MOVEM T,CSTR ;THAT'S WHERE CTL IS MOVE A,[QSIZ,,QDATA] PJRST .QUEER## DECOU6: MOVM N1,T JUMPL T,DECOX6 CAIG N1,^D99999 PUSHJ P,BLANK DECOX6: CAIG N1,^D9999 PUSHJ P,BLANK CAIG N1,^D999 PUSHJ P,BLANK CAIG N1,^D99 PUSHJ P,BLANK CAIG N1,^D9 PUSHJ P,BLANK JRST DECOUT MAKFCT: MOVEI A,.FACT ;GET FACT FUNCTION MOVEM A,FACTH ;SET FOR DAEMON MOVEI A,FE$SPC DPB A,[POINT 9,FACTB,8] PJOB A, DPB A,[POINT 9,FACTB,17] MOVNI A,1 GETLCH A MOVEI T,(A) TXNE A,GL.CTY MOVNI T,1 GETLIN A, TLNN A,-1 MOVNI T,2 DPB T,[POINT 12,FACTB,29] MOVEI T,FACTBL DPB T,[POINT 6,FACTB,35] MOVE A,IOB2+.RBNAM ; USER'S PPN MOVEM A,FACTB+1 SETZM FACTB+2 MOVE A,STRUCT MOVEM A,FACTB+3 MOVE A,IOB2+.RBSTS TRNE A,RP.NDL ; SEE IF NON-RENAMEABLE POPJ P, ; YES--GIVE UP MOVEM A,FACTB+4 MOVE A,IOB2+.RBQTF MOVEM A,FACTB+5 MOVE A,IOB2+.RBQTO MOVEM A,FACTB+6 MOVE A,IOB2+.RBQTR MOVEM A,FACTB+7 MOVE A,IOB2+.RBUSD MOVEM A,FACTB+10 MOVE A,STRTAL MOVEM A,FACTB+11 MOVE A,INOURE MOVEM A,FACTB+12 MOVE A,[FACTBL+1,,FACTH] DAEMON A, TLOE F,L.DAER POPJ P, $MSG < % DAEMON UUO failed > POPJ P, IFN FTUSAGE,< ;HERE TO MAKE A USAGE ENTRY SIMILAR TO THE FACT ENTRY. SINCE THIS DISTRIBUTED ; ACTDAE DOES NOT HAVE ANY PREDEFINED USER ENTRIES, MODIFICATIONS WILL ; HAVE TO BE MADE TO ACTRCD.MAC TO INCLUDE A DEFINITION FOR THE RECORD ; THAT WILL BE PRODUCED FROM THIS SUBROUTINE. THE RECORD TYPE (NUMBER) ; OF THIS RECORD WILL DEPEND ON OTHER CUSTOMER DEFINED ENTRIES YOU PUT ; IN ACTRCD AND THE ORDER THEY ARE ENTERED SO THIS ROUTINE WILL MAKE A ; 9999 RECORD WHICH IS SURELY ILLEGAL AND WILL HAVE TO BE CHANGED. SO ; THAT MODIFICATIONS WILL NOT BE REQUIRED TO ACTSYM.MAC TO DEFINE DEFUS ; ITEM NUMBERS, ITEM NAMES CHOSEN HERE ARE THOSE CLOSE TO ONES ALREADY ; DEFINED BUT IN SOME CASES ARE NOT MNEMONICALLY MEANINGFUL, THEY JUST ; CAUSE THE CORRECT DATA CONVERSION. ;THE FOLLOWING LINES SHOULD BE PLACED IN ACTRCD.MAC TO ACCOMODATE THIS EXAMPLE. ; THEY SHOULD BE PLACED IN THE "ENLIST" AND "RCLIST" MACRO DEFINITIONS ; DESIGNATED AS THOSE DEFINING USER ENTRIES 5000-9999. ;ENLIST - ENTRY (FO2,) ;ENTRY xxxx - SPACE EXAMPLE ;RCLIST - RECORD (BA2,1,1,) MAKUSG: MOVE T1,IOB2+.RBSTS ;GET RIB STATUS TRNE T1,RP.NDL ;NON-DELETABLE POPJ P, ;YES, NO SPACE ENTRY SO NO USAGE ENTRY PJOB T1, ;GET OUT JOB NUMBER MOVEM T1,MONJNO ;STORE IT FOR QUEUE. SETZM MONNOD ;ASSUME DETACHED SETZM MONLNO ;... MOVSI T,(ASCIZ/D/) ;ASSUME DETACHED TRMNO. T1, ;GET TERMINAL DESIGNATOR JRST SETTN1 ;DETACHED DPB T1,[POINT 9,MONLNO,35] ;STORE IN CASE NO NETWORKS GETLCH T1 ;GET LINE CHARACTERISTICS MOVSI T,(ASCIZ/T/) ;ASSUME REGULAR TTY TXNE T1,GL.CTY ;THE SYSTEM CTY MOVSI T,(ASCIZ/C/) ;YES TXNE T1,GL.ITY ;INVISIBLE (PSEUDO) TTY MOVSI T,(ASCIZ/P/) ;YES HRRZS T1 ;GET RID OF GETLCH BITS GTNTN. T1, ;CONVERT TO NODE AND LINE JRST SETTN1 ;NO NETWORKS HRRZM T1,MONLNO ;STORE REAL LINE NUMBER HLRZ T3,T1 ;ISOLATE NODE NUMBER MOVEI T2,2 ;NUMBER OF ARGUMENTS MOVE T1,[.NDRNN,,T2] ;RETURN NODE NAME FOR NUMBER NODE. T1, ;ASK TODD SKIPA ;FAILED? MOVEM T1,MONNOD ;STORE SIXBIT NODE NAME SETTN1: MOVEM T,MONTDE ;STORE TERMINAL DESIGNATOR MOVE T1,[ACBLEN,,ACTBLK] ;LENGTH,,ADDRESS OF PARAMETERS QUEUE. T1, ;ASK ACTDAE TO MAKE THE RECORD TROE F,R.QUUR ;ONLY TELL ONCE POPJ P, $MSG < % QUEUE. UUO failed > POPJ P, ;Use the macros from ACTSYM to generate a DEFUS list for the supplied data items ACTBLK: USENT. (^D9999,1,1,20,RESBLK) ;ENTRY TYPE, VERSION NUMBERS ;AND LENGTH,ADDRESS OF RESPONSE BLOCK. ;The DEFUS list proper. These do not have to be in any particular order. They ; are entered here in the order of the data items described in the record ; definitions in ACTRCD. ;Record 1 - Entry Header USJNO. (MONJNO) ;THE JOB NUMBER USTRM. (MONTDE) ;TERMINAL DESIGNATOR USLNO. (MONLNO) ;LINE NUMBER USPNM. (,US%IMM) ;PROGRAM NAME (IMMEDIATE DATA ITEM) USPVR. (.JBVER##) ;PROGRAM VERSION NUMBER USNOD. (MONNOD) ;NODE NAME ;Record 2 - User Data USPPN. (IOB2+.RBNAM) ;PPN USDFS. (STRUCT) ;STRUCTURE USLIQ. (IOB2+.RBQTF) ;LOGGED IN QUOTA USLOQ. (IOB2+.RBQTO) ;LOGGED OUT QUOTA USRIN. (IOB2+.RBQTR) ;RESERVED QUOTA USTUS. (IOB2+.RBUSD) ;TOTAL BLOCKS USED USTAL. (STRTAL) ;STRUCTURE FREE SPACE USDSP. (INOURE) ;IN/OUT/RECOMP ACBLEN==.-ACTBLK ;LENGTH OF QUEUE. ARGUMENT BLOCK RELOC ;SWITCH TO LOW SEGMENT RESBLK: BLOCK 20 ;ROOM FOR A RESPONSE MONJNO: BLOCK 1 ;JOB NUMBER MONTDE: BLOCK 1 ;TERMINAL DESIGNATOR MONLNO: BLOCK 1 ;LINE NUMBER MONNOD: BLOCK 1 ;NODE NAME RELOC ;BACK TO CODE SEGMENT > ;END FTUSAGE RELOC ;SWITCH TO LOW SEG QDATA:! ;LABEL IT RELOC ;BACK TO HI SEG QDATAH: PHASE QDATA QDATA:! 0 REPEAT .QIHED+2*, LIST DEFINE Q$ ($QLOC,$SPEC),< $$Q==0 IFIDN <$SPEC>,<$$Q==1+.QIHED>;;CTL FILE IFIDN <$SPEC>,<$$Q==1+.QIHED+>;;LOG FILE RELOC QDATAH+$$Q+Q.'$QLOC PHASE QDATA+$$Q+Q.'$QLOC > DEFINE B$ (ARGS$),< BB$==0 IRP ARGS$,< BB$==BB$! > BB$ > DEFINE BBB$ (ARG$), < BBBB$ (ARG$) > DEFINE BBBB$ (MASK$,VAL$), < INSVL. (VAL$,MASK$) > Q$ OPR B$ <,> ;SPACE PROGRAM,CREATE Q$ LEN B$ <,,> ;HEADER LENGTH,FILE LEN,NUM FILES Q$ DEV SIXBIT /INP/ Q$ PPN QUSER:! 0 Q$ JOB SIXBIT /SPCUSG/ ; JOB NAME Q$ PRI B$ <> ; PRIORITY Q$ USER SIXBIT /SYSTEM-ADMIN/ ;USER NAME Q$ IDEP B$ <,> ;UNIQUE, /Z:1 Q$ ILIM B$ <,> ;/CORE:1K,/TIME:300 Q$ ILM2 B$ <> ;/PAGES:10 Q$ IDDI QUSR3:! 0 Q$ FSTR,C CSTR:! 0 ;CTL STRUCTURE Q$ FDIR,C 1,,2 ;CTL DIRECTORY Q$ FNAM,C QFNAM:! 'SPCUSG' ;CTL FILE NAME Q$ FEXT,C 'CTL ' ;CTL EXTENSION Q$ FMOD,C B$ <,,,,> ;/SPAC:1,/PRINT:ARROW,/FILE:ASCII,/DISP:PRES,/COP:1;CTL MODIFIERS Q$ FSTR,L LSTR:! 0 ;LOG STRUCTURE Q$ FDIR,L QUSR2:! 0 ;LOG DIRECTORY Q$ FNAM,L 'SPCUSG' ;LOG FILE NAME Q$ FEXT,L 'LOG ' ;LOG EXTENSION Q$ FMOD,L B$ <,,,,,,> ;/LOG,/NEW,/SPAC:1,/PRINT:ARROW,/FILE:ASCII,/DISP:DEL,/COP:1 ;LOG MODIFIERS QEND==QDATA+1+.QIHED+2* QSIZ==QEND-QDATA DEPHASE RELOC QDATA ;SWITCH TO LOW SEG QDATA:! BLOCK QSIZ ;MAKE ROOM RELOC QDATAH+QSIZ ;BACK TO HI SEG QUEUEM==:'SPA' QUEUEN==:'CE ' SUBTTL COMMAND ACQUISITION COMAND: SKPINL ; CLEAR ^O JFCL OUTSTR [ASCIZ /*/] SETZM COMDAT ; ZERO COMMAND BLOCK MOVE T,[COMDAT,,COMDAT+1] BLT T,COMDX TLZ F,L.ARO+L.ANY ; CLEAR COMMAND FLAGS COML1: PUSHJ P,FILSPC ; GO GET A FILE SPECIFICATION COM2: CAIN CH,"/" JRST SWITCH ; SWITCH BREAK CAIN CH,"=" JRST ARROW ; ARROW BREAK CAIE CH,"," ; MULTIPLE UNITS? CAIG CH,33 JRST BREAK ; BREAK BREAK COMERR: PUSHJ P,ERR ;ISSUE ERROR E$$CME: ASCII /CME/ OUTSTR [ASCIZ / Command error/] COMERX: OUTSTR [ASCIZ \ Type /HELP for help \] ; DON'T TELL USER WHAT'S WRONG, JUST TELL'EM HE NEEDS HELP! JRST SPCUSG ; REENTER SWITCH: PUSHJ P,SIXBRD ; GO GET A SIXBIT SWITCH IN A JUMPE A,COMERR ; ERROR IF NO SWITCH FOUND SETOB B,N1 TDNN B,A ; MAKE SWITCH MASK IN B JRST SW2 LSH B,-6 JRST .-3 SW2: MOVSI N,-SWITCN ; MAKE TABLE POINTER SW2A: MOVE C,SWTAB(N) ; LOAD RECOGNIZED SWITCH TDZ C,B ; CLEAR UNUSED BITS FOR LEGAL ABBREVIATIONS CAMN A,C ; LEGAL SWITCH? JRST SW1 ; YES SW3: AOBJN N,SW2A ; NO, LOOP UNLESS WE'RE DONE MOVEI A,0 ; CLEAR SWITCH JUMPL N1,COMERR ; BAD SWITCH TYPED JUMPE N1,HELP ; HELP TYPED TDO F,SWTAB1(N1) ; GET PRIV. FLAGS TLNN F,L.GOD ; IF HE'S GOD . TDNN F,[L.FACT!L.BATC,,R.USG] ; OR ONE OF HIS APOSTLES . JRST COM2 ; THEN HE'S A GOOD GUY! PUSHJ P,ERR ;ERROR E$$SIU: ASCII /SIU/ OUTSTR [ASCIZ / Switch illegal unless logged in as [1,2]/] JRST COMERX ; IF NOT - TELL HIM SW1: JUMPGE N1,COMERR ; ILLEGAL SWITCH? HRRZ N1,N ; NO, VALIDATE USER PRIV. JRST SW3 SWTAB: SIXBIT /HELP/ SIXBIT /BATCH/ SIXBIT /FACT/ IFN FTUSAGE, SWITCN==.-SWTAB SWTAB1: 0 L.BATC,,0 L.FACT,,0 IFN FTUSAGE,<0,,R.USG> HELP: MOVE A,['SPACE '] ; HERE WHEN HELP TYPED PUSHJ P,.HELPR## JRST SPCUSG ARROW: TLOE F,L.ARO JRST COMERR MOVE T,DEV MOVEM T,ODEV MOVE T,FILE MOVEM T,OFILE MOVE T,EXT MOVEM T,OEXT MOVE T,PPN MOVEM T,OPPN JRST COML1 BREAK: SKIPN FILE SKIPE EXT JRST COMERR MOVE T,PPN MOVEM T,IPPN SKIPN T,DEV MOVSI T,'DSK' MOVEM T,IDEV TLNN F,L.ANY!L.ARO!L.COMA JRST BREAK1 POPJ P, BREAK1: CAIE CH,3 CAIN CH,32 MONRT. JRST COMAND SIXBRD: MOVEI A,0 ; PREPARE SIXBIT BYTE POINTER TO A MOVE B,[POINT 6,A] SIXBRL: PUSHJ P,TYI ; GET ASCII CHARACTER CAIN CH,"," TLO F,L.COMA CAIG CH,"Z" ; ALPHA? CAIGE CH,"A" SKIPA ; NO JRST SIXLTR ; YES CAIG CH,"9" ; DIGIT? CAIGE CH,"0" JRST [SKIPE A TLO F,L.ANY POPJ P,] ; NO SIXLTR: SUBI CH,40 ; MAKE SIXBIT TLNE B,77B23 ; OVERFLOW? IDPB CH,B ; NO, DEPOSIT SIXBIT CHARACTER INTO A JRST SIXBRL ; LOOP TYI: INCHWL CH ; GET TERMINAL CHARACTER CAIE CH,.CHDEL ; IGNORE RUBOUTS AND CARRIAGE RETURNS CAIN CH,.CHCRT JRST TYI JUMPE CH,TYI ; IGNORE NULLS CAIG CH,"Z"+40 ; CONVERT LOWER CASE TO UPPER CAIGE CH,"A"+40 SKIPA SUBI CH,40 CAIE CH,40 ; IGNORE SPACES AND TABS CAIN CH,.CHTAB JRST TYI POPJ P, ; RETURN WITH SIXBIT CHARACTER IN CH FILSPC: SETZM FILE ; FIRST CLEAR APPROPRIATE WORDS SETZM DEV SETZM EXT SETZM PPN TLZ F,L.BKT+L.DOT ; AND FLAGS FILSPL: PUSHJ P,SIXBRD ; GO GET FILE SPEC., CONVERTED TO SIXBIT IN A FILSP2: CAIN CH,":" ; DEVICE? JRST CCOLON ; YES CAIN CH,"." ; FILE? JRST DOT ; YES CAIN CH,"[" ; PPN? JRST BRAKET ; YES FSTHRU: TLNE F,L.ARO JRST CCOLON TLZN F,L.DOT ; CLEAR FLAG & SKIP IF ALREADY SET JRST FSTHR1 ; FLAG NOT PREVIOUSLY SET HLLOM A,EXT ; SAVE EXTENSION MOVEI A,0 ; CLEAR WORD FSTHR1: SKIPN A ; DO WE HAVE A SPECIFICATION? POPJ P, ; NO SKIPE FILE ; YES, DO WE HAVE A FILENAME YET? JRST COMERR ; YES, ERROR MOVEM A,FILE ; SAVE THE FILENAME POPJ P, ; RETURN DOT: TLOE F,L.DOT ; SET DOT FLAG AND GIVE ERROR IF PREVIOUSLY SET JRST COMERR SKIPN A ; DO WE HAVE A SPECIFICATION? JRST FILSPL ; NO SKIPE FILE ; DO WE ALREADY HAVE A FILENAME? JRST COMERR ; YES, ERROR MOVEM A,FILE ; SAVE FILENAME JRST FILSPL ; LOOP CCOLON: CAIE CH,":" JUMPE A,CPOPJ SKIPE A SKIPE DEV JRST COMERR MOVEM A,DEV CAIL CH,33 CAIN CH,"," POPJ P,0 JRST FILSPL BRAKET: SKIPE PPN ; ERROR IF WE ALREADY HAVE A PPN JRST COMERR PUSHJ P,FSTHRU ; SAVE ANY REMAINING SPECIFICATION PUSHJ P,OCTIN ; GO GET THE PROJECT SKIPN N1 ;NULL? HLRZ N,MYPPN ;YES--USE LOGGED IN PROJECT JUMPE N,COMERR ; ERROR IF NULL TLNN N,-1 ; ERROR IF OVERFLOW OR IF NEXT CHAR. NOT A COMMA CAIE CH,"," JRST COMERR HRLM N,PPN ; SAVE THE PROJECT PUSHJ P,OCTIN ; GO GET THE PROGRAMMER # SKIPN N1 ;NULL? HRRZ N,MYPPN ;YES--USE LOGGED IN PROGRAMMER JUMPE N,COMERR ;ERROR IF NULL TLNE N,-1 ; ERROR ON OVERFLOW JRST COMERR HRRM N,PPN ; SAVE PROGRAMMER # CAIN CH,"]" ; TERMINATING RIGHT BRACKET? PUSHJ P,TYI ; NO, GET ANOTHER CHARACTER CAIN CH,"," TLO F,L.COMA TLO F,L.ANY ; SET FLAG JRST FILSP2 ; AND PROCEED OCTIN: SETZB A,N ; CLEAR AC'S MOVEI N1,0 ; .. OCTINL: PUSHJ P,TYI ; GET TERMINAL CHARACTER CAIG CH,"7" ; DIGIT? CAIGE CH,"0" POPJ P, ; NO RETURN LSH N,3 ; ROUND UP ADDI N,-"0"(CH) ; AND ADD IN THIS ONE AOJA N1,OCTINL ; LOOP BACK ;ERR AND WARNING PREFIX PRINTERS ;PRESERVE ALL ACS ERR: CLRBFI ;CLEAR TYPE AHEAD SKPINL ;SUPPRESS ^O JFCL ; .. OUTSTR [ASCIZ \?\] JRST ERRWRN WRN: OUTCHR [ASCIZ \%\] ERRWRN: PUSH P,T ;SAVE TEMP GTMSG. T ;GET VERBOSITY TXNN T,JW.WPR ;SEE IF PREFIX JRST ERRWRX ;NO--THAT'S ALL OUTSTR [ASCIZ \SPC\] ;YES--ISSUE SPACE OUTSTR @-1(P) ;ISSUE PREFIX ERRWRX: POP P,T ;RESTORE TEMP CPOPJ1: AOS (P) ;SKIP PREFIX POPJ P, ;RETURN SUBTTL STORAGE PDP: XWD -LN$PDL,PDL-1 IOL: XWD -200,IOB-1 XLIST ;LITERALS LIT LIST RELOC PDL: BLOCK LN$PDL+1 IHED: BLOCK 3 OHED: BLOCK 3 STRUSD: BLOCK 1 TOTUSD: BLOCK 1 INOURE: BLOCK 1 ; SIXBIT IN OR OUT OR RECOMP STRTAL: BLOCK 1 ; FREE ON STRUCTURE FROM DSKCHR TOTFRE: BLOCK 1 ; TOTAL FREE ON ALL STRUCTURES STRUCT: BLOCK 1 USER: BLOCK 1 IOB2: BLOCK 26 IOB: BLOCK 200 FACTBL==13 FACTH: BLOCK 1 ; FACT FUNCTION FACTB: BLOCK FACTBL CTLHED: BLOCK 3 QSTR: BLOCK 1 QFILN: BLOCK 1 SJBFF: BLOCK 1 FFAPPN: BLOCK 1 MFDPPN: BLOCK 1 SYSPPN: BLOCK 1 MYPPN: BLOCK 1 ;LOGGED IN PPN SYSHDR: BLOCK 6 ; ROOM FOR SYSTEM HEADER LINE COMDAT: DEV: BLOCK 1 FILE: BLOCK 1 EXT: BLOCK 1 PPN: BLOCK 1 IDEV: BLOCK 1 IPPN: BLOCK 1 ODEV: BLOCK 1 OFILE: BLOCK 1 OEXT: BLOCK 1 OPPN: BLOCK 1 BADPPN: BLOCK 1 ; LOGGED OUT USER HOLDING MOST SPACE (PPN) BADUSR: BLOCK 1 ; BLOCKS TMPPPN: BLOCK 1 ; TEMPORARY PPN AND BLOCKS TMPSIZ: BLOCK 1 WSTPPN: BLOCK 1 ; USER HOLDING MOST SPACE OVERALL (PPN) WSTCAS: BLOCK 1 COMDX==.-1 END SPCUSG