KARNEY%PPC.MFENET@NMFECC.ARPA (09/30/87)
Below is a program for doing wildcard searches (using VMS' wildcard characters * and %) in a file. I wrote it to do lookup on a phone directory where the user might not be sure of the spelling of someone's name. Charles Karney Plasma Physics Laboratory Phone: 609/683-2607 Princeton University MFENet: Karney@PPC.MFENET PO Box 451 ARPANet: Karney%PPC.MFENET@NMFECC.ARPA Princeton, NJ 08544-0451 Bitnet: Karney%PPC.MFENET@ANLVMS.BITNET ....................... Cut between dotted lines and save ...................... $!.............................................................................. $! VAX/VMS archive file created by VMS_SHAR V-4.04 15-Sep-1987 $! which was written by Michael Bednarek (U3369429@ucsvc.dn.mu.oz.au) $! To unpack, simply save and execute (@) this file. $! $! This archive was created by KARNEY $! on Wednesday 30-SEP-1987 12:35:47.08 $! $! It contains the following 4 files: $! WILD.HLP WILD.PAS WILD.COM WILD_CLD.CLD $!============================================================================== $ Set Symbol/Scope=(NoLocal,NoGlobal) $ Version=F$GetSYI("VERSION") ! See what VMS version we have here: $ If Version.ges."V4.4" then goto Version_OK $ Write SYS$Output "Sorry, you are running VMS ",Version, - ", but this procedure requires V4.4 or higher." $ Exit 44 $Version_OK: CR[0,8]=13 $ Pass_or_Failed="failed!,passed." $ Goto Start $Convert_File: $ Read/Time_Out=0/Error=No_Error1/Prompt="creating ''File_is'" SYS$Command ddd $No_Error1: Define/User_Mode SYS$Output NL: $ Edit/TPU/NoSection/NoDisplay/Command=SYS$Input/Output='File_is' - VMS_SHAR_DUMMY.DUMMY f:=Get_Info(Command_Line,"File_Name");b:=Create_Buffer("",f); o:=Get_Info(Command_Line,"Output_File");Set (Output_File,b,o); Position (Beginning_of(b));Loop x:=Erase_Character(1); Loop ExitIf x<>"V"; Move_Vertical(1);x:=Erase_Character(1);Append_Line;Move_Horizontal (-Current_Offset);EndLoop;Move_Vertical(1);ExitIf Mark(None)=End_of(b) EndLoop;Exit; $ Delete VMS_SHAR_DUMMY.DUMMY;* $ Checksum 'File_is $ Success=F$Element(Check_Sum_is.eq.CHECKSUM$CHECKSUM,",",Pass_or_Failed)+CR $ Read/Time_Out=0/Error=No_Error2/Prompt=" CHECKSUM ''Success'" SYS$Command ddd $No_Error2: Return $Start: $ File_is="WILD.HLP" $ Check_Sum_is=858023099 $ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY X1 WILD XWILD does wildcard searches on a text file. To use WILD put X $ WILD :== $USR:[UTILITY]WILD Xinto your LOGIN.COM file or else type X $ SETUP WILD X XUsage: X $ WILD file pat1[,pat2[,pat3...]] Xwhere file is a text file to search and pat1... are the wildcard patterns to Xsearch for. X XBugs, questions, etc. to Charles Karney X2 Description XWILD looks through the specified file matching each line of file against the Xvarious patterns. All matching lines are printed to SYS$OUTPUT. If no Xmatching lines are found WILD returned an informational message (i.e., X$SEVERITY = 3). X XThe patterns can contain the wildcard characters * and % which match an Xarbitrary string and a single character respectively. X XThe match is to the entire line of the input file unless the qualifiers X /POSITION and /SIZE are specified. These defined a range of columns in the Xinput file to be used. In addition the /PARTIAL qualifier is equivalent to Xprefixing and suffixing each pattern with a '*'. The match is case Xinsensitive unless /EXACT is specified. The /TRIM qualifier is used to Xremove trailing blanks from the file and the patterns before the match is Xattempted. X2 Qualifiers X/EXACT X /EXACT X /NOEXACT (D) XIf /EXACT is specified then the match is case sensitive. X X/TRIM X /TRIM X /NOTRIM (D) XIf /TRIM is specified the patterns and the lines in the file are trimmed of Xtrailing blanks before the match is made X X/POSITION X /POSITION=integer Xspecifies a starting column in the file at which the attempted match is Xbegun. Default is /POSITION=1, i.e., the beginning of the line. X X/SIZE X /SIZE=integer Xspecifies the number of columns used in the match. The default is to use Xthe whole line beginning at /POSITION. X X/PARTIAL X /PARTIAL X /NOPARTIAL (D) XIf /PARTIAL is specified then the match is made on partial lines. This is Xachieved by converting pati to *pati*. X2 Restrictions XAt most 32 match patterns can be specified. XThe maximum length of lines in file is 512 characters. $ GoSub Convert_File $ File_is="WILD.PAS" $ Check_Sum_is=1013804588 $ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY X(* Call wild_match on every line of a file, printing out the matches. XUsage X wild file str1[,str2[,str3...]] X XRestrictions X maximum of 32 pattern can be searched for X file must be a text file with lines of at most 512 characters X XWritten by Charles Karney (Karney%PPC.MFENET@NMFECC.ARPA), Sept 9, 1987. X X*) X X[inherit ('SYS$LIBRARY:STARLET')] Xprogram wild(output); Xconst X linel=512; X maxstring=32; X cli$_absent=%x'000381F0'; X cli$_concat=%x'0003FD29'; X cli$_defaulted=%x'0003FD21'; X cli$_locneg=%x'00038230'; X cli$_locpres=%x'0003FD31'; X cli$_negated=%x'000381F8'; X cli$_present=%x'0003FD19'; Xtype X uword=[word] 0..65535; X line=varying [linel] of char; X sigarr=array [0..20] of integer; X mecharr=array [0..4] of integer; Xlabel 3; Xvar X cmd_line,file_name,input_line,buf1,buf2:line; X match:array [0..maxstring-1] of line; X input_file:text; X status,nstrings,i,position,size,length:integer; X found,exact,trim,partial:boolean; X lib$get_input,wild_match_cld:[external] unsigned; X Xfunction lib$get_foreign( X %stdescr cmdlin:[volatile] packed array [l1..u1:integer] of char X :=%immed 0; X %stdescr prompt:[volatile] packed array [l2..u2:integer] of char X :=%immed 0; X var len : [volatile] uword := %immed 0; X var flag : [volatile] integer := %immed 0):integer; external; Xfunction cli$dcl_parse( X %stdescr cmd_string:packed array [l1..u1:integer] of char X :=%immed 0; X var table:unsigned:=%immed 0; X var param_routine:unsigned:=%immed 0; X var prompt_routine:unsigned:=%immed 0; X %stdescr prompt_string:packed array [l2..u2:integer] of char X :=%immed 0):integer; external; Xfunction cli$present( X %stdescr name:packed array[l..u:integer] of char):integer; external; Xfunction cli$get_value( X %stdescr name:packed array[l1..u1:integer] of char; X %stdescr retbuf:packed array[l2..u2:integer] of char; X var ret_len : uword := %immed 0):integer; external; Xfunction str$upcase( X var dst_str : varying [len1] of char; X src_str : varying [len2] of char):unsigned; external; Xfunction str$trim( X var dst_str : varying [len1] of char; X src_str : varying [len2] of char; X var out_len : uword := %immed 0):integer;external; Xfunction str$match_wild( X cand_str : varying [len1] of char; X pattern_str : varying [len2] of char):integer; external; X[asynchronous] function err_handler X (var sigargs : sigarr; X var mechargs : mecharr) : integer; Xbegin X mechargs[3]:=sigargs[1]; X $unwind(mechargs[2]); X err_handler := ss$_resignal; Xend; Xbegin X status := lib$get_foreign(cmd_line.body,,cmd_line.length,); X if not odd(status) then $exit(status); X establish(err_handler); X status := cli$dcl_parse('wild_match '+cmd_line,wild_match_cld, X lib$get_input); X revert; X if not odd(status) then $exit(status); X cli$get_value('source',file_name.body,file_name.length); X nstrings:=0; X exact:=odd(cli$present('exact')); X trim:=odd(cli$present('trim')); X partial:=odd(cli$present('partial')); X while (nstrings<maxstring) and X odd(cli$get_value('string',buf1.body,buf1.length)) X do begin X if not(exact) then str$upcase(buf2,buf1) else buf2:=buf1; X if trim then str$trim(match[nstrings],buf2) else match[nstrings]:=buf2; X if partial then match[nstrings]:='*'+match[nstrings]+'*'; X nstrings:=nstrings+1; X end; X if odd(cli$present('position')) then begin X cli$get_value('position',buf1.body,buf1.length); X readv(buf1,position); X end else position:=1; X if odd(cli$present('size')) then begin X cli$get_value('size',buf1.body,buf1.length); X readv(buf1,size); X end else size:=linel; X open(file_variable:=input_file, X file_name:=file_name, X history:=readonly); X reset(input_file); X found:=false; X while not eof(input_file) do begin X readln(input_file,input_line); X length:=min(input_line.length+1-position,size); X buf2:=substr(input_line,position,length); X if buf2.length>0 then begin X if not(exact) then str$upcase(buf1,buf2) else buf1:=buf2; X if trim then str$trim(buf2,buf1) else buf2:=buf1; X for i:=0 to nstrings do X if odd(str$match_wild(buf2,match[i])) then begin X writeln(input_line); X found:=true; X goto 3; X end; X3: end; X end; X close(file_variable:=input_file); X if not found then begin X writeln('%WILD-I-NOMATCHES, no strings matched'); X $exit(sts$k_info+sts$m_inhib_msg); X end; Xend. $ GoSub Convert_File $ File_is="WILD.COM" $ Check_Sum_is=138234923 $ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY X$ pascal/opt/nochec/nodeb wild X$ set command/obj wild_cld X$ link/notrace wild,wild_cld $ GoSub Convert_File $ File_is="WILD_CLD.CLD" $ Check_Sum_is=355996817 $ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY Xmodule wild_match_cld Xdefine verb wild_match X parameter p1 , label=source , prompt="filename" X value (required,list,type=$infile) X parameter p2 , label=string , prompt="pattern(s)" X value (required,list) X qualifier trim, negatable X qualifier exact, negatable X qualifier partial, negatable X qualifier position, negatable, value(required,type=$number) X qualifier size, negatable, value(required,type=$number) $ GoSub Convert_File $ Exit CC: info-vax@KL.SRI.COM KARNEY