home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 September
/
Simtel20_Sept92.cdr
/
msdos
/
ddjmag
/
ddj8812.arc
/
FUNC.ASC
< prev
next >
Wrap
Text File
|
1988-12-31
|
5KB
|
176 lines
_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 )
)
)
)
)