Annotation of 41BSD/cmd/liszt/lxref.l, revision 1.1.1.1

1.1       root        1: ;------   lxref: lisp cross reference program        
                      2: ;-- author: j foderaro
                      3: ;  This program generates a cross reference listing of a set of one or
                      4: ; more lisp files.  It reads the output of cross reference files 
                      5: ; generated by the compiler.  These files usually have the extension .x .
                      6: ; the .x files are lisp readable.  There format is:
                      7: ; The first s-expression is (File  <filename>) where <filename> is the
                      8: ; name of the lisp source file.
                      9: ; Then there is one s-expression for each function (including macros)
                     10: ; which is defined in the file.  The car of each expression is the function
                     11: ; name, the cadr is the function type and the cddr is a list of those
                     12: ; functions called
                     13: ; 
                     14: ; lxref can be run from the command level
                     15: ; % lxref foo.x bar.x
                     16: ; or in this way
                     17: ; % lxref
                     18: ; -> (lxref foo.x bar.x)
                     19: ;
                     20: ; There is one option, that is changing the ignorelevel.  If a function
                     21: ; is called by more than ignorelevel functions then all those functions
                     22: ; are listed, instead a summary of the number of calls is printed.  This
                     23: ; is useful for preventing  the printing of massive lists for common
                     24: ; system functions such as setq.
                     25: ; To change the ignorelevel to 40 you would type:
                     26: ;
                     27: ; % lxref -40 foo.x bar.x
                     28: ;
                     29: 
                     30: 
                     31: ; load in the macro package
                     32: (eval-when (eval compile)
                     33:   (cond ((null (get 'jkfmacs 'version)) (load 'jkfmacs))))
                     34: 
                     35: (defmacro Push (atm val)
                     36:   `(setq ,atm (cons ,val ,atm)))
                     37: 
                     38: 
                     39: 
                     40: ; insure we have plenty of space to grow into
                     41: (opval 'pagelimit 9999)
                     42: 
                     43: 
                     44: (declare (special width ignorefuncs))
                     45: (setq ignorelevel 50)
                     46: 
                     47: (def xrefinit
                     48:   (lambda nil
                     49:          (setq readtable (makereadtable t))
                     50:          (cond ((greaterp (argv -1) 1)      ; build up list of args
                     51:                 (do ((i (1- (argv -1)) (1- i)) (arglis))
                     52:                     ((lessp i 1) 
                     53:                      (setq user-top-level nil)
                     54:                      (exit (apply 'lxref arglis)))
                     55:                     (setq arglis (cons (argv i) arglis))))
                     56:                (t (patom "Lxref - lisp cross reference program")
                     57:                   (terpr poport)
                     58:                   (setq user-top-level nil)))))
                     59: 
                     60: (setq user-top-level 'xrefinit)
                     61: 
                     62: (defun lxref fexpr (files)
                     63:  (prog (p funcs i-seen i-home i-type i-callers filenm caller callee name
                     64:          home type caller tmp fname)
                     65:   (setq i-seen (gensym) i-home (gensym) i-type (gensym) i-callers (gensym))
                     66: 
                     67:   ; check for the only option permitted, that of changing the ignorelevel
                     68:   ;
                     69:   (If (and files (eq '- (car (setq tmp (explode (car files))))))
                     70:       then (If (not (fixp (setq ignorelevel (readlist (cdr tmp)))))
                     71:               then (patom "bad ignorelevel count")
                     72:                    (exit 1))
                     73:           (setq files (cdr files)))
                     74:   (do ((ii files (cdr ii)))
                     75:       ((null ii))
                     76:       ; open up xref file 
                     77:       (setq fname (nreverse (explodec (car ii))))
                     78:       (If (and (eq 'l (car fname) (eq '|.| (cadr fname))))
                     79:          then (setq fname (implode (nreverse (cons 'x 
                     80:                                                    (cons '|.| 
                     81:                                                          (cddr fname))))))
                     82:          else (setq fname (car ii)))
                     83:       (If (and (not (portp (setq p (car (errset (infile fname) nil)))))
                     84:               (not (portp (setq p (car (errset (infile (concat fname ".x"))))))))
                     85:          then (patom "Couldn't open ")
                     86:               (patom (car ii))
                     87:               (terpr)
                     88:               (go bottom))
                     89: 
                     90:       ; first record should be (File filename)
                     91:       (setq filenm (car (errset (read p))))
                     92: 
                     93:       (If (and (dtpr filenm) (eq 'File (car filenm)))
                     94:          then (setq filenm (cadr filenm))
                     95:          else (patom "File ")
                     96:               (patom (car ii))
                     97:               (patom " is not a xref file")
                     98:               (terpr)
                     99:               (close p)
                    100:               (go bottom))
                    101: 
                    102:      ;(patom "Processing ") (patom (car ii)) (terpr) (drain)
                    103: 
                    104:       ; for each function in the file
                    105:       (do ((jj (read p) (read p)))
                    106:          ((null jj) (close p))
                    107:          (setq caller (car jj))
                    108:          (If (not (get caller i-seen))
                    109:              then (putprop caller t i-seen)
                    110:                   (Push funcs caller)) ; add to global list
                    111:          ; remember home of this function (and allow multiple homes)
                    112:          (putprop caller (cons filenm (get caller i-home)) i-home)
                    113: 
                    114:          ; remember type of this function (and allow multiple types)
                    115:          (putprop caller (cons (cadr jj) (get caller i-type)) i-type)
                    116: 
                    117:          ; for each function the caller calls
                    118:          (do ((kk (cddr jj) (cdr kk)))
                    119:              ((null kk))
                    120:              (setq callee (car kk))
                    121:              (If (not (get callee i-seen)) then (putprop callee t i-seen)
                    122:                                                (Push funcs callee))
                    123:              (putprop callee 
                    124:                       (cons (cons caller filenm) 
                    125:                             (get callee i-callers)) 
                    126:                       i-callers)))
                    127:       bottom )
                    128: 
                    129:        ; sort alphabetically
                    130:       ; (patom "There are ") (print (length funcs)) (patom " functions ")
                    131:       ; (terpr)
                    132:         (setq funcs (sort funcs 'alphalessp))
                    133:       ;(patom "To sort required ") (print sort-compares) (patom "comparisons")
                    134:       ; (terpr)
                    135: 
                    136:        ; now print out the cross reference
                    137:        (do ((ii funcs (cdr ii)))
                    138:           ((null ii))
                    139:           (setq name (car ii)
                    140:                 home (get name i-home)
                    141:                 type (get name i-type)
                    142:                 callers (get name i-callers))
                    143: 
                    144:           (If (lessp (setq clength (length callers)) ignorelevel) 
                    145:               then (setq callers (sortcar callers 'alphalessp)))
                    146:           (If (null home) 
                    147:               then (setq home (If (getd name) 
                    148:                                   then  (setq type (ncons (typeit (getd name))))
                    149:                                         '(Franz-initial)
                    150:                                   else '(Undefined))))
                    151: 
                    152:           (patom name)
                    153:           (patom "     ")
                    154:           (If (null (cdr type))
                    155:               then (patom (car type))
                    156:                    (patom "    ")
                    157:                    (patom (car home))
                    158:               else (patom "Mult def: ")
                    159:                    (mapcar '(lambda (typ hom)
                    160:                                     (patom typ)
                    161:                                     (patom " in ")
                    162:                                     (patom hom)
                    163:                                     (patom ", "))
                    164:                            type
                    165:                            home))
                    166: 
                    167:           
                    168:           (terpr)
                    169:           (patom "     ")
                    170:           (cond ((null callers)
                    171:                  (patom "*** Unreferenced ***"))
                    172:                 ((not (lessp clength ignorelevel))
                    173:                  (patom "Called by ")
                    174:                  (print clength)
                    175:                  (patom " functions"))
                    176:                 (t (do ((jj callers (cdr jj))
                    177:                         (calle)
                    178:                         (width 8))
                    179:                        ((null jj))
                    180:                        ; only print name if in same file
                    181:                        (setq calle (caar jj))
                    182:                        (cond ((memq (cdar jj) home)
                    183:                               (terprchk (+ (flatc calle) 2))
                    184:                               (patom calle))
                    185:                              (t (terprchk (+ (flatc calle) 6 (flatc (cdar jj))))
                    186:                                 (patom calle)
                    187:                                 (patom " in ")
                    188:                                 (patom (cdar jj))))
                    189:                        (If (cdr jj) then (patom ", ")))))
                    190:           (terpr)
                    191:           (terpr)
                    192:        botloop )
                    193: (return 0)))
                    194: 
                    195: 
                    196: (defun terprchk (wid)
                    197:   (cond ((> (setq width (+ wid width)) 80.) 
                    198:         (terpr)
                    199:         (patom "       ")
                    200:         (setq width (+ 8 wid)))))
                    201: 
                    202: ; determine type of function
                    203: (defun typeit (fcn)
                    204:   (cond ((bcdp fcn) (getdisc fcn))
                    205:        ((dtpr fcn) (car fcn))))
                    206: 
                    207: 
                    208: ; set up read table to be the same as when liszt wrote the file
                    209: (setq readtable (makereadtable t))     ; readtable same as original

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.