[gforth] / gforth / locate.fs  

gforth: gforth/locate.fs


1 : pazsan 1.1 \ locate, using the TAGS file
2 :    
3 :     require string.fs
4 :    
5 :     Variable last-file
6 :     Variable line-buf
7 :    
8 :     \ example: invoke vi
9 :    
10 :     Defer do-location
11 :    
12 :     Variable sys-buf
13 :     : invoke-vi ( filename u line -- ) base @ >r decimal
14 :     s" vi " sys-buf $!
15 :     0 <# bl hold #S '+ hold #> sys-buf $+!
16 :     sys-buf $+!
17 :     r> base ! sys-buf $@ system ;
18 :     ' invoke-vi IS do-location
19 :    
20 :     \ scan file
21 :    
22 :     : tag-line ( fid -- flag ) >r
23 :     s" " line-buf $!
24 :     $100 line-buf $!len
25 :     line-buf $@ r> read-line throw
26 :     swap line-buf $!len ;
27 :     : check-word ( addr u -- addr u flag )
28 :     line-buf $@ #del $split 2nip ctrl A $split 2drop
29 :     2swap search nip nip ;
30 :     : get-file ( fid -- )
31 :     tag-line drop line-buf $@ ', $split 2drop last-file $! ;
32 :     : print-location ( -- ) base @ >r decimal
33 :     last-file $@ line-buf $@ ctrl A $split 2nip ', $split 2drop
34 :     0. 2swap >number 2drop drop r> base !
35 :     do-location ;
36 :     : locate ( "name" -- ) s" " last-file $! bl sword
37 :     s" TAGS" r/o open-file throw >r
38 :     BEGIN r@ tag-line WHILE
39 :     s" " line-buf $@ compare 0=
40 :     IF r@ get-file
41 :     ELSE 2dup check-word
42 :     IF print-location 2drop r> close-file throw EXIT THEN
43 :     THEN
44 :     REPEAT r> close-file throw 2drop true abort" tag not found" ;

CVS Admin

Powered by ViewCVS 1.0-dev
(Powered by ViewCVS)

ViewCVS and CVS Help