.TITLE FIN - Find String in Files .ENABLE LC .IDENT -000000- ;+ ; ABSTRACT: FIN ; ; THIS PROGRAM WILL PRINT OUT ALL FILES WHICH HAVE A SPECIFEC ; STRING CONTAINED IN THEM, AND PRINT THE LINES IN THE FILES ; WHICH CONTAIN THE STRING. ; ; OPERATING PROCEDURES: ; ; >FIN [ =] /SE: ; ;+001 MAY BE ANY LEGAL FILENAME TO WHICH THE OUTPUT WILL ;+001 BE WRITTEN. IF NOT SPECIFIED, OUTPUT WILL BE WRITTEN ;+001 TO THE USER TERMINAL (TI:). IF OUTPUT IS TO OTHER ;+001 THAN A TERMINAL (I.E., A FILE OR LP:) THE OUTPUT WILL ;+001 PRECEDED BY THE COMMAND LINE. MULTIPLE COMMANDS TO ;+001 THE SAME OUTPUT FILE (OR LP:) WILL BE DELIMITED BY A ;+001 LINE OF ASTERICKS. ;+001 ; MAY BE ANY LEGAL RSX-11M FILESPEC, AND MAY HAVE ; *-FILE NAMES. IF A * IS USED, THE VERSION DEFAULTS ; TO * AUTOMATICALLY. FOR EXAMPLE, X.MAC, TEST.*, *.PLI. ; ; MAY BE ANY STRING WITH THE FOLLOWING RESTRICTIONS: ; 1) EMBEDDED BLANKS AND TABS WILL BE IGNORED. ; 2) THE CHARACTERS ',', '=', '[', ']', '/', ':' AND ';' ; CANNOT BE USED IN THE STRING SINCE THEY ARE ; TREATED AS SPECIAL CHARACTERS BY THE COMMAND ; STRING INTERPRETER. ; ; WRITTEN: 3-AUG-78, -0.0.0-, BRUCE C. WRIGHT ; MODIFIED: ; VERIFIED: ; ; +001 MAY 1979 RAY FRENCH CHANGED OUTPUT QIO'S TO RECORD I/O ; AND ADDED OUTPUT FILESPEC. MINOR ; MODIFICATIONS TO OUTPUT TO IMPROVE ; READABILITY. ; +002 MAY 1979 RAY FRENCH ADDED LINE NUMBERS TO OUTPUT. ;- ; +BKC JAN 1982 BOHDEN CMAYLO ADDED /S1 /SZ /NA SWITCHES ;- ; ; ; Modified by:- ; ; Phil Stephensen-Payne, ; c/o Systime Ltd., ; Concourse Computer Centre, ; 432 Dewsbury Road, ; LEEDS LS11 7DF, ; England. ; .MCALL QIOW$,EXIT$S,SPWN$,WTSE$S,DIR$,ALUN$S .MCALL GCMLB$,GCML$,CSI$,CSI$1,CSI$2,CSI$SW,CSI$SV,CSI$ND .MCALL FINIT$,FSRSZ$,FDBDF$,FDOP$A,CLOSE$,OFID$R,GET$ .MCALL FDBF$R,FDRC$R .MCALL FHDOF$,FDOF$L,NBOFF$ .MCALL FDAT$A,NMBLK$,OPEN$W,PUT$ ;+001 ; ; MULTI-BUFFER COUNT ; MBCT = 2. ; .MACRO ERRMSG MSG .NCHR $$$, JSR R0,$TYPE .WORD $$$ .ASCII "MSG" .EVEN .ENDM FHDOF$ DEF$L ; DEFNE FILE HEADER OFFSETS NBOFF$ DEF$L ; DEFINE NAME BLOCK OFFSETS LOCALLY ; COMMAND LINE MACROS AND DATA BLOCKS GCLBLK: GCMLB$ 1,FIN,HEADER,2 CSI$ .EVEN CSIBLK: .BLKB C.SIZE ; CSI BLOCK .EVEN SWTABL: CSI$SW SE,SW.SE,SWORD,SET,,SVTABL CSI$SW S1,SW.S1,SWORD,SET,,SVTABL ; BKC- CSI$SW SZ,SW.SZ,SWORD,SET,,SZTABL ; BKC- CSI$SW NA,SW.NA,SWORD,SET,,SVTABL ; BKC- CSI$SW HE,SW.HE,SWORD,SET CSI$ND SVTABL: CSI$SV ASCII,STRBUF,STRLEN SZTABL: CSI$SV DECIMAL,SZBUFF,SZRLEN CSI$ND SWORD: .WORD 0 SW.SE = 000001 ;SE - SELECT SW.HE = 2 ; Help SW.S1 = 4 ; BKC- SEARCH FOR 1 WITHIN SX.SZ LINES SW.SZ = 10 ; BKC- SEARCH FOR 1 WITHIN # LINES SW.NA = 20 ; BKC- SEARCH FOR 1 AND RECORD NAME ONLY ; HEADER: .BLKB 82. .BLKB 50. ;+002 .BLKB 390. ;-BKC STAT: .WORD 0 ; BUFFER FOR STATISTICS BLOCK .WORD 0 .WORD 0 WLDFLG: .WORD 0 ; FLAG FOR WILD CARDS DIRBF: .BLKB 12. ; Buffer for UIC in ASCII DIRBFL: .WORD 0 ; Length of UIC string HLSPWN: SPWN$ MCR...,,,,,1,,,HELCMD,HELCML HELCMD: .ASCII /HELP FIN/ HELCML=.-HELCMD .EVEN DEVSIZ: .WORD 0 ;-BKC SIZE OF DEVICE DEVBUF: .BLKB 4 ;-BKC MAX SIZE DEVICE BUFFER .EVEN DEV: .ASCII /SY:/ .EVEN ; I/O MACROS AND DATA BLOCKS FDOF$L FSRSZ$ 2,MBCT* ; SET UP FOR ONE LUN. FDB: FDBDF$ ; START OF FDB FDOP$A 1,CSIBLK+C.DSDS BUFFER: .BLKB 1000 BUFLEN = .-BUFFER BUFEND: .WORD 0 LINFLG: .WORD 0 STRBUF: .BLKB 80. STRLEN = .-STRBUF SZBUFF: .WORD 128. SZRLEN = .-SZBUFF ; FDB1: FDBDF$ ;+001 - FDB FOR OUTPUT FILE FDAT$A R.VAR,FD.CR,132. ;+001 FDOP$A 3,,FDB1NM ;+001 FDB1NM: NMBLK$ ,,,SY,0 ASTER: .BYTE 12 ;+001 - LINE OF ASTERICKS FOR OUTPUT .REPT 10 ;+001 .ASCII /**********/ ;+001 .ENDR ;+001 .EVEN COMMD: .WORD 0 ;+001 - POINTER FOR START OF COMMAND COUNT: .BLKW 1 ;+002 - LINE COUNTER CLDSPT: .WORD 3,DEFDEV ;+001 - DATASET DESCRIPTOR FOR 'CL' .WORD 0,0,0,0 ;+001 DEFDEV: .ASCII /TI:/ .EVEN ; ; 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. ; ; FIN: FINIT$ ; INITIALIZE FSR ALUN$S #2,#"TI,#0 ; Assign prompt lun to TI: START: CLR SWORD ; Initialize mask word GCML$ #GCLBLK ; GET COMMAND LINE BCS 10$ ; ERROR? MOV #HEADER,R1 ;+001 - POINT TO COMMAND LINE MOV GCLBLK+G.CMLD,R2 ;+001 - SIZE IN R2 1$: CMPB #' ,(R1)+ ;+001 - SEARCH FOR A BLANK BEQ 2$ ;+001 SOB R2,1$ ;+001 MOV #HEADER,COMMD ;+001 - NO BLANKS, SO POINT TO START JMP CONTIN ;+001 2$: MOV R1,COMMD ;+001 - SAVE THE POINTER JMP CONTIN ; NO ERROR, SO SKIP AROUND 10$: CMPB #GE.IOR,GCLBLK+G.ERR ; I/O ERROR? BNE 20$ ; NO ERRMSG EXIT$S ; THIS IS FATAL 20$: CMPB #GE.OPR,GCLBLK+G.ERR ; OPEN ERROR? BNE 30$ ; NO ERRMSG JMP START ; RE-DO CMD LINE 30$: CMPB #GE.MDE,GCLBLK+G.ERR ; MAX @ DEPTH? BNE 40$ ; NO ERRMSG JMP START 40$: CMPB #GE.BIF,GCLBLK+G.ERR ; SYNTAX ERROR? BNE 50$ ; NO ERRMSG JMP START ; RE-START PGM 50$: CMPB #GE.EOF,GCLBLK+G.ERR ; END-OF-FILE? BEQ EXIT ; YES ERRMSG EXIT: CLOSE$ #FDB1 EXIT$S ; NO INPUT SO EXIT SERR: ERRMSG JMP START ; CONTIN: CLR WLDFLG ; ASSUME NO WILDCARDS TO START WITH TST ; IS ANYTHING TYPED BNE 1$ ; YES -- INTERPRET IT JMP START ; 1$: CLRB STRBUF ; NUL PAD THE STRING BUFFER. 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 BNE 2$ ; ONLY ONE CHARACTER EXIT JMP EXIT ;+001 2$: ;+001 ; DECODE THE COMMAND LINE AND OPEN OUTPUT FILE ; MOV #CSIBLK+C.STAT,R0 ; GET ADDRESS OF STATUS WORD MOV #"TI,N.DVNM+FDB1NM ; Default output to TI: if not given BITB #CS.EQU,(R0) ; WAS AN EQUAL SIGN SEEN? BNE 3$ ;+001 - IF SO, JUST CONTINUE JMP 20$ ;+001 - OTHERWISE JUMP 3$: MOV #"SY,N.DVNM+FDB1NM ; Default output to SY: if not given CSI$2 #CSIBLK,OUTPUT ;+001 - DECODE THE OUTPUT FILE BCS SERR ;+001 - CHECK FOR ERROR TST FDB1+F.FNB ;+001 - IS AN OUTPUT FILE OPEN? BEQ 10$ ;+001 - IF NOT, DON'T TRY TO CLOSE IT CLOSE$ #FDB1 ;+001 - CLOSE THE OLD ONE 10$: OPEN$W #FDB1,,#CSIBLK+C.DSDS ;+001 - OPEN THE OUTPUT FILE CSI$2 #CSIBLK,INPUT,#SWTABL ;+001 - DECODE THE INPUT FILE BCC CONT JMP SERR 20$: CSI$2 #CSIBLK,OUTPUT,#SWTABL ; DECODE THE FILE NAME BCC 30$ ; ANY ERRORS? JMP SERR ; IF SO, SYNTAX ERROR 30$: TST FDB1+F.FNB ;+001 - IS OUTPUT FILE OPEN? BNE CONT ;+001 - IF SO, DON'T TRY TO OPEN ONE CLR FDB1+F.DSPT ;+001 - MAKE SURE WE GET THE DEFAULT FILENAME OPEN$W #FDB1,,#CLDSPT ;+001 - OPEN THE DEFAULT OUTPUT FILE CONT: BIT #SW.HE,SWORD ; Help switch? BEQ 10$ ; If EQ no - process normally DIR$ #HLSPWN ; Yes - ask for help WTSE$S #1 ; Wait for it to finish CLOSE$ #FDB1 ; Close the output file JMP START ; Get next line ; 10$: CLR DIRBFL ; Initialize length to zero MOV CSIBLK+C.DIRD,R2 ; GET UIC SPEC LEN BLE 30$ ; NONE? MOV R2,DIRBFL ; Save the length MOV #DIRBF,R1 ; Set up buffer address MOV CSIBLK+C.DIRD+2,R3 ; GET UIC SPEC ADDR 20$: MOVB (R3)+,(R1)+ ; MOVE IN UIC SPEC SOB R2,20$ ; MOVE IN ALL OF UIC ; 30$: BITB #FD.TTY,FDB1+F.RCTL ;+001 - WRITING TO TTY ? BNE 50$ ;+001 - IF SO, SKIP ASTERICKS AND COMMAND BIT #SW.NA,SWORD ; BKC- CHECK IF NAME ONLY BNE 50$ ; BKC- YES, DO NOT PRINT TITLE TST FDB1+F.NRBD ;+001 - WAS FILE JUST OPENED ? BEQ 40$ ;+001 - THEN FORGET ASTERICKS PUT$ #FDB1,#ASTER,#81. ;+001 - WRITE LINE OF ASTERICKS 40$: PUT$ #FDB1,COMMD,GCLBLK+G.CMLD ;+001 - AND PRINT COMMAND 50$: ;+001 ; NOW CHECK TO SEE IF WILD CARDS ARE SPECIFIED ; MOV #CSIBLK+C.STAT,R0 ; GET ADDRESS OF STATUS WORD BITB #CS.WLD,(R0) ; ANY WILD CARDS BEQ 60$ ; IF EQ, NO WILD CARDS INC WLDFLG ; SET WILDCARD FLAG ; DO WE NEED TO INSERT A SY:? ; 60$: BITB #CS.DVF,(R0) ; WAS A DEVICE SPECIFIER FOUND IN THE CURRENT COMMAND BNE 70$ ; 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 70$: MOV CSIBLK+C.DEVD,R2 ;-BKC GET UIC SPEC LEN MOV R2,DEVSIZ ;-BKC SAVE THE LENGTH MOV #DEVBUF,R1 ;-BKC SET UP SPEC ADDR MOV CSIBLK+C.DEVD+2,R3 ;-BKC GET DEV SPEC ADDR 71$: MOVB (R3)+,(R1)+ ;-BKC MOVE IN DEV SPEC SOB R2,71$ ;-BKC MOVE IN ALL OF DEV 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 80$ ; ALL OK SO SKIP ERROR MESSAGE CALL FERR ; ERROR (FCS) FOUND JMP START ; AND RE-START. 80$: TST WLDFLG ; WILDCARD OPERATION? BEQ RETURN ; IF EQ NO BIS #NB.SVR, ; YES, SO ARBITRARILY WE WILL SET THE FLAG BIT ; TO INSURE ANY VERSION WILL BE OPENED RETURN: CALL .FIND ; FIND THE FILE BCS OPNERR ; IF CARRY SET, ERROR TST WLDFLG ; IS THIS A WILD CARD ? 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? BEQ 5$ ; YES 3$: CALL FERR ; NO, IT MUST BE AN FCS ERROR JMP START ; AND RE-START. 5$: TST WLDFLG ; IS THIS A WILDCARD OPERATION BEQ 3$ ; NO, NSF IS NOT NORMAL ; YES, NSF IS NORMAL. CLR ; RESET INDEX POINTER JMP START ; AND BACK FOR MORE ; ; OPEN THE FILE AND LOOK AT IT. ; OPEN: CLR LINFLG ; CLEAR HEADER PRINT FLAG. FDRC$R #FDB,#FD.PLC FDBF$R #FDB,,,#MBCT,#FD.RAH OFID$R #FDB ; OPEN THE FILE BY ID BCC LOOKA ; FILE OPENED WITHOUT ERRORS CALL FERR ; PRINT FILE ERROR 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 BEQ NXT ; PRIVLEGE VIOLATION - DON'T TRY TO OPEN CMPB #IE.VER,FDB+F.ERR ; PARITY ERROR ON DEVICE? BEQ NXT ; YES -- DON'T TRY TO OPEN CMPB #IE.BBE,FDB+F.ERR ; BAD BLOCK ON DEVICE? BEQ NXT ; YES -- DON'T TRY TO OPEN CMPB #IE.FHE,FDB+F.ERR ; FATAL HARDWARE ERROR? BEQ NXT ; YES -- DON'T TRY TO OPEN CMPB #IE.BCC,FDB+F.ERR ; BLOCK OR CRC ERROR? BEQ NXT ; YES -- DON'T TRY TO OPEN CMPB #IE.LCK,FDB+F.ERR ; LOCKED FROM WRITE? BEQ NXT ; YES -- DON'T TRY TO OPEN CMPB #IE.WAC,FDB+F.ERR ; ACCESSED FOR WRITE? BEQ NXT ; YES -- DON'T TRY TO OPEN CMPB #IE.CKS,FDB+F.ERR ;HEADER CHECKSUM FAILURE? BEQ NXT ; YES -- DON'T TRY TO OPEN CMPB #IE.RER,FDB+F.ERR ; DEVICE READ ERROR? BEQ NXT ; YES -- DON'T TRY TO OPEN CMPB #IE.SNC,FDB+F.ERR ; FID, FILE NUMBER CHECK? BEQ NXT ; YES CMPB #IE.SQC,FDB+F.ERR ; FID, SEQUENCE CHECK? BEQ NXT ; YES CMPB #IE.CLO,FDB+F.ERR ; NOT PROPERLY CLOSED? BEQ NXT ; YES CMPB #IE.BHD,FDB+F.ERR ; BAD FILE HEADER? BEQ NXT ; YES CMPB #IE.EXP,FDB+F.ERR ; EXPIRATION DATE ? BEQ NXT ; YES JMP START ; SOMETHING WORSE - GIVE UP. NXT: JMP NEXT ;+001 LOOKA: CLR COUNT ;+002 - CLEAR LINE COUNTER LOOK: INC COUNT ;+002 - INCREMENT LINE COUNTER BIT #SW.S1,SWORD ; BKC - TEST FOR ONE TIME ONLY BEQ 3$ ; BKC - NO, PROCESS NORMALLY CMP COUNT,SZBUFF ; BKC-DM CHECK FOR GT 128 BGT DONE 3$: GET$ #FDB,#BUFFER,#BUFLEN,FILERR MOV FDB+F.NRBD+2,R2 ; GET THE START OF THE BUFFER IN R2. MOV FDB+F.NRBD,R3 ; AND LENGTH OF BUFFER. ADD FDB+F.NRBD+2,R3 ; POINT TO LAST BYTE OF BUFFER. 5$: MOV R2,-(SP) ; SAVE BUFFER POINTER. MOV #STRBUF,R4 ; GET STRING ADDR MOV #STRLEN,R5 ; AND LENGTH 10$: TSTB (R4) ; AT END OF DATA? BEQ 15$ ; YES CMP R2,R3 ; OVER TOP OF BUFFER? BHIS 20$ ; CMPB (R2)+,(R4)+ ; CORRECT BYTE? BNE 20$ ; NO SOB R5,10$ ; AND LOOP OVER THE STRING. 15$: MOV (SP)+,R2 TST LINFLG ; PRINTED FILE NAME? BNE 16$ ; YES CALL PRTFIL ; NO -- PRINT IT. INC LINFLG ; SIGNAL LINE PRINTED. BIT #SW.NA,SWORD ; BKC- CHECK IF NAME ONLY BNE DONE ; BKC- YES, DONE ;00116$: MOV FDB+F.NRBD+2,QIOW+Q.IOPL ;001 MOV FDB+F.NRBD,QIOW+Q.IOPL+2 ;001 MOV #QIOW,-(SP) ;001 CALL .DIRDL 16$: MOV #HEADER,R0 ;+002 - BUFFER ADDRESS IN R0 MOV COUNT,R1 ;+002 - LINE NUMBER IN R1 MOV #3,R2 ;+002 - 3 BYTE TO CLEAR (ALSO NZS FLAG) JSR PC,$CBDMG ;+002 - CONVERT COUNT AND PUT IN BUFFER MOV #3,R2 ; 17$: MOVB #' ,(R0)+ ;+002 - BLANK 3 BYTES SOB R2,17$ ;+002 MOV FDB+F.NRBD+2,R1 ;+002 - GET BUFFER ADDRESS MOV FDB+F.NRBD,R2 ;+002 - GET BYTE COUNT ADD #10,R2 ;+002 - INCREASE BY 10 MOV R2,-(SP) ;+002 - SAVE IT 18$: MOVB (R1)+,(R0)+ ;+002 - ADD RECORD TO BUFFER SOB R2,18$ ;+002 PUT$ #FDB1,#HEADER,(SP)+,FILERR ;+001 - PRINT IT BIT #SW.S1,SWORD ; BKC - TEST FOR ONE TIME BEQ LOOK ; BKC - NO, CONTINUE NORMALLY BR DONE ; BKC - YES, LEAVE. ; BR LOOK ; BKC - ORIGINAL LINE 20$: MOV (SP)+,R2 ; RECOVER BUFFER POINTER. INC R2 ; POINT TO NEXT POSITION. CMP R2,R3 ; OVER TOP OF WHOLE BUFFER? BLO 5$ ; NO, NOT YET. BR LOOK ; AND LOOK AT NEXT RECORD. FILERR: TST (SP)+ ; POP OFF RETURN ADDR CMPB F.ERR(R0),#IE.EOF ; IS IT EOF? BEQ DONE ; NO -- ERRPR CALL FERR ; SIGNAL ERROR DONE: CLOSE$ #FDB ; CLOSE THE FILE. BCC NEXT ; FILE COULD BE OPEND AND CLOSED CALL FERR ; FILE COULD EITHER NOT BE OPEND ; OR CLOSED JMP START ; AND RE-START NEXT: TST WLDFLG ; IS THIS A WILDCARD OPEN? 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 , ; JMP RETURN ; AND LOOP SOMEMORE PRTFIL: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) BR FERR1 FERR: MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP) ;SAVE R1 MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) ; SAVE R3 MOV #M.FCS,R1 ; ADDR OF FCS MSG MOV #L.FCS,R2 ; LENGTH OF FCS MSG CALL .PRFCS ; PRINT FCS MSG BIT #SW.NA,SWORD ; BKC- NO LIST FILE NAME IF /NA BNE NAERR ; BKC -JUMP IF /NA FERR1: MOV #DEVMSG,R1 ; POINT TO DEVICE MSG BIT #SW.NA,SWORD ; BKC- NO LINE FEED IF /NA BNE 5$ ; BKC -JUMP IF /NA MOVB #12,(R1)+ ;+001 - PUT IN A LINE FEED 5$: ; BKC -/NA NO LINE FEED JUMP MOV #40.,R0 ;GET MAX LENGTH. ; MOV CSIBLK+C.DEVD,R2 ; GET DEVICE SPEC LEN MOV DEVSIZ,R2 ;-BKC GET DEV LENGTH BLE 12$ ; NONE? ; MOV CSIBLK+C.DEVD+2,R3 ; GET DEVICE SPEC ADDR MOV #DEVBUF,R3 ;-BKC MOVE IN DEV SPEC 10$: MOVB (R3)+,(R1)+ ; MOVE IN DEVICE SPEC DEC R0 ; DEC TOTAL SPACE BLE 80$ ; SKIP OUT ON 0 SOB R2,10$ ; MOVE IN DEVICE SPEC MOVB #':,(R1)+ ; MOVE IN A : DEC R0 ; DEC TOTAL SPACE BLE 80$ ; SKIP OUT ON 0 12$: MOV DIRBFL,R2 ; GET UIC SPEC LEN BLE 22$ ; NONE? MOV #DIRBF,R3 ; GET UIC SPEC ADDR 20$: MOVB (R3)+,(R1)+ ; MOVE IN UIC SPEC DEC R0 ; DEC TOTAL SPACE BLE 80$ ; SKIP OUT ON 0 SOB R2,20$ ; MOVE IN ALL OF UIC 22$: MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP) ; AND R1 MOV #TEMP,R0 ; POINT TO HEADER BUFFER. MOVB #':,(R0)+ ; BASE PTR MOV FDB+F.FNB+N.FNAM,R1 ; CONVERT FNAM TO RAD50 CLR R2 ; CALL $C5TA ; MOV FDB+F.FNB+N.FNAM+2,R1 CALL $C5TA MOV FDB+F.FNB+N.FNAM+4,R1 CALL $C5TA 30$: CMPB #' ,-(R0) ;IS IT A BLANK? BEQ 30$ ;YES INC R0 ; MOV FDB+F.FNB+N.FTYP,R1 BNE 35$ ; PRINT IT IF SPECIFIED CMP R0,#TEMP+1 ;IS THIS THE BEG. OF STRING? BNE 45$ ; NO -- DON'T PRINT THE . 35$: MOVB #'.,(R0)+ ; MOVE IN A . CALL $C5TA ;TYPE FIELD TO ASCII 40$: CMPB #' ,-(R0) ;IS IT A BLANK? BEQ 40$ ;YES INC R0 ; 45$: MOV FDB+F.FNB+N.FVER,R1 ;GET FILE VERSION BEQ 50$ ;NONE? MOVB #';,(R0)+ ;MOVE IN A ';' CLR R2 ; SUPPRESS 0'S CALL $CBOMG ; CONVERT VERSION # 50$: MOV #TEMP+1,R3 ; SAVE ADDR SUB R3,R0 ; COMPUTE LENGTH MOV R0,R2 ;SAVE IN R2 MOV (SP)+,R1 ;RECOVER R1 MOV (SP)+,R0 ;RECOVER R0 60$: MOVB (R3)+,(R1)+ ; MOVE IN FILE DEC R0 ; DEC TOTAL SPACE BLE 80$ ; SKIP OUT ON 0 SOB R2,60$ ; MOVE IN ENTIRE FILE 80$: SUB #DEVMSG,R1 ;COMPUTE LEN OF MSG ;001 MOV #DEVMSG,QIOW+Q.IOPL ; PUT IN ADDR OF MSG ;001 MOV R1,QIOW+Q.IOPL+2 ; AND LENGTH ;001 MOV #QIOW,-(SP) ; DO I/O ;001 CALL .DIRDL PUT$ #FDB1,#DEVMSG,R1,FILERR ;+001 - PRINT IT NAERR: ; /NA ERROR RETURN MOV (SP)+,R3 ;RECOVER R3 MOV (SP)+,R2 ; RECOVER R2 MOV (SP)+,R1 ; RECOVER R1 MOV (SP)+,R0 ; RECOVER R0 RTS PC $TYPE: MOV (R0)+,QIOW+Q.IOPL+2 ;MOVE IN QIO LENGTH MOV R0,QIOW+Q.IOPL ;AND ADDRESS MOV #QIOW,-(SP) CALL .DIRDL ADD -2(R0),R0 ;ADD IN QIO LENGTH INC R0 ;INC R0 TO GET TO EVEN BOUND. BIC #1,R0 ;CLEAR LOW BIT - RTS TO EVEN BOUND. RTS R0 ;AND RETURN TO CALLER. ; TERMINAL QIO QIOW: QIOW$ IO.WVB,3,1,,,,<0,0,40> M.FCS: .ASCII /FIN/ L.FCS = .-M.FCS .EVEN ; ERROR MESSAGES DEVMSG: .BLKB 40. .EVEN TEMP: .BLKB 40. .PAGE .SBTTL PRFCS - PRINT FCS ERROR CODE .IDENT -010000- ;+ ; ABSTRACT: .PRFCS ; ; SUBROUTINE TO GET A TEXTUAL EXPLANATION FOR AN FCS ERROR. ; ; CALLING SEQUENCE: ; ; JSR PC,.PRFCS ; ; ARGUMENTS: ; ; R0 ADDRESS OF THE FDB WHICH HAD THE ERROR. ; R1 ADDRESS OF A USER TASKNAME BUFFER. ; R2 SIZE OF THE USER BUFFER. ; ; ON RETURN, ALL REGESTERS ARE UNCHANGED. ; ; WRITTEN: 18-JUN-77, -0.0.0-, BRUCE C. WRIGHT ; MODIFIED: 13-APR-79, -1.0.0-, BRUCE C. WRIGHT ; CONDITIONALISE FOR RSX-11M ; VERIFIED: ;- ; R$$11M = 0 ; DEFINE THIS SYMBOL TO ASSEMBLE FOR RSX-11M ;R$$11D = 0 ; DEFINE THIS SYMBOL TO ASSEMBLE FOR RSX-11D ;I$$AS = 0 ; DEFINE THIS SYMBOL TO ASSEMBLE FOR IAS. ; .MCALL QIOW$S,WSIG$S,ALUN$S,GLUN$S .IF DF R$$11D!I$$AS .MCALL MOUT$S .ENDC ; R$$11D!I$$AS .PRFCS:: MOV R3,-(SP) .IF DF R$$11D!I$$AS MOVB F.ERR(R0),R3 ; GET F.ERR NEG R3 ; GET I/O ERROR CODE BITB #200,F.ERR+1(R0) ; IS IT A DIR CODE? BEQ 10$ ; NO ADD #128.,R3 ; FIXUP CODE. 10$: MOUT$S #QIOSYM,#QIOPRM,R3,CONT,USBUF,#BUFFER,#BUFLEN,,,PRBAD MOV R2,QIOPRM ; SET THE LENGTH OF TSK STRING MOV R1,QIOPRM+2 ; SET THE ADDRESS OF TSK STR. MOV BUFFER+2,QIOPRM+4 ; LENGTH OF ERROR STRING. MOUT$S #PRNTIT,#QIOPRM,,CONT,#SY$STM,,,,,PRBAD MOV (SP)+,R3 RETURN PRBAD: TST (SP)+ ; POP OFF GARBAGE RETURN ADDRESS. .ENDC ; R$$11D!I$$AS MOV R4,-(SP) ; SAVE R4 ... MOV R5,-(SP) ; ... AND R5 MOVB F.ERR(R0),R5 ; GET ERROR CODE CLR R4 NEG R5 ; MAKE CODE POSITIVE. BLE 10$ ; NO ERROR -- LEAVE. DIV #10.,R4 ; DIVIDE THE CODE BY 10. SWAB R5 ; PUT RESULT IN HIGH BYTE. BIS R5,R4 ; SET THE LOW ORDER. BIS #"00,R4 ; MAKE IT NUMERIC. MOV #BUFFER,R3 ; POINT TO BUFFER. MOV R1,-(SP) MOV R2,-(SP) BLE 4$ ; NO 3$: MOVB (R1)+,(R3)+ ; SOB R2,3$ ; MOVE THINGS INTO BUFFER. 4$: MOV (SP)+,R2 MOV (SP)+,R1 MOV #STDSW,R5 ; GET DSW STRING TSTB F.ERR+1(R0) ; IS IT A DSW CODE? BMI 5$ ; YES MOV #STFCS,R5 ; NO 5$: MOVB (R5)+,(R3)+ ; MOVE IN THE STRING. BNE 5$ ; LOOP UNTIL "DONE" MOVB R4,-1(R3) ; MOVE IN LOW ORDER ERROR CODE SWAB R4 ; MOVB R4,(R3)+ ; AND HIGH ORDER ERROR CODE SUB #12.,SP ; GET SPACE FOR GLUN$ BUFFER. MOV SP,R5 ; POINT TO IT. GLUN$S .MOLUN,R5 ; GET LUN INFORMATION. ALUN$S .MOLUN,#"TI,#0 ; ALLOCATE THE LUN. SUB #BUFFER,R3 ; COMPUTE LENGTH OF QIO 10$: QIOW$S #IO.WVB,.MOLUN,#30.,,,,<#BUFFER,R3,#40> CMP @#$DSW,#-1 ; NO NODES? BNE 20$ ; NO -- OK WSIG$S ; WAIT A BIT BR 10$ ; AND TRY AGAIN. 20$: MOVB 2(R5),R4 ; GET THE UNIT NUMBER. ALUN$S .MOLUN,(R5),R4 ; FIXUP .MOLUN AGAIN. ADD #12.,SP ; POP BUFFER. MOV (SP)+,R5 ; RECOVER R5 MOV (SP)+,R4 ; RECOVER R4 MOV (SP)+,R3 ; RECOVER R3 RETURN ; AND RETURN. ; ; STRING DESCRIPTOR FOR GETTING ERROR NAME ; .IF DF R$$11D!I$$AS QIOSYM: .WORD QIOLEN .WORD QIOFIL ; ; FILE NAME WHERE ERROR NAMES ARE KEPT ; .IF DF R$$11D QIOFIL: .ASCIZ /SY:[1,2]QIOSYM.MSG/ .ENDC ;R$$11D .IF DF I$$AS QIOFIL: .ASCIZ /LB:[1,2]QIOSYM.MSG/ .ENDC ;I$$AS QIOLEN = .-QIOFIL .EVEN ; ; PARAMETER LIST ; QIOPRM: .WORD 0 ; LENGTH OF TASK STRING. .WORD 0 ; ADDRESS OF TASK STRING. .WORD 0 ; LENGTH OF ERROR STRING. .WORD BUFFER+4 ; ADDRESS OF ERROR STRING. ; ; STRING DESCRIPTOR ; PRNTIT: .WORD FMTLEN ; LENGTH OF STRING .WORD FMTSTR ; ADDRESS OF STRING ; ; FORMAT STRING ; FMTSTR: .ASCII /%VA -- %VA/ FMTLEN = .-FMTSTR .EVEN .ENDC ; R$$11D!I$$AS ; ; LUN FOR MO.... ; .MOLUN::.WORD 0 ; ; BUFFER FOR FCS CODE ; BUFFR: .BLKB 80. BUFLEN = .-BUFFR ; ; STRINGS FOR USE IF MO.... FAILS. ; STFCS: .ASCIZ / -- FCS -/ STDSW: .ASCIZ / -- DSW -/ .EVEN .PAGE .SBTTL .DIRDL -- EXECUTE DIRECTIVE .IDENT -000000- .MCALL DIR$,WSIG$S .GLOBL $DSW ;+ ; ABSTRACT: .DIRDL ; ; THIS SUBROUTINE IS MEANT TO BE CALLED BY ASSEMBLER ROUTINES ; TO EXECUTE DIRECTIVES WHICH MIGHT FAIL BECAUSE OF ; INSUFFICIENT NODES. IT WILL ONLY WORK CORRECTLY ON QIO AND ; MARK TIME DIRECTIVES, AND THE VARIOUS TASK EXECUTION DIRECTIVES. ; IT WILL NOT WORK CORRECTLY ON THE VARIOUS SEND DATA DIRECTIVES. ; ; CALLING SEQUENCE: ; ; MOV #DPB,-(SP) ;SAVE DPB ADDRESS ; CALL .DIRDL ;DO THE I/O ; ;DPB ADDRESS POPPED OFF BY .DIRDL ; ; WRITTEN: 25-JUL-78, -0.0.0-, BRUCE C. WRIGHT ; MODIFIED: ; VERIFIED: ;- LOOP: WSIG$S ;WAIT A BIT. .DIRDL:: DIR$ 2(SP) ;EXECUTE THE DIRECTIVE BCC LEAVE ;LEAVE IF OK CMP @#$DSW,#-1 ;NO NODES? BEQ LOOP ;YES -- TRY AGAIN. SEC ;SET CARRY - ERROR. LEAVE: MOV (SP)+,(SP) ;POP STACK RETURN ;AND RETURN. .END FIN