home *** CD-ROM | disk | FTP | other *** search
- #!/usr/local/bin/kermit +
- #
- # In Unix change the first line to show actual full pathname of C-Kermit,
- # and give this file execute permission.
- #
- # REVIEW
- #
- # Interactively prompts you with each filename that matches the argument
- # (or all filenames in the current directory if no argument given), giving
- # you a chance to type it, delete it, edit it, rename it, copy it, etc.
- # In UNIX, wildcards are expanded by the shell on the command line;
- # elsewhere, this script expands (a single) wildcard argument itself.
- #
- # Usage: TAKE REVIEW.KSC [ filespec ]
- # In UNIX, save this file as a Kerbang script "review" and invoke directly
- # with command-line arguments: review [ filespec ]
- #
- # Windows and OS/2 Hint: Use forward slashes, not backslashes, in filespec.
- #
- # Illustrates:
- # . Processing command-line arguments in "kerbang" scripts.
- # . FOR and WHILE loops and SWITCH statements.
- # . Nested loops.
- # . Assignment of wildcard expansion to an array.
- # . Sorting an array.
- # . Reading commands from keyboard and matching them to a keyword list.
- # . Getting and displaying information about files.
- # . TYPE command switches like /HEAD, /TAIL, /COUNT, and /SEARCH.
- #
- # C-Kermit 7.0 or later or K95 1.1.19 or later required.
- #
- # Author: F. da Cruz, Columbia University
- #
- # V 1.0, 16 Apr 1999 - First version.
- # V 2.0, 26 Apr 1999 - Adds keyword table, HEAD, TAIL, SEARCH, etc;
- # accepts a file list on the command line
- # V 3.0, 20 May 1999 - Adds LIST command,
- # speedups via ARRAY COPY and \tablelook().
- # V 4.0, 8 Feb 2000 - Improved portability between K95 and C-Kermit.
- # Less awful handling of DOS pathnames.
- #
- define badversion {
- echo Sorry - C-Kermit 7.0 or K95 1.1.19 or later required.
- if eq "\%0" "\v(cmdfil)" exit 1
- stop 1
- }
- if not equal "\v(program)" "C-Kermit" badversion
- if LLT \v(version) 700196 badversion
-
- ; Local variables
- local kerbang file p \%i \%j \%a \%x &a[] \&c[] newname pattern
-
- ; Command keyword list
- ;
- dcl \&c[] = -
- copy count delete edit head help info list next -
- previous quit rename run search send tail type
-
- .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.
- }
-
- echo Reviewing files in \v(dir)... ; Greeting
- sort &c ; Put commands in alphabetical order.
- .\%n ::= \v(argc) - 1 ; How many arguments on command line.
-
- switch \%n {
- :0, .\%n := \ffiles(*,&a), break ; No args, do * in current directory.
- :1, .\%n := \ffiles(\&_[1],&a), break ; 1 arg, expand it.
- :default, array copy &_[] &a[] ; More than 1 arg, use them literally.
- }
-
- ; Now file list is in global array \&a[].
-
- echo \%n file(s) match.
- sort &a ; Sort the file list
- echo
- echo Type "help" for help. ; Give instructions
- echo
-
- set case off ; Case doesn't matter in commands
-
- define DOCOMMAND { ; Execute a command: \%1 is the command
- switch \%1 { ; Handle the command
- :next ; Proceed to next file
- set flag on
- break
- :delete
- delete /verbose \m(file) ; Delete this file
- if success { ; If it was deleted
- .file = (DELETED) ; replace its array entry
- .\&a[\%i] := \m(file)
- set flag on ; and go on to next file
- }
- break
- :quit ; Quit
- myquit 0 Bye.
- :type ; Type this file
- type /page \m(file)
- break
- :count ; Count lines in this file
- type /count \m(file)
- break
- :head ; Show first lines of this file
- type /head \m(file)
- break
- :tail ; Show last lines of this file
- type /tail \m(file)
- break
- :list
- type /page /prefix:{\\flpad(\\v(ty_ln),3). } \m(file)
- break
- :edit ; View this file in the editor
- edit \m(file)
- break
- :previous ; Back to previous file
- if ( > \%i 1 ) { ; (yes we modify the loop variable)
- decrement \%i 2
- set flag on
- }
- break
- :run ; Run this file
- run \m(file)
- break
- :info ; Print info about this file
- if equal "\m(file)" "(DELETED)" break
- if equal "\m(file)" "(RENAMED)" break
- echo \fperm(\m(file)) \fsize(\m(file)) \fdate(\m(file)) \m(file)
- break
- :rename ; Rename this file
- ask newname { Rename \m(file) to: }
- if not def newname break
- rename /verbose \m(file) \m(newname)
- if success { ; Handled like DELETE (q.v.)
- .file = (RENAMED)
- .\&a[\%i] := \m(file)
- set flag on
- }
- break
- :copy ; Copy this file
- ask newname { Copy \m(file) to: }
- if def newname { copy /verbose \m(file) \m(newname) }
- break
- :search
- ask pattern { Pattern(s) to search for: }
- if not def pattern break
- type /match:\m(pattern) \m(file)
- break
- :send ; Send the file
- send \m(file)
- break
- :help ; Print help message
- echo
- echo \fbasename(\v(cmdfile)) Commands:
- echo { copy - Copy this file.}
- echo { count - Count lines in this file.}
- echo { delete - Delete this file.}
- echo { edit - Edit this file.}
- echo { head - Show top 10 lines of this file.}
- echo { help - Print this message.}
- echo { info - Show info about this file.}
- echo { list - List this file with line numbers.}
- echo { next - Next file (default).}
- echo { previous - Previous file.}
- echo { rename - Rename this file.}
- echo { run - Run this file.}
- echo { send - Send this file.}
- echo { search - Search this file for patterns.}
- echo { tail - Show the last 10 lines of this file.}
- echo { type - Type this file.}
- echo { quit - Quit from \fbasename(\v(cmdfile))}
- echo {Commands may be abbreviated.}
- echo
- break
- :default
- echo "\%a" - not a valid command - type "help" for help.
- }
- }
-
- for \%i 1 \%n 1 { ; Loop for all files
- set flag off ; Flag ON means go to next file
- asg file \fcontents(\&a[\%i])
- if directory \m(file) asg file \m(file) (DIRECTORY)
- while not flag { ; Loop for each file
- asg p \flpad(\%i,3). \freplace(\m(file),\\,/)
- ask \%a { \m(p): } ; Prompt filename & get command
- if not def \%a {
- def \%x next ; Default command is "next"
- } else {
- .\%x := \ftablelook(\%a,&c) ; Look up what they typed
- if ( = \%x -1 ) { ; Not found
- echo No such command: "\%a"
- continue
- }
- if ( = \%x -2 ) { ; Ambiguous
- echo Ambiguous: "\%a"
- continue
- }
- .\%x := \&c[\%x] ; Good - get full name
- }
- docommand \%x ; Execute it
- }
- }
- echo
- myquit 0 Bye.
-