.TITLE FINDTPA Syntax Analysis for FINDALL .SUBTITLE Local and Global data definitions ;+ ; This segment holds the code necessary to analyze a ; FINDALL command line. It uses the LIB$TPARSE finite ; state parser to do most of the work. ; ; Entry: ; ISTAT = COMSCAN(LINE,OLEN) ; Where ; ISTAT I*4 is the status return of the function ; uses standard VAX/VMS error values ; LINE C*(*) The text to analyze ; OLEN I*4 The length of the string analyzed ; (useful for error support) ; ; External References: ; FINDARG common block with the following entries ; FIDFLG L*4 if .TRUE., output the file id ; SIZFLG L*4 if .TRUE., output the file size ; MINSIZ I*4 minimum file size to match with ; MAXSIZ I*4 maximum file size to match with ; ANYGRP L*4 if .TRUE., match for any group number ; ANYMEM L*4 if .TRUE., match for any member number ; UIC I*4 file owner to match to ; DEVFLG L*4 if .TRUE., a device name was specified ; DEVLEN I*4 Number of letters in device name ; DEVNAME C*255 Storage for device name ;- $TPADEF .PSECT FINDARG,GBL,NOEXE,OVR,PIC,RD,REL,SHR,WRT,LONG FIDFLG: .LONG 0 ; Initial value is no fid printed SIZFLG: .LONG 0 ; Initial value is no size printed MINSIZ: .LONG 0 ; Initial value is zero blocks MAXSIZ: .LONG ^X3FFFFFF ; Initial value is max blocks possible ANYGRP: .LONG 0 ; Initial value is no wildcard group ANYMEM: .LONG 0 ; Initial value is no wildcard member UIC: .LONG 0 ; Initial value is set by FINDALL DEVFLG: .LONG 0 ; Initial value is use default disk DEVLEN: .LONG 0 ; Initial value is set by FINDALL .PSECT FINDSTR,GBL,NOEXE,OVR,PIC,RD,REL,SHR,WRT,LONG DEVNAME:.BLKB 255 ; Initial value is set by FINDALL ; .PAGE .SUBTITLE LIB$TPARSE state tables .PSECT $LOCAL,PIC,CON,REL,LCL,NOSHR,NOEXE,RD,WRT,LONG ; Stupid declarations since the macros dont work properly GTR = ^A'>' LSS = ^A'<' COMMA = ^A',' ; $INIT_STATE FINDSTA,FINDKEY ; $STATE INIT $TRAN '/' $TRAN TPA$_SYMBOL,NEWDEV,ACTDEV $TRAN TPA$_EOS,TPA$_EXIT ;+ ; Switch options ;- $STATE $TRAN 'UIC',UICS $TRAN 'MIN',MINS $TRAN 'MAX',MAXS $TRAN 'NOFID',INIT,ACTNF $TRAN 'FID',INIT,,-1,FIDFLG $TRAN 'NOSIZE',INIT,ACTNS $TRAN 'SIZE',INIT,,-1,SIZFLG ;+ ; Eat optional colon after device name ;- $STATE NEWDEV $TRAN ':',INIT $TRAN TPA$_LAMBDA,INIT ;+ ; Process a (possibly wildcarded) UIC ;- $STATE UICS $TRAN ':' $TRAN '=' ; $STATE $TRAN '[' $TRAN LSS ; $STATE $TRAN '*',,,-1,ANYGRP $TRAN TPA$_OCTAL,,ACTGRP ; $STATE $TRAN COMMA ; $STATE $TRAN '*',,,-1,ANYMEM $TRAN TPA$_OCTAL,,ACTMEM ; $STATE $TRAN ']',INIT $TRAN GTR,INIT ;+ ; Set the minimum file size ;- $STATE MINS $TRAN '=' $TRAN ':' ; $STATE $TRAN TPA$_DECIMAL,INIT,,,MINSIZ ;+ ; Set the maximum file size ;- $STATE MAXS $TRAN '=' $TRAN ':' ; $STATE $TRAN TPA$_DECIMAL,INIT,,,MAXSIZ ; $END_STATE .PAGE .SUBTITLE COMSCAN executable code .PSECT $CODE,PIC,CON,REL,LCL,SHR,EXE,RD,NOWRT,LONG ; .ENTRY COMSCAN,^M ;+ ; Create the parameter block for LIB$TPARSE ;- SUBL2 #TPA$K_LENGTH0,SP MOVAL (SP),R2 MOVL #TPA$K_LENGTH0,TPA$L_COUNT(R2) MOVL #TPA$M_ABBREV,TPA$L_OPTIONS(R2) CLRB TPA$B_MCOUNT(R2) MOVAQ @4(AP),R0 CVTWL (R0),TPA$L_STRINGCNT(R2) MOVAL @4(R0),TPA$L_STRINGPTR(R2) ;+ ; Call LIB$TPARSE to process the data and return ;- PUSHAL FINDKEY PUSHAL FINDSTA PUSHAL (R2) CALLS #3,LIB$TPARSE MOVL TPA$L_STRINGCNT(R2),@8(AP) RET ; .PAGE .SUBTITLE Action routines for LIB$TPARSE ;+ ; ACTDEV Action routine to copy the device name and length ; into common and cause error if more than one device ; name is specified ; ACTGRP Action routine to set the group number and clear ; the ANYGRP flag ; ACTMEM Action routine to set the member number and clear ; the ANYMEM flag ; ACTNF Action routine to clear the FIDFLG flag ; ACTNS Action routine to clear the SIZFLG flag ;- .ENTRY ACTDEV,^M ; BLBS DEVFLG,ACTD00 CVTBL #-1,DEVFLG MOVL TPA$L_TOKENCNT(AP),DEVLEN INCL DEVLEN MOVC3 TPA$L_TOKENCNT(AP),@TPA$L_TOKENPTR(AP),DEVNAME MOVB #^A':',(R3) CVTBL #1,R0 RET ACTD00: CLRL R0 RET ; .ENTRY ACTGRP,0 ; CVTLW TPA$L_NUMBER(AP),UIC+2 CLRW ANYGRP RET ; .ENTRY ACTMEM,0 ; CVTLW TPA$L_NUMBER(AP),UIC CLRW ANYMEM RET ; .ENTRY ACTNF,0 ; CLRL FIDFLG RET ; .ENTRY ACTNS,0 ; CLRL SIZFLG RET ; .END