.TITLE TRUNC .IDENT /02X.1/ ; EDIT #GCE01 20-AUG-1982 10:05:00 DR1:[3,1]TRUNC.MAC ; EDIT # 0035 4 May 1981 11:40:06 DB0:[300,377]TRUNC.MAC;67 ; PREVIOUS EDIT 9 Apr 1981 11:29:50 DR0:[300,377]TRUNC.MAC;66 ;[300,110]TRUNC.MAC ;S81 RSX TAPE .ENABL LC ; ; TASK TO TRUNCATE A FILE TO ITS LAST UTILIZED BLOCK. ; ; 12/30/77 ; ; J G DOWNWARD ; KMS FUSION, INC ; 3941 RESEARCH PARK DR. ; ANN ARBOR, MICH. , 48104 ; 313-769-8500 ; ; MODIFIED BY RAY VAN TASSLE, MOTOROLA ; TO FIX THINGS, MAKE IT BETTER, ; PRESERVE FILE DATES, ETC. ; ; FURTHER EDIT BY GLENN EVERHART, RCA, TO ENABLE THE ; AUTO COMMAND ON RUNNING WITH DELAY AND TO ADD SWITCHES ; TO CONTROL LISTING. SWITCHES ARE AS FOLLOWS: ; /ER - LIST ERRORS AS THEY OCCUR ; /RP - REPORT ON PROGRESS AND TOTALS AT END ; SWITCHES DEFAULT TO OFF TO PROVIDE A QUIET TRUNCATE. ; ; ; USES THE MATERIAL SUPPLIED ON .TRNCL IN THE SOFTWARE DISPATCH ; SYSTEM LIBRARIES ...SEQ 7 ; ; ; INPUTS TO .TRNCL: R0 CONTAINS THE ADDRESS OF THE FDB ; OUTPUTS: C BIT = 0 IF SUCCESSFUL, C=1 IF ERROR ; ; THE FILE IS OPENED, THEN CALL .TRNCL, THE FILE IS CLOSED BY .TRNCL. ; CALLING SEQUENCE ; ; MCR>TRU[NCATE] FNAME ; ; FNAME = NAME OF THE FILE TO BE TRUNCATED ; = DEV:[UIC]FILESPEC ; ; WILDCARD SPECIFIERS OF THE FORM: ; [*,*]*.*, NAME.*, *.EXT ; ARE PERMITTED. ; IF A WILDCARD TRUNCATE SEARCH ENCOUNTERS A FILE UNDER ; ITS CURRENT [UIC] TO WHICH IT DOES NOT HAVE THE PROPER ; ACCESS RIGHTS FOR TRUNCATING IT, IT IGNORS THE FILE RATHER ; THAN HALTING. NO ERROR MESSAGE IS PRODUCED. ; ; ; TASK BUILD FILE ; ; TRUNC/-FP/CP=TRUNC ; / ; UIC=[200,200] ! THIS TASK CAN BE RUN BY ALL USERS ; TASK =...TRU ; UNITS=2 ; ASG=TI:2 ; ASG=SY:1 ; PRI=60 ; STACK =32 ; // ; ; .MCALL GCMLB$,GCML$,CSI$,CSI$1,CSI$2,DIR$,QIOW$,QIOW$S,GLUN$S .MCALL FINIT$,FSRSZ$,FDBDF$,FDOP$A,CLOSE$,EXIT$S,OFID$U,OFID$R .MCALL FHDOF$,FDOF$L,NBOFF$,MRKT$S,CMKT$S,ASTX$S FHDOF$ DEF$L ; DEFNE FILE HEADER OFFSETS NBOFF$ DEF$L ; DEFINE NAME BLOCK OFFSETS LOCALLY ; ; READ AND DECODE THE COMMAND LINE ; ; ; TRUNC: FINIT$ ; INITIALIZE FSR GLUN$S #2,#HEADER ;COMMENT OUT NEXT LINE - GCE - ALLOW BUILT IN COMMANDS TO TRY TO WORK ; BR GCML ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! CMP HEADER,#"CO ; IF INVOKED FROM CO0, DO BUILT-IN COMMAND BNE GCML CMPB HEADER+2,#00 BNE GCML ;-- IT WAS, GO SHOVE THE INFO IN MOV #GE.EOF,G.ERR+GCLBLK MOV #CMLINE,GCLBLK+G.CMLD+2 MOV #CMLLEN,GCLBLK+G.CMLD BR CONTIN START: CMKT$S MOV #HEADER,R0 ; PRINT NUMBERS MOV #STR,R1 MOV #NFEXAM,R2 CALL $EDMSG SUB #HEADER,R0 BIT #SW.RP,SWITCH BEQ 1000$ ;IF NOT REPORTING FORGET THE QIO QIOW$S #IO.WVB,#2,#1,,,,<#HEADER,R0,#060> 1000$: CLR NFEXAM CLR NFTRUN CLR NBFREE ; DO OTHER FILES ON THIS COMMAND LINE BITB #CS.MOR,CSIBLK+C.STAT BNE NEXT GCML: GCML$ #GCLBLK ; GET COMMAND LINE BCC CONTIN ; NO ERROR, SO SKIP ARROUND CMPB #GE.EOF,GCLBLK+G.ERR ; END OF FILE? BNE SERR ; SYNTAX ERROR IF NOT EXIT: EXIT$S ; NO INPUT SO EXIT ; SERR: JMP SYNERR FERR: CALL DEVERR JMP START ; CONTIN: CLR WLDFLG ; ASSUME NO WILDCARDS TO START WITH TST ; IS ANYTHING TYPED BEQ START ; NO REPROMPT CSI$1 #CSIBLK,GCLBLK+G.CMLD+2,GCLBLK+G.CMLD ; CHECK SYNTAX BCS SERR ; ERROR IN SYNTAX FOUND TST ; JUST IN CASE A BUNCH OF SPACES FOLLOWED ; BY A ^Z WERE TYPED, CHECK TO BE SURE >0 ; PARSED CHARACTER IS IN THE CSIBLK BEQ EXIT ; ONLY ONE CHARACTER EXIT NEXT: CLR WLDFLG ; ASSUME NO WILDCARDS TO START WITH MOV #FDB,R0 ; FDB ADRESS IN R0 MOV #CSIBLK+C.DSDS,F.DSPT(R0) CSI$2 #CSIBLK,OUTPUT,#CSITBL ; DECODE THE FILE NAME BCS SERR ; SYNTAX ERROR IF NOT OKAY ; CHECK TO SEE IF SOME ONE TRIED USING THE FILSPEC=FILESPEC TYPE ; COMMAND LINE. IF SO, THIS IS A SYNTAX ERROR ; MOV #CSIBLK+C.STAT,R0 ; GET ADDRESS OF STATUS WORD BITB #CS.EQU,(R0) ; WAS AN EQUAL SIGN SEEN? BEQ 3$ ; IF EQ, NO EQUAL SIGN SEEN BR SERR ; THIS IS A SYNTAX ERROR ; NOW CHECK TO SEE IF WILD CARDS ARE SPECIFIED ; 3$: MOV #FDB,R0 ; FDB ADRESS IN R0 MOV #CSIBLK+C.DSDS,F.DSPT(R0) CALL ENOPEN BCC 20$ ; ALL OK SO SKIP ERROR MESSAGE BCS SERR ; ERROR (FCS) FOUND 20$: BIT #SW.RP,SWITCH ; ARE WE TO REPORT ANYTHING? BEQ 1001$ ; IF NOT, NO NEED FOR MARKTIME MRKT$S ,#5,#3,#REPORT ; MAKE PROGRESS REPORTS EVERY 5 MIN 1001$: BIT #NB.SFL,FDB+F.FNB+N.STAT ; ANY WILDCARDS? BEQ NEXTWC ; NO INC WLDFLG NEXTWC: CALL ENEXT ; FIND THE FILE BCS OPNERR ; IF CARRY SET, ERROR RET1: BR OPEN ; TRY AND OPEN FILE OPNERR: CMPB #IE.NSF,FDB+F.ERR ; IS IT NO SUCH FILE? BNE FERR ; NO, IT MUST BE AN FCS ERROR TST WLDFLG ; IS THIS A WILDCARD TRUNCATE BGT 10$ ; YES, THEN NSF IS THE NORMAL EXIT CALL DEVERR ; PRINT OUT FILE SPECIFIER JMP NOFILE ; NO FILE FOUND WITH THAT NAME 10$: JMP START ; AND BACK FOR MORE ; ; OPEN THE FILE AND CALL .TRNCL(TRUNCATE AND CLOSE) OPEN: MOV FDB+F.FNB,SAVFID; SAVE THE FILE ID FOR LATER MOV FDB+F.FNB+2,SAVFID+2 INC NFEXAM ; BUMP # OF FILES EXAMINED OFID$R #FDB ; OPEN IT TO SEE IF IT HAS ANY UN-USED BLOCKS BCS 17$ CLOSE$ BCS 7$ ; OPEN OR CLOSE ERROR ; ; CHECK TO SEE IF WE SHOULD BOTHER TO TRUNCATE IT. TST F.HIBK+2(R0) ; BYPASS EMPTY FILES BEQ 9$ TST F.HIBK(R0) ; DON'T WORRY IF IT IS QUITE LARGE BNE 9$ TST F.EFBK(R0) BNE 9$ MOV F.EFBK+2(R0),R1 ; HANDLE BYTE WITHIN BLOCK TST F.FFBY(R0) BNE 1$ SUB #1,R1 ;"DEC" DOESN'T MODIFY CARRY-BIT BCC 1$ ; CARRY SET MEANS THE FILE HEADER IS SCREWED UP, SAYING THAT THE ; FILE IS USING LESS THAN 0 BLOCKS (WHICH IS CLEARLY NOT POSSIBLE). ; I DON'T KNOW HOW KEATING MANAGED TO CREATE ONE LIKE THAT, BUT HE DID!!! ; SO IF/WHEN WE HIT ONE LIKE THAT, REPORT A FUNNY ERROR MESSAGE. ; THE REASON FOR CHECKING FOR THIS IS THAT IT SCREWS UP .TRNCL, WHICH ; TELLS F11ACP TO TRUNCATE THE FILE TO BE -1 BLOCKS LONG, WHICH ; BLOWS IT'S LITTLE MIND, AND TRU THEN GOES INTO AN ENDLESS LOOP, AS ; THE FIND-NEXT-FILE NEVER PROCEEDS. MOVB #IE.BHD,F.ERR(R0) ; BAD HEADER IS RIGHT!!!!!! BR 7$ 1$: SUB F.HIBK+2(R0),R1 BEQ 9$ ; NO WASTED BLOCKS INC NFTRUN ; BUMP # OF FILES TRUNCATED 18$: MOV SAVFID,FDB+F.FNB; RESTORE THE FILE ID MOV SAVFID+2,FDB+F.FNB+2 ; READ THE FILE REVISION DATE, TO RESTORE IT LATER ; (THIS IS THE MIN ADVANTAGE TO TRUNC... REVISION DATES DON'T GET SCREWED ; UP AS THEY DO BY PIP, WHICH PREVENTS INCREMENTAL BACKUPS...) QIOW$S #IO.RAT,#1,#1,,,,<#SAVFID,#RDDAT> OFID$U #FDB ; OPEN THE FILE BY ID BCC 8$ ; FILE OPENED WITHOUT ERRORS 7$: CALL DEVERR BR 9$ ;***** ERROR ON OPEN. IF IT WAS PRIV, IGNORE IT. 17$: CMPB F.ERR(R0),#IE.PRI BNE 7$ BR 9$ 8$: CALL .TRNCL ; CALL TRUNCATE AND CLOSE BCS 7$ ; FILE COULD EITHER NOT BE TRUNCATED ; OR CLOSED SUB R1,NBFREE ; BUMP # OF BLOCKS FREED QIOW$S #IO.WAT,#1,#1,,,,<#SAVFID,#WRDAT> ; WRITE BACK ORIGINAL DATE 9$: CLOSE$ #FDB ; CLOSE IT IN CASE IT IS STILL OPEN TST WLDFLG ; IS THIS A WILDCARD TRUNCATE? BGT 91$ ; YES, SO SKIP OVER JMP START ; NO ERRORS, SO CHECK FOR MORE 91$: JMP NEXTWC ;;;;;;; AST ROUTINE TO MAKE PROGRESS REPORTS EVERY 5 MINUTES REPORT: TST (SP)+ ; POP OFF PARM CALL 10$ ASTX$S IOT 10$: CALL $SAVALL MOV #HEADER+50,R0 ; PRINT NUMBERS MOV #PRGMSG,R1 MOV #NFEXAM,R2 CALL $EDMSG SUB #HEADER+50,R0 BIT #SW.RP,SWITCH ;REPORTING ANYTHING? BEQ 1002$ ;IF EQ NO, SKIP IT QIOW$S #IO.WVB,#2,#1,,,,<#HEADER+50,R0,#060> MRKT$S ,#5,#3,#REPORT ; MAKE PROGRESS REPORTS EVERY 5 MIN 1002$: RETURN ; ; ERROR MESSAGES NOFILE: MOV #NFLMSG,QIOW+Q.IOPL MOV #14.,QIOW+Q.IOPL+2 BR SYNERR DEVERR: MOV #FCSMSG+12+7,R0 MOVB FDB+F.ERR,R1 CLR R2 CALL $CBDSG MOVB #011,(R0)+ ; (TAB) MOV #FDB+F.FNB,R4 MOVB N.DVNM(R4),(R0)+ ;MOVE DEVICE NAME TO BANNER FIELD MOVB N.DVNM+1(R4),(R0)+ MOV N.UNIT(R4),R1 ;GET UNIT # CLR R2 ;SET FOR ZERO-SUPPRESSION CALL $CBTMG ;CONVERT TO ASCII OCTAL MOVB #':,(R0)+ ;INSERT COLON SEPARATOR BIT #NB.DIR,N.STAT(R4) ;DID USER SPECIFY A UIC FOR THIS FILE? BEQ GTDFLT ;NO, GO GET DEFAULT MOV FDB+F.DSPT,R2 MOV 4(R2),R1 ;YES, GET HIS UIC DESCRIPTOR LENGTH MOV 6(R2),R2 ; & LOCATION BR CPYUIC ;GO COPY TO OUTPUT BUFFER GTDFLT: CALL .RDFDR ;GET THE DEFAULT UIC LENGTH & LOCATION CPYUIC: MOVB (R2)+,(R0)+ ;COPY A CHARACTER TO OUTPUT SOB R1,CPYUIC ;COPY UNTIL ALL OF UIC IS MOVED MOV N.FNAM(R4),R1 ;CONVERT NAME CALL $C5TA MOV N.FNAM+2(R4),R1 CALL $C5TA MOV N.FNAM+4(R4),R1 CALL $C5TA BACKNM: CMPB -(R0),#40 ;DO WE HAVE TO BACK UP OVER SPACES? BEQ BACKNM ;YES INC R0 ;NO, MOVE POINTER BACK MOVB #'.,(R0)+ ;INSERT '.' BETWEEN NAME & EXTENSION MOV N.FTYP(R4),R1 ;CONVERT EXTENSION CALL $C5TA BACKEX: CMPB -(R0),#40 ;BACK UP OVER SPACES IN EXTENSION? BEQ BACKEX INC R0 ;RESTORE R0 TO PAST LAST NON-SPACE CHAR. MOVB #';,(R0)+ ;INSERT SEMI-COLON SEPARATOR MOV N.FVER(R4),R1 ;CONVERT VERSION # CLR R2 ;ZERO-SUPPRESS FLAG ON CALL $CBOMG ;CONVERT TO OCTAL SUB #FCSMSG,R0 BIT #SW.ER,SWITCH ;REPORTING ERR MESSAGES? BEQ 1004$ ;IF EQ NO. QIOW$S #IO.WVB,#2,#1,,,,<#FCSMSG,R0,#040> 1004$: RETURN SYNERR: BIT #SW.ER,SWITCH ;REPORTING OF ERR MSGS? BEQ 1005$ DIR$ #QIOW 1005$: JMP GCML ; TERMINAL QIO QIOW: QIOW$ IO.WLB,2,1,,,, ; ERROR MESSAGES SYNMSG: .ASCII <12>/TRU -- SYNTAX ERROR/<15> DEVMSG: .ASCII <12>/ /<15> .EVEN NFLMSG: .ASCII <12>/TRU -- NO SUCH FILE/<15> PRGMSG: .ASCII /TRU -- 5 minute progress report:%N/ STR: .ASCII /%M Files examined%N%M Files truncated successfully/ .ASCIZ /%N%M Un-used blocks released%N/ .EVEN ; COMMAND LINE MACROS AND DATA BLOCKS GCLBLK: GCMLB$ 1,TRU,CMLINE,2 CSI$ .EVEN ;BUILT IN COMMAND LINE ... TRUNCATE EVERYTHING POSSIBLE. CMLINE: .ASCII "LB:[*,*]*.*;*/RP/ER" CMLLEN=.-CMLINE .BLKB .-CMLINE+82. .EVEN CSIBLK: .BLKB C.SIZE ; CSI BLOCK ; .EVEN FCSMSG: .ASCII /TRU -- FCS ERROR / .EVEN HEADER: .BLKB 150. .even WLDFLG: .WORD 0 ; FLAG FOR WILD CARDS NFEXAM: .WORD 0 NFTRUN: .WORD 0 NBFREE: .WORD 0 .MCALL CSI$1,CSI$2,CSI$SW,CSI$SV,CSI$ND .EVEN SWITCH: .WORD 0 ;SWITCH MASK SW.RP=1 ;/RP = REPORT FILE PROGRESS (ELSE QUIET) SW.ER=2 ;/ER = REPORT ERRORS CSITBL: CSI$SW RP,SW.RP,SWITCH,SET,NEG CSI$SW ER,SW.ER,SWITCH,SET,NEG CSI$ND .EVEN DEV: .ASCII /SY:/ .EVEN ; I/O MACROS AND DATA BLOCKS FDOF$L FSRSZ$ 2 ; SET UP FOR ONE LUN FDB: FDBDF$ ; START OF FDB FDOP$A 1,CSIBLK+C.DSDS,DFNB DFNB: NMBLK$ ,,,SY,0 .EVEN SAVFID: .BLKW 2 ; AREA TO SAVE CURRENT FILE ID .WORD 0 ; ; F11ACP AREA TO READ AND LATER RESTORE THE FILE'S REVISION DATE ; THIS IS BECAUSE WE DON'T WANT TO COUNT THE FILE AS HAVING BEEN ; REVISED--ALL WE DID WAS MAKE IT SMALLER. RDDAT: .BYTE -15,17 ; READ REVISION DATE .WORD DATBUF,0 WRDAT: .BYTE 15,17 ; WRITE IT BACK .WORD DATBUF,0 DATBUF: .BLKB 17 .EVEN ; .END TRUNC