home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / forth / compiler / fpc / source / look.seq < prev    next >
Text File  |  1991-01-29  |  14KB  |  316 lines

  1. \\ LOOK.SEQ      Target compilable string search across many files
  2.  
  3. ***************************************************************************
  4.                             Advertisement
  5. ***************************************************************************
  6.  
  7.   LOOK was written in Forth, and compiled using the TCOM optimizing compiler
  8. on the F-PC Forth system. LOOK is public domain, as is F-PC, and TCOM. To
  9. obtain the latest version of F-PC, and TCOM send $60.00 to this address:
  10.  
  11.                        Tom Zimmer
  12.                        292 Falcato Drive
  13.                        Milpitas, Ca. 95035
  14.  
  15.                                Home (408) 263-8859
  16.                                Work (408) 432-4643
  17.  
  18.   F-PC and TCOM are shipped on two 1.2 meg "AT" 5 1/4 inch floppy disks. If
  19. you need another format, be sure to specify the format and include $5.00
  20. for additional handling.
  21.  
  22. ***************************************************************************
  23.                       LOOK Description & Usage
  24. ***************************************************************************
  25.  
  26.   Here is a handy utility to search for a string in one or more files
  27. on your disk. It is used as follows:
  28.  
  29.                 LOOK <string> <file_specs> <enter>
  30.  
  31.                 LOOK "<string with spaces>" <file_specs> <enter>
  32.  
  33.   The string is space or quote delimited, and the file specs are space
  34. delimited. Multiple file specs can be included on the same line.
  35.  
  36.   You can also type in LOOK alone, and you will be prompted for the
  37. search string and file specs.
  38.  
  39.                 LOOK <enter>
  40.                 String to LOOK for     -><string with spaces> <enter>
  41.                 File spec(s) to search -><file_specs> <enter>
  42.  
  43.   The search will proceed, processing progresses at about 40,000 bytes
  44. per second on a 6 mhz PC-AT clone.
  45.  
  46.   Each file processed will cause a partial rotation of the "spinner"
  47. (see the spinner definition) to be displayed on the screen. When the
  48. search string is found, the filename is displayed, followed by the line
  49. number of the found line, and the lines contents up to 74 characters on
  50. the line. The filename is only displayed the first time a string is
  51. found.
  52.  
  53.   The LOOKing process can be paused by pressing the space bar, and can
  54. be terminated with ESC.
  55.  
  56.   DOS I/O re-direction is allowed, so the following:
  57.  
  58.                 LOOK ZIMMER *.SEQ >ZFOUND.LST <enter>
  59.  
  60.                                 or
  61.  
  62.                 LOOK "TOM ZIMMER" *.SEQ >ZFOUND.LST <enter>
  63.  
  64.   This will build a file containing all occurances of "TOM ZIMMER"
  65. found in the *.SEQ files of the current directory into a file called
  66. ZFOUND.LST.
  67.  
  68.   Only the first 700 files in a directory will be searched, although
  69. you can change the constant MAXFILES and recompile LOOK to increase of
  70. decrease this limit.
  71.  
  72.   Users of Forth BLOCK file systems may find LOOK useful in scanning
  73. their source files for text strings. LOOK will detect a file that
  74. doesn't contain CRLF delimited lines, and automatically break the file
  75. search into 64 character lines. This make reading the output of a scan
  76. through .BLK or .SCR files much more readable.
  77.  
  78.  
  79. ***************************************************************************
  80.                           Compiling LOOK
  81. ***************************************************************************
  82.  
  83.   If you have a recent version (1.14 of higher) of TCOM, you can
  84. re-compile this source file into LOOK.COM with the following DOS
  85. commandline:
  86.  
  87.         TCOM LOOK /OPT /NOINIT  enter
  88.  
  89.  
  90. ***************************************************************************
  91.                          Program Code Begins
  92. ***************************************************************************
  93.  
  94. {
  95.  
  96. fload allspecs.seq
  97.  
  98.    700 constant maxfiles        \ only hold upto 700 filenames in list
  99.                                 \ from any given directory.
  100.     40 constant lookmax         \ longest string we will search for
  101.  
  102.         2variable bytes_srch    \ accumulator for number of bytes searched
  103.           0 value files_srch    \ accumulator for number of files searched
  104.           0 value occur_srch    \ accumulator for occurances found
  105.           0 value ?global       \ search ALL directories flag
  106.          variable fstime        \ first time found flag, used in each file
  107.          variable do_prompt     \ flag, is a prompt needed
  108.         128 array spec_buf      \ a place to hold the file specs
  109.  lookmax 1+ array slook.buf     \ and a place to hold the search string
  110.  
  111. : .file-once    ( --- )         \ display filename first time text found
  112.                 fstime @ 0=
  113.                 if      cr .lrhndl fstime on
  114.                 then    ;
  115.  
  116. : .outbuf       ( -- )          \ display the readline buffer
  117.                 outbuf count bounds
  118.                 do      i c@ $20 < if $20 i c! then \ filter out ctrl chars
  119.                 loop
  120.                 outbuf count 2- 73 min 0max type ;  \ display line
  121.  
  122. 0 value spinval
  123.  
  124. : spinner       ( -- )          \ video spinner, doesn't effect cursor
  125.                                 \ positon or I/O redirection. It is however
  126.                                 \ VERY HARDWARE SPECIFIC TO IBM'S & CLONES
  127.                 " |/-\" drop spinval 3 and + c@
  128.                 video-seg @ at? 24 min 160 * swap 2* + c!L
  129.                 incr> spinval ;
  130.  
  131. : searchfile    ( --- )         \ search current file for specified string
  132.                 IBRESET                 \ reset lineread operatons
  133.                 fstime off              \ mark file as nothing found yet
  134.                 spinner                 \ notify user we are searching 1 more
  135.                 begin   lineread c@ dup 132 >
  136.                         if      64 outbuf c! dup 64 -
  137.                                 dup negate instart +! inlength +!
  138.                         then
  139.                 while   slook.buf count outbuf count search nip
  140.                         if      space .file-once
  141.                                 cr loadline @ 4 .r space
  142.                                 .outbuf
  143.                                 incr> occur_srch
  144.                                 ?keypause
  145.                         then
  146.                 repeat  fstime @ if cr then ;
  147.  
  148. : do_1file      ( n1 -- )       \ open search and close one file
  149.                 dup >fadr 1+ c@l '.' =
  150.                 if      drop exit
  151.                 then    >fadr dir>pad >r
  152.                 spec_buf lrhndl $>handle
  153.                 lrhndl >pathend
  154.                 dup lrhndl 1+ - r@ + lrhndl c! r> cmove
  155.                 lrhndl  count + off
  156.                 lrhndl hopen 0=
  157.                 if      searchfile
  158.                         lrhndl endfile bytes_srch D+!
  159.                         incr> files_srch
  160.                 then
  161.                 lrhndl hclose drop           \ close the file
  162.                 lrhndl clr-hcb ;             \ clear the handle
  163.  
  164. : $do_1spec     ( a1 | -- )             \ do all files in a filespec
  165.                 count spec_buf place    \ put in spec buffer
  166.                 spec_buf $getdir                \ read the directory files.
  167.                 #fls 0
  168.                 ?do     i do_1file
  169.                         ?keypause
  170.                 loop    ;
  171.  
  172. : pad+\spec     ( -- )
  173.                 pad count + 1- c@ '\' <>
  174.                 if      " \" pad +place
  175.                 then    bl word count over c@ '\' =
  176.                 if      1 /string
  177.                 then    pad +place ;
  178.  
  179. : $do_1set      ( a1 -- )
  180.                 >in @ >r
  181.                 begin   >in @ #tib @ <
  182.                 while   dup count pad place pad+\spec
  183.                         pad $do_1spec
  184.                 repeat  drop r> >in ! ;
  185.  
  186. : searchallof   ( | file_specs --- )    \ Do search all matching file_specs.
  187.                 0 0  bytes_srch 2!
  188.                 0 =: files_srch
  189.                 dirseg 0= if #tib @ >in ! exit then
  190.                 ?global
  191.                 if      getdirs
  192.                         begin   nextdir
  193.                                 dup c@
  194.                         while   $do_1set
  195.                         repeat  drop
  196.                 else    begin   >in @ #tib @ <
  197.                         while   bl word $do_1spec
  198.                         repeat
  199.                 then    cr ;
  200.  
  201. : ?in-empty     ( --- f1 )      \ is anything left in input stream?
  202.                 >in @ bl word c@ 0= swap >in ! ;
  203.  
  204. : ?esc_bye      ( -- )          \ leave if user pressed ESC
  205.                 esc_flg @ if ABORT then ;
  206.  
  207. : get-filespecs ( --- )         \ get one or more file specifications
  208.                 ?in-empty       \ if nothing following command
  209.                 if      do_prompt @
  210.                         if      ." File spec(s) to search  [*.*]  ->"
  211.                                 query cr
  212.                                 ?esc_bye
  213.                         then
  214.                         ?in-empty                   \ if nothing following
  215.                         if      " *.*" ">$ $>tib    \ default to "*.*",
  216.                         then                        \ ALL files
  217.                 then    ." in "
  218.                 tib #tib @ >in @ /string type space ;
  219.  
  220. : get-global    ( -- )
  221.                 >in @ bl word 1+ " -g" caps-comp
  222.                 if      >in !   exit
  223.                 then    drop
  224.                 on> ?global
  225.                 here count 2 /string dup
  226.                 if      2dup startdir place
  227.                 else    " \" startdir place
  228.                 then    2drop
  229.                 ." In " startdir count type ."  and lower directories, in "
  230.                 ?in-empty                   \ if nothing following
  231.                 if      " *.*" ">$ $>tib    \ default to "*.*",
  232.                 then                        \ ALL files
  233.                 >in @
  234.                 begin   bl word dup c@
  235.                 while   count type space
  236.                 repeat  drop >in ! ;
  237.  
  238. : get-1word     ( -- a1 )
  239.                 tib #tib @ >in @ /string tuck bl skip nip - >in +!
  240.                                 \ skip leading blanks before first word
  241.                 tib >in @ + c@  \ get delimiter character
  242.                 dup '0' '9' between over upc    \ numeric or
  243.                 'A' 'Z' between or              \ alphabetic, then
  244.                 if      drop            \ discard,
  245.                         >in decr        \ backup and
  246.                         $20 word        \ use blank for delimiter
  247.                 else                    \ if non alphabetic, then
  248.                         >in incr        \ bump past the delimiter
  249.                         word            \ get delimited string
  250.                         >in incr
  251.                 then    ;
  252.  
  253. : get-string    ( | string -- )         \ get the search string
  254.                 do_prompt off
  255.                 ?in-empty               \ if nothing following command
  256.                 if      ." String to LOOK for (no quotes) ->" query cr
  257.                         ?esc_bye
  258.                         do_prompt on
  259.                         0  word
  260.                 else    get-1word
  261.                 then    count lookmax min slook.buf place
  262.                 ." Looking for " '"' emit slook.buf count type '"' emit
  263.                 space
  264.                 slook.buf c@ 0=
  265.                 if      ."  No search string specified"
  266.                         ABORT
  267.                 then    ;
  268.  
  269. : .info         ( -- )
  270.         ." Tom's LOOKup utility V1.05 06/30/90 ESC=cancel,  SPACE=pause"
  271.                 cr 8 spaces
  272.                 ." LOOK "  '"' emit
  273.                 ." string" '"' emit ."  file_spec(s) <Enter>"
  274.                 cr ."      or "
  275.                 ." LOOK "  '"' emit
  276.                 ." string" '"' emit ."  -g<starting_dir> file_spec(s) <Enter>"
  277.                 cr
  278.         ."  (use -g for a global search all directories below <starting_dir>)"
  279.                 cr      ;
  280.  
  281. : flook         ( search_string file_specs --- ) \ Search files for string
  282.                 DECIMAL                 \ always select decimal
  283.                 CAPS ON                 \ ignore cAsE
  284.                 ?DS: SSEG !             \ init search segment
  285.                 DOSIO_INIT              \ init EMIT, TYPE & SPACES
  286.                 $FFF0 SET_MEMORY        \ default to 64k code space
  287.                 DOS_TO_TIB              \ move command tail to TIB
  288.                 ?in-empty               \ if nothing following command
  289.                 if      .info
  290.                 then
  291.                 maxfiles =: maxdir      \ up to "maxfiles" directory entries
  292.                 dirinit                 \ initialize directory words
  293.                 diralloc                \ allocate directory name space
  294.                 20000 =: iblen          \ make read buffer larger
  295.                 lineread_init           \ initialize fast file reader
  296.                 off> occur_srch         \ reset the occurance counter
  297.                 ?vmode 7 =              \ setup for MONOCHROME or COLOR
  298.                 if      $B000
  299.                 else    $B800
  300.                 then    video-seg !
  301.                 get-string              \ get search text
  302.                 get-global              \ search all directories?
  303.                 ?global 0=
  304.                 if      get-filespecs   \ get the file specifications
  305.                 then
  306.                 searchallof             \ search everything
  307.                                         \ then report summary of search
  308.                 cr files_srch .     ." Files searched, "
  309.                    bytes_srch 2@ d. ." Total bytes searched, "
  310.                    occur_srch u.    ." Occurances found."
  311.                 cr
  312.                 dirrelease ;            \ release directory name space
  313.  
  314. }
  315.  
  316.