diff options
Diffstat (limited to 'ipl/progs/ibrow.icn')
-rw-r--r-- | ipl/progs/ibrow.icn | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/ipl/progs/ibrow.icn b/ipl/progs/ibrow.icn new file mode 100644 index 0000000..7714469 --- /dev/null +++ b/ipl/progs/ibrow.icn @@ -0,0 +1,186 @@ +############################################################################ +# +# File: ibrow.icn +# +# Subject: Program to browse Icon files for declarations +# +# Author: Robert J. Alexander +# +# Date: September 7, 1990 +# +############################################################################ +# +# This file is in the public domain. +# +############################################################################ +# +# Usage: ibrow [<Icon source file name>...] +# +# If no source file names are provided on the command line, all *.icn +# files in the current directory are browsed. +# +# The program facilitates browsing of Icon programs. It was originally +# written to browse the Icon Program Library, for which purpose it +# serves quite well. The user interface is self-explanatory -- just +# remember to use "?" for help if you're confused. +# +############################################################################ +# +# Links: colmize +# +############################################################################ +# +# Requires: UNIX +# +############################################################################ + +link colmize + +procedure main(arg) + local p, proctab, doneNames, fn, f, foundNonEmptyLine, block, lineNbr + local line, keywd, startLine, proclist, w, i, x, proclines, cmd, b + + if not (&features == "UNIX") then stop("Runs only under UNIX") + if *arg = 0 then { + p := open("ls *.icn","rp") + while put(arg,read(p)) + close(p) + } + proctab := table() + # + # Loop to scan all of the specified source files and save their + # procedures and records. + # + doneNames := set() # This set is used to prevent scanning twice if + # both a source and a suffixless icode file are + # passed as arguments (e.g. mydir/*). + write("Icon Browser -- scanning files:") + every fn := !arg do { + if not (fn[-4:0] == ".icn") then fn ||:= ".icn" + if member(doneNames,fn) then next + insert(doneNames,fn) + f := if fn == "-" then &input else open(fn) | next + write(" ",fn) + # + # Loop to process lines of file (in string scanning mode). + # + foundNonEmptyLine := &null + block := [] + lineNbr := 0 + while line := read(f) do line ? { + lineNbr +:= 1 + if not pos(0) then { + foundNonEmptyLine := 1 + if (tab(many(' \t')) | "")\1 & + (keywd := =("end" | "global" | "link")\1) | + (keywd := =("procedure" | "record")\1 & + tab(many(' \t')) & name := tab(upto(' \t('))\1) then { + if keywd == ("procedure" | "record") then startLine := lineNbr + if keywd == "record" then { + until find(")",line) do { + put(block,line) + line := read(f) | break + lineNbr +:= 1 + } + } + if proctab[name || case keywd of {"end": "()"; "record": "."}] := + [block,fn,startLine] then put(block,line) + if keywd ~== "procedure" then { + foundNonEmptyLine := &null + block := [] + } + } + } + if \foundNonEmptyLine then put(block,line) + } + # + # Close this file. + # + close(f) + } + doneNames := &null + # + # Reorganize the data. + # + proctab := sort(proctab) + proclist := [] + w := **proctab + i := 0 + every x := !proctab do + put(proclist,right(i +:= 1,w) || ". " || x[1]) + proclines := [] + every put(proclines,colmize(proclist)) + proclist := [] + every put(proclist,(!proctab)[2]) + proctab := &null + # + # Interact with the user to browse. + # + repeat { + write() + every write(!proclines) + write() + repeat { + # + # Prompt for, read, and analyze the user's command. + # + writes("\nq,nn,nn[fmev],<return> (? for help): ") + line := read() | exit() + case line of { + "q": exit() + "?": help() & next + "": break + } + if integer(line) then line ||:= "f" + if cmd := line[-1] & any('fmev',cmd) & + block := proclist[0 < integer(line[1:-1])] then { + case cmd of { + "f": { + # + # Write the file name containing the procedure and the + # first line of the procedure. + # + b := block[1] + every line := b[1 to *b] do { + line ? (if (tab(many(' \t')) | "")\1 & + =("procedure" | "record") then break) + } + write(block[2],": ",line) + } + "m": { + # + # List the procedure using "more". + # + write() + p := open("more","pw") | stop("Can't popen") + every write(p,!block[1]) + close(p) + } + "e" | "v": { + # + # Invoke ex or vi positioned at the first line + # of procedure or record. + # + system((if cmd == "e" then "ex" else "vi") || + " +" || block[3] || " " || block[2]) + } + } + } + } + } +end + +procedure help() + write( +"\nEnter:_ +\n q Quit_ +\n ? Display help message (this message)_ +\n <return> Redisplay the list of procedure and record names_ +\n <number from list>[f] Display the file name and first line of_ +\n procedure or record_ +\n <number from list>m Display the procedure or record using \"more\"_ +\n <number from list>e Invoke \"ex\" positioned to procedure or record_ +\n <number from list>v Invoke \"vi\" positioned to procedure or record" + ) + return +end |