.TITLE DECODE -- DECODE A COMMAND STRING .IDENT /1/ .MCALL GCML$,ERR$S,IF,IFB,ELSE,END,CSI$1,CSI$2,ERR$P,OPEN$W,OPEN$R .MCALL DELET$,STRMACS,WHILE,MRKT$S,WTSE$S,CLOSE$,AND,FDBK$R,FDRC$A STRMACS ; ; THIS SUBROUTINE IS CALLED TO OBTAIN AND PROCESS USER COMMAND LINES. ; IF THE C BIT IS SET ON EXIT, THE CALLING ROUTINE IS TO EXIT, ANY ; ERROR MESSAGE HAVING BEEN OUTPUT ALREADY. ; ; THE ROUTINE USES GCML/CSI TO OBTAIN AND PARSE COMMAND LINES ; AND ALSO OPENS THE INPUT AND OUTPUT FILES WITH THE ; USER SPECIFIED NAMES. ; DECODE:: GCML$ #BLOCK ;GET THE NEXT COMMAND LINE IF ,CS ;ERROR? IFB #GE.EOF,EQ,BLOCK+G.ERR ;YES. JUST EOF? DONE: SEC ;SET FLAG TO SHOW PROCESSING DONE RETURN: RETURN ;AND RETURN TO CALLER ELSE MOVB BLOCK+F.ERR,R1 ;GET ERROR CODE ERR$S #SUBL,<> ERR$P #ERR,<%ERROR READING COMMAND LINE : %> BR DONE END END ERR$S #SUBL,<> MOV DOPT,OPTIONS ;SET UP DEFAULT OPTIONS MOV #77777,COUNT ;SET UP COUNT OF RECORDS MOV #1,FILES ;ALLOW ONE END OF FILE MOV #1,FROM ;SHOW WE START AT THE BEGINNING CSI$1 #CSIBLK,BLOCK+G.CMLD+2,BLOCK+G.CMLD ;PARSE IF ,CS ;IF ERROR ERR$P #ERR,<%COMMAND SYNTAX ERROR : %> BR DECODE ;GO FOR NEXT COMMAND END CSI$2 #CSIBLK,OUTPUT,#OSWT ;PROCESS OUTPUT SPECIFIER IF ,CS ;IF ERROR ERR$P #ERR,<%INVALID OUTPUT SPECIFIER : %> BR DECODE ;GO FOR NEXT COMMAND END IFB #CS.MOR,SETON,CSIBLK+C.STAT ERR$P #ERR,<%ONLY ONE OUTPUT SPECIFIER ALLOWED : %> BR DECODE END OPEN$W #OUT ;OPEN OUTPUT FILE IF ,CS MOVB F.ERR(R0),R1 ;GET ERROR CODE NEG R1 ;AND CONVERT INTO RECORD NUMBER ERR$P #ERR,<%CANNOT OPEN OUTPUT FILE : >,R1 ERR$P #ERR,<%%> JMP DECODE END IFB #FD.REC,SETON,F.RCTL(R0) ;IF A RECORD DEVICE ATT: MOV #IO.ATT,R1 ;TRY TO ATTACH TO IT CLR R2 ;NO PARAMETERS TO QIO CALL .XQIO ;DO IO.ATT QIO IF ,CS ;IF ERROR MOVB F.ERR(R0),R1 ;GET ERROR CODE IF R1,EQ,#IE.DAA ;IF ATTACHED ALREADY MRKT$S #1,#1,#2 ;MARK TIME FOR WTSE$S #1 ;ONE SECOND BR ATT ;AND TRY ATTACH AGAIN END NEG R1 ;OTHERWISE GET ERROR MESSAGE NUMBER ERR$P #ERR,<%CANNOT ATTACH OUTPUT DEVICE : >,R1 ERR$P ,<%%> DOUT: DELET$ #OUT ;DELETE OUTPUT FILE JMP DECODE ;AND GO FOR NEXT COMMAND END END CSI$2 #CSIBLK,INPUT,#SWTBL ;PROCESS INPUT SPECIFIER IF ,CS ;IF ERROR ERR$P #ERR,<%INVALID INPUT SPECIFIER : %> DETOUT: IFB #FD.REC,SETON,OUT+F.RCTL ;IF WE MUST DETACH OUTPUT MOV #IO.DET,R1 ;DO SO CLR R2 ;0 PARAMETERS CALL .XQIO ;DO IO.DET QIO END BR DOUT ;GO DELETE OUTPUT FILE END IFB #CS.MOR,SETON,CSIBLK+C.STAT ERR$P #ERR,<%ONLY ONE INPUT SPECIFIER ALLOWED : %> BR DETOUT ;GO DELETE OUTPUT FILE END MOV #IN,R0 ;FDB ADDRESS MOV #IN+F.FNB,R1 ;FNB ADDRESS MOV IN+F.DSPT,R2 ;DSPT ADDRESS CLR R3 ;NO DEFAULT FNB CALL .PRSDV ;DO A PARTIAL PARSE IF ,CS ;IF ERROR MOVB F.ERR(R0),R1 ;GET ERROR MESSAGE NEG R1 ;NUMBER ERR$P #ERR,<%INVALID INPUT DEVICE : >,R1 ERR$P ,<%%> BR DETOUT ;GO DELETE OUTPUT FILE ETC END IFB #FD.DIR,SETOFF,IN+F.RCTL ;IF NOT A FILE DEVICE BIS #SW.BL!SW.PH,OPTIONS ;USE BLOCK MODE AND PHYSICAL I/O END IFB #FD.REC!FD.SQD,SETOFF,IN+F.RCTL ;IF A DISK, WE MUST USE 512 BYTE ;BUFFERS IN BLOCK MODE MOV #512.,BLKSIZ ;AS THE DISK DRIVER WILL HAPPILY READ ;MORE ELSE MOV #BUF2-BUF1,BLKSIZ ;OTHERWISE READ AS MUCH AS POSSIBLE END IF #SW.PH,SETOFF,OPTIONS ;IF FILE I/O WILL BE PERFORMED IF #SW.BL,SETON,OPTIONS ;IF IN BLOCK MODE FDBK$R ,,BLKSIZ,,,#IOST ;SET UP IO STATUS BLOCK ADDRESS FDRC$R ,#FD.RWM ;AND SPECIFY BLOCK MODE ELSE FDRC$R ,#FD.PLC,,#BUF2-BUF1 ;SPECIFY LOCATE MODE END OPEN$R ;OPEN INPUT FILE IF ,CS MOVB F.ERR(R0),R1 ;GET ERROR CODE NEG R1 ;AND CONVERT INTO RECORD NUMBER ERR$P #ERR,,R1 ERR$P #ERR,<%%> JMP DETOUT ;GO DELETE OUTPUT FILE END END MOV #TFILE,R0 ;UPDATE FILE LINE MOV #FSPEC,R4 ;PARAMETER LIST CALL $FNB ;TO DECODE A FNB WHILE R0,LO,#ETFILE ;WHILE STILL CLEANING UP FILE LINE MOVB #' ,(R0)+ ;CLEAN UP A BYTE END CLR PAGE ;PAGE = 0 JMP RETURN ;AND RETURN .END