#!/usr/local/bin/kermit + # # In Unix change the first line to show actual full pathname of C-Kermit, # and give this file execute permission. # # Synopsis: Recursive "grep" (search for pattern in directory tree). # Requires: C-Kermit 7.0 later or K95 1.1.19 or later. # Illustrates: Recursive directory traversal, pattern matching. # Author: F. da Cruz # The Kermit Project, Columbia University # July 1999; Updated Feb 2000 for K95. # # If you execute this file as a Kerbang script, it does the search and # then exits. If you TAKE this file from the Kermit prompt, it defines # the RGREP macro, which you can use subsequently as many times as you want. # # Both pattern and filespec may contain metacharacters. If no filespec is # given, all files in the current directory tree are searched. # # When running as a Kerbang script, and the filespec contains metacharacters, # you must enclose it in doublequotes to prevent the UNIX shell from expanding # it so Kermit itself can expand it (recursively). # # The pattern must be quoted if it contains metacharacters or spaces, no # matter how you are invoking RGREP; otherwise Kermit wouldn't know where # the pattern ended and where the filenames start. # # Alphabet case is significant. Uncomment the SET CASE OFF command if you # prefer case independence. Or (exercise left for the reader): modify this # script to accept optional "switches" for case sensitivity and any other # operating parameters you'd like to specify for each RGREP invocation. # # Kerbang examples (UNIX, assuming this file is called "rgrep"): # rgrep Version ; Looks for "Version" in all files # rgrep "Version Number" ; ... "Version Number" in all files # rgrep Version *.c ; Illegal because shell expands *.c # rgrep Version "*.c" ; Looks for "Version" in all .c files # # Examples from Kermit prompt: # take rgrep.ksc ; You must TAKE this file first. # rgrep Version ; Looks for "Version" in all files # rgrep {Version Number} ; ... "Version Number" in all files # rgrep Version *.c ; Looks for "Version" in all .c files local kerbang myquit f \%n \%i \&a[] ; Invoked as Kerbang script? .kerbang = 0 ; Assume no. if eq "\%0" "\v(cmdfil)" .kerbang = 1 ; This means we were. define MYQUIT { ; Macro to exit appropriately. if not def \%1 def \%1 0 ; Optional exit status code. if def \%2 echo \%2 ; Optional message. if \m(kerbang) exit \%1 ; If Kerbang script, exit all the way. stop \%1 ; Otherwise return to Kermit prompt. } if not \m(kerbang) { ; Define the RGREP macro if not def RGREP { assign RGREP take \fpathname(\v(cmdfil)), echo RGREP macro defined. echo {To use it, type "rgrep ".} myquit } } ;;; SET CASE OFF ; Uncomment for case independence. .\%n ::= \v(argc) - 1 ; How many arguments on command line. switch \%n { :0, myquit 1 {Usage: \%0 pattern [ filespec ]} :1, .\%2 = * :2, .\%n := \frfiles(\fcont(\%2),&a), break ; 1 arg, expand it recursively. :default, myquit 1 {Too many args - please quote filespec} } ; The following FOR loop does all the real work. See the TYPE /MATCH ; description for an explanation. for \%i 1 \%n 1 { ; For each file .f := \fcont(\&a[\%i]) ; List matching lines type /nopage /match:{*\%1*} /prefix:{\m(f): } \m(f) } if ( eq \v(system) WIN32 ) { echo echo (Use Page Up (\\Kupscn) to view material that scrolled off screen...) } myquit