_FIND THAT FUNCTION -- FROM INSIDE BRIEF!_
by Marvin Hymowech

[LISTING 1]

;**   getf - Copyright 1988 by Marvin Hymowech.
;**        - Prompts for a function name, extracts the name of the file
;**        - in which it is defined from "funcs.txt" (see bldfuncs.c)
;**        - and presents the file in the current window.
;**        - Returns: 0 if error, else 1.

#define NON_SYSTEM 0

( macro getf
   (
      ( int start_buf_id func_buf_id )
      ( string fn_name line file_name )

         ;** make fn_name a global so that it will retain its prior
         ;** value for the default display in the get_parm below
      ( global fn_name )   

      
         ;** get desired function name from user
      ( if
         ( ( !
            ( get_parm NULL fn_name "Enter function name: " NULL fn_name ) )
         )
         (return 0)
      )

         ;** verify that funcs.txt exists on disk in the current directory
      ( if ( ! ( exist "funcs.txt" ) )
         (
            ( beep )
            ( error "file funcs.txt not found" )
            ( return 0 )
         )
      )

         ;** save current buf id, so we can restore it if an error occurs
      ( = start_buf_id ( inq_buffer ) )

         ;** create a buffer for funcs.txt without attaching it to a window
      ( if
         ( ! ( = func_buf_id
               ( create_buffer "functions" "funcs.txt" NON_SYSTEM )
            )
         )
         (
            ( beep )
            ( error "Can't load funcs.txt file." )
            ( return 0 )
         )
      )

         ;** make it the current buffer
      ( set_buffer func_buf_id )

         ;** Brief back-end buffer functions won't set tabs for us 
         ;** like edit_file, so we do it explicitly 
      ( tabs 9 17 )

      ( top_of_buffer )

         ;** search for the function name
      ( while 1
         (     
               ;** break if function name not found
            ( if ( <= ( search_fwd fn_name ) 0 )   
               (
                  ( beep )
                  ( error "function %s not found" fn_name )
                     ;** restore the original buffer
                  ( set_buffer start_buf_id )
                  ( return 0 )
               )
            )
               ;** get the current line into variable "line"
            ( beginning_of_line )
            ( sprintf line "%s" ( read ) )

               ;** if fn line, not file line
            ( if ( == ( index line "\t" ) 1 )         
               (
                     ;** read the line into "line" starting after the tab
                  ( next_char )
                  ( sprintf line "%s" ( read ) )      

                     ;** make sure we have the exact function name, not
                     ;** part of a larger function name

                     ;** if the line consists of \t,fn_name, and \n,
                     ;**    then break
                  ( if ( == ( index line "\n" ) ( + 1 ( strlen fn_name) ) )
                     ( break )
                  )

                     ;** if the line consists of \t,fn_name, ;, and \n
                     ;**    then break
                  ( if ( == ( index line ";" ) ( + 1 ( strlen fn_name ) ) )
                     ( break )
                  )
               )
            )
            ( end_of_line )               ;** else try next line           
         )
      )
      
      ( if ( <= ( search_back ":" ) 0 )   ;** done, get the file name
         (
            ( beep )
            ( error "funcs.txt corrupted" )
            ( set_buffer start_buf_id )
            ( return 0 )
         )
      )

      ( beginning_of_line )
      ( sprintf line "%s" ( read ) )
      ( sprintf file_name "%s"            ;** get rid of trailing ":"
         ( substr line 1 ( - (index line ":" ) 1 ) ) )

          ;** verify that the file exists on disk
      ( if ( ! ( exist file_name ) ) 
         (
            ( beep )
            ( error "file %s not found" file_name )
            ( set_buffer start_buf_id )
            ( return 0 )
         )
      )

         ;** and edit it
      ( edit_file file_name )
         ;** try to place cursor on the function defn
      ( return ( funcsrch fn_name ) )
   )
)

;** funcsrch - Copyright 1988 by Marvin Hymowech.
;**          - Searches the current buffer for a string (function name)
;**          - by starting from the end of the buffer.
;**          - This is designed to position the cursor on
;**          - a function definition since most functions tend to be
;**          - used before they are defined.
;**          - Returns: 0 if function not found, 1 if found.
(macro funcsrch
   (
      ( string s )
      ( extern _s_pat _dir center_line )

      ( get_parm 0 s )
      ( message "locating function %s..." s )
      ( end_of_buffer )
      ( if ( > (search_back s) 0 )
         (
            ( message "function %s found" s )
            ( center_line )
            ( sprintf _s_pat "%s" s )
            ( = _dir 0 )
            ( return 1 )
         )
      ;else
         (
            ( top_of_buffer )
            ( beep )
            ( error "function %s not found" s )
            ( return 0 )
         )
      )
   )
)


