.TITLE TRUNC .IDENT /02X/ ; ; 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 ; ; ; ; 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 ; ; IF DEV IS OMITTED SY: IS THE DEFAULT. ; WILDCARD SPECIFIERS OF THE FORM ; *.*, NAME.*, *.EXT ; ARE PERMITTED. ; IF WILDCARDS ARE USED, THE VERSION DEFAULTS TO A ; WILDCARD AUTOMATICALLY. ; 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$ .MCALL FINIT$,FSRSZ$,FDBDF$,FDOP$A,CLOSE$,EXIT$S,OFID$U .MCALL FHDOF$,FDOF$L,NBOFF$ FHDOF$ DEF$L ; DEFNE FILE HEADER OFFSETS NBOFF$ DEF$L ; DEFINE NAME BLOCK OFFSETS LOCALLY ; COMMAND LINE MACROS AND DATA BLOCKS GCLBLK: GCMLB$ 1,TRU,HEADER,2 CSI$ .EVEN CSIBLK: .BLKB C.SIZE ; CSI BLOCK ; HEADER: .BLKB 82. STAT: .WORD 0 ; BUFFER FOR STATISTICS BLOCK .WORD 0 .WORD 0 WLDFLG: .WORD 0 ; FLAG FOR WILD CARDS .EVEN DEV: .ASCII /SY:/ .EVEN ; I/O MACROS AND DATA BLOCKS FDOF$L FSRSZ$ 1 ; SET UP FOR ONE LUN FDB: FDBDF$ ; START OF FDB FDOP$A 1,CSIBLK+C.DSDS ; ; READ AND DECODE THE COMMAND LINE ; ; A RATHER SNEAKY QUIRK POPS UP IN USING CSI$1 AND CSI$2. ; IF THE INPUT COMMAND LINE OMITS THE DEV: AND THE [UIC], ; NOTHING IS PLACED IN THE CSI FILE DESCRIPTOR BLOCK (POINTED TO BY ; C.DEVD ETC.). NOW ALL IS OK IF ONE JUST WISHES TO DECODE THE ; COMMAND LINE AND THEN OPEN THE FILE. OPEN ASSUMES THAT IF THE DEV ; AND UIC ARE MISSING IT SHOULD OPEN THE FILE USING THE CURRENT TERMINAL ; UIC AND THE DISK FROM WHICH THE TASK IS INITIALLY INSTALLED. ; ONE NEVER NOTICES A PROBLEM IF THE UTILITY IS RUN USING THE RUN $ ; CONVENTION. HOWEVER, IF THE UTLITY IS INSTALLED OFF OF DK0:(ASN SY:=SY:/LOGIN) ; THEN A USER WHOSE SYSTEM DEVICE IS DIFFERENT(ASN DKN:=SY:/LOGIN) ; THAT IT IS MANDATORY TO PUT IN A DEV: IN THE FILE SPEC, BECAUSE ; IF IT IS OMITTED THE UTILITY CAN NOT FIND THE FILE ON HIS SYSTEM DEVICE. ; ; THE MATTER IS FURTHER COMPLICATED IF .PARSE AND .FIND ARE TO BE ; USED. THEY WILL NOT PARSE AND FIND A FILE CORRECTLY IF THE COMMAND LINE ; ASSUMES THE DEVICE WILL DEFAULT TO SY:. THE SOLUTION TO THIS IS TO TST ; THE COMMAND LINE TO SEE IF A DEV: IS SPECIFIED. IF NOT INSERT A SY: ; ; ONE NICE FEATURE OF THIS QUIRK, AND (USING HINDSIGHT) A MUCH USED ; FEATURE OF THE COMMAND STRING INTERPRETERS, IS THAT ONCE A DEV: OR ; [UIC] IS SPECIFIED IN A COMMAND LINE, ALL SUBSEQUENT FILE SPECIFIERS ; CAN OMIT THEM. ; ; TRUNC: FINIT$ ; INITIALIZE FSR START: 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: JMP FCSERR ; 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 CSI$2 #CSIBLK,OUTPUT ; 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$: BITB #CS.WLD,(R0) ; ANY WILD CARDS BEQ 5$ ; IF EQ, NO WILD CARDS INC WLDFLG ; SET WILDCARD FLAG ; DO WE NEED TO INSERT A SY:? ; 5$: BITB #CS.DVF,(R0) ; WAS A DEVICE SPECIFIER FOUND IN THE CURRENT COMMAND BNE 15$ ; IF NE YES, SO DON'T FILL IN SY: ; NO SO, FIRST INITIALIZE THE DEVICE STRING IN THE CSIBLK ; TO BE 'SY0:' MOV #CSIBLK+C.DEVD,R0 ; GET ADDRES OF BYTE COUNT MOV #2,(R0) ; FIRST INSERT NEW BYTE COUNT MOV #CSIBLK+C.DEVD+2,R0 ; GET ADDRESS OF POINTER TO DEVICE STRING IN CSIBLK MOV #DEV,(R0) ; INSERT NEW ADDRESS TO DEVICE STRING 15$: MOV #FDB,R0 ; FDB ADRESS IN R0 MOV #FDB+F.FNB,R1 ; FNB ADDRESS IN R1 MOV #CSIBLK+C.DSDS,R2 ; DATASET POINTER IN R2 CLR R3 CALL .PARSE ; PARSE THE FDB BCC 20$ ; ALL OK SO SKIP ERROR MESSAGE BCS FERR ; ERROR (FCS) FOUND 20$: TST WLDFLG ; WILDCARD TRUNCATE? BEQ RETURN ; IF EQ NO BIS #NB.SVR, ; YES, SO ARBITRARILY WE WILL SET THE FLAG BIT ; TO INSURE ANY VERSION WILL BE TRUNCATED RETURN: CALL .FIND ; FIND THE FILE BCS OPNERR ; IF CARRY SET, ERROR TST WLDFLG ; IS THIS A WILD CARD TRUNCATE? BEQ OPEN ; IF EQ NO, SO GO DIRECTLY TO OPEN FILE CMP , ; DO WE HAVE A NEW FILE? BEQ RETURN ; NO, TRY AGAIN RET1: MOV , ; SAVE INDEX POINTER MOV , ; SAVE STATUS 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$: CLR ; RESET INDEX POINTER JMP START ; AND BACK FOR MORE ; ; OPEN THE FILE AND CALL .TRNCL(TRUNCATE AND CLOSE) OPEN: OFID$U #FDB ; OPEN THE FILE BY ID BCC 8$ ; FILE OPENED WITHOUT ERRORS CMPB #IE.PRI,FDB+F.ERR ; DID WE PERHAPS HAVE A PRIVLEGE VIOLATION? ; IF SO IGNORE IT AND CONTINUE BECAUSE FILES ; MAY BE ENTERED FROM ONE DIRECTORY INTO ANOTHER BNE FERR ; IT WASN'T A PRIVLEGE VIOLATION, SO IT'S AN FCS ERROR BR 9$ ; IT WAS A PRIVLEGE VIOLATION, SO DON' TRY AND TRUNCATE 8$: MOV #FDB,R0 ; PUT ADDRESS OF FDB INTO R0 CALL .TRNCL ; CALL TRUNCATE AND CLOSE BCS FERR ; FILE COULD EITHER NOT BE TRUNCATED ; OR CLOSED 9$: TST WLDFLG ; IS THIS A WILDCARD TRUNCATE? BGT 10$ ; YES, SO SKIP OVER JMP START ; NO ERRORS, SO CHECK FOR MORE 10$: MOV #FDB,R0 ; FDB ADDRESS IN R0 MOV #FDB+F.FNB,R1 ; FNB ADDRESS IN R1 MOV , ; RESET FOR .FIND MOV , ; BR RETURN ; AND LOOP SOMEMORE ; ; ERROR MESSAGES NOFILE: MOV #NFLMSG,QIOW+Q.IOPL MOV #14.,QIOW+Q.IOPL+2 BR SYNERR DEVERR: MOV #DEVMSG,QIOW+Q.IOPL ; POINT TO FILESPEC PRINTOUT MOV #30.,QIOW+Q.IOPL+2 ; SET FOR PRINTING UP TO 30 CARACTERS MOV #DEVMSG,R1 ; SET BUFFER POINTER AT START TST (R1)+ ; MOVE PAST LINE FEED MOV #CSIBLK+C.DEVD,R2 ; GET ADDRESS WHERE DEVICE STRING LENGTH IS STORED MOV (R2),R2 ; PICK UP BYTE COUNT MOV R2,R3 ; START RUNNING BYTE COUNT CMP R2,#28. ; BE SURE IT ISN'T TOO LONG BGE 70$ ; IF IT IS GO AWAY QUIETLY TST R2 ; IF EQ 0, SKIP PRINTING DEV: BEQ 12$ ; EQ ZERO SO SKIP 5$: MOV #CSIBLK+C.DEVD+2,R0 ; GET POINTER TO DEVICE STRING MOV (R0),R0 ; GET ADDRESS OF DEVICE STRING 10$: MOVB (R0)+,(R1)+ ; START FILLING BUFFER SOB R2,10$ ; AND FILL UNTIL DONE MOVB #':,(R1)+ ; INSERT A ":" 12$: MOV #CSIBLK +C.DIRD,R2 ; ADDRESS OF LENGTH OF DIRECTORY STRING MOV (R2),R2 ; PICKUP LENGTH OF STRING ADD R2,R3 ; KEEP RUNNING BYTE COUNT CMP R3,#28. ; GREATER THAN 28.? BGE 70$ ; YES, EXIT QUIETLY TST R2 BEQ 25$ MOV #CSIBLK+C.DIRD+2,R0 ; PICKUP ADDRESS OF POINTER TO DIRECTORY STRING MOV (R0),R0 20$: MOVB (R0)+,(R1)+ ; SHOVE OFF INTO BUFFER SOB R2,20$ ; UNTIL DONE 25$: MOV #CSIBLK+C.FILD,R2 ; ADDRESS OF LENGTH OF FILE NAME MOV (R2),R2 ; PICK UP LENGTH OF FILE NAME STRING ADD R2,R3 ; KEEP RUNNING BYTE COUNT CMP R3,#28. ; GREATER THAN 28 BYTES? BGT 70$ ; YES EXIT POLITELY MOV #CSIBLK+C.FILD+2,R0 ; PICK UP ADDRESS OF POINTER TO FILE NAME MOV (R0),R0 30$: MOVB (R0)+,(R1)+ ; SHOVE OFF INTO BUFFER SOB R2,30$ ; UNTIL DONE 50$: DIR$ #QIOW MOV #28.,R2 ; 28 SPACES TO NULL OUT MOV #DEVMSG+1,R1 ; START AFTER THE LINE FEED 60$: MOVB #40,(R1)+ ; INSERT SPACES SOB R2,60$ ; UNTIL DONE RTS PC 70$: EXIT$S ; WE ONLY SHOULD GET HERE IF A FILE SPEC STRING OVERFLOWS FCSERR: MOV #FCSMSG,QIOW+Q.IOPL MOV #16.,QIOW+Q.IOPL+2 MOV #FCSMSG+14,R0 MOVB FDB+F.ERR,R1 CLR R2 CALL $CBDSG SYNERR: DIR$ #QIOW JMP START ; TERMINAL QIO QIOW: QIOW$ IO.WLB,2,1,,,, ; ERROR MESSAGES SYNMSG: .ASCII <12>/SYNTAX ERROR/<15> DEVMSG: .ASCII <12>/ /<15> .EVEN FCSMSG: .ASCII <12>/FCS ERROR /<15> NFLMSG: .ASCII <12>/NO SUCH FILE/<15> .EVEN ; ; ; ; .END TRUNC