2012-11-18 11:23:22 +01:00
/** \file function.h
2005-09-20 23:26:39 +10:00
Prototypes for functions for storing and retrieving function
2012-11-18 11:23:22 +01:00
information . These functions also take care of autoloading
functions in the $ fish_function_path . Actual function evaluation
is taken care of by the parser and to some degree the builtin
handling library .
2005-09-20 23:26:39 +10:00
*/
2005-10-05 01:11:39 +10:00
# ifndef FISH_FUNCTION_H
# define FISH_FUNCTION_H
# include <wchar.h>
# include "util.h"
2012-01-13 23:44:18 -08:00
# include "common.h"
2012-02-08 02:34:31 -08:00
# include "event.h"
2005-10-05 01:11:39 +10:00
2012-01-16 12:10:08 -08:00
class parser_t ;
2012-07-20 20:39:31 -07:00
class env_vars_snapshot_t ;
2012-01-16 12:10:08 -08:00
2007-04-23 08:10:33 +10:00
/**
2008-01-16 11:06:01 +10:00
Structure describing a function . This is used by the parser to
store data on a function while parsing it . It is not used
internally to store functions , the function_internal_data_t
structure is used for that purpose . Parhaps these two should be
merged .
*/
2012-02-08 02:34:31 -08:00
struct function_data_t
2007-04-23 08:10:33 +10:00
{
2012-11-18 16:30:30 -08:00
/**
Name of function
*/
wcstring name ;
/**
Description of function
*/
wcstring description ;
/**
Function definition
*/
wchar_t * definition ;
/**
List of all event handlers for this function
*/
std : : vector < event_t > events ;
/**
List of all named arguments for this function
*/
wcstring_list_t named_arguments ;
/**
Set to non - zero if invoking this function shadows the variables
of the underlying function .
*/
int shadows ;
2012-02-08 02:34:31 -08:00
} ;
2012-01-23 20:32:36 -08:00
2012-11-18 16:30:30 -08:00
class function_info_t
{
2012-01-23 20:32:36 -08:00
public :
2012-03-03 15:20:30 -08:00
/** Constructs relevant information from the function_data */
function_info_t ( const function_data_t & data , const wchar_t * filename , int def_offset , bool autoload ) ;
2012-11-18 11:23:22 +01:00
2012-03-03 15:20:30 -08:00
/** Used by function_copy */
function_info_t ( const function_info_t & data , const wchar_t * filename , int def_offset , bool autoload ) ;
2012-01-23 20:32:36 -08:00
/** Function definition */
2012-03-03 15:20:30 -08:00
const wcstring definition ;
2012-11-18 11:23:22 +01:00
2012-03-03 15:20:30 -08:00
/** Function description. Only the description may be changed after the function is created. */
2012-01-23 20:32:36 -08:00
wcstring description ;
2012-11-18 11:23:22 +01:00
2012-11-18 16:30:30 -08:00
/** File where this function was defined (intern'd string) */
2012-03-03 15:20:30 -08:00
const wchar_t * const definition_file ;
2012-11-18 11:23:22 +01:00
2012-11-18 16:30:30 -08:00
/** Line where definition started */
const int definition_offset ;
2012-11-18 11:23:22 +01:00
2012-11-18 16:30:30 -08:00
/** List of all named arguments for this function */
2012-03-03 15:20:30 -08:00
const wcstring_list_t named_arguments ;
2012-11-18 11:23:22 +01:00
2012-11-18 16:30:30 -08:00
/** Flag for specifying that this function was automatically loaded */
2012-03-03 15:20:30 -08:00
const bool is_autoload ;
2012-11-18 11:23:22 +01:00
2012-11-18 16:30:30 -08:00
/** Set to true if invoking this function shadows the variables of the underlying function. */
const bool shadows ;
2012-01-23 20:32:36 -08:00
} ;
2007-04-23 08:10:33 +10:00
2005-09-20 23:26:39 +10:00
/**
2012-11-18 11:23:22 +01:00
Initialize function data
2005-09-20 23:26:39 +10:00
*/
void function_init ( ) ;
2006-11-16 00:16:49 +10:00
2012-03-03 15:20:30 -08:00
/** Add a function. */
2012-11-18 16:30:30 -08:00
void function_add ( const function_data_t & data , const parser_t & parser ) ;
2005-09-20 23:26:39 +10:00
/**
Remove the function with the specified name .
*/
2012-11-18 16:30:30 -08:00
void function_remove ( const wcstring & name ) ;
2005-09-20 23:26:39 +10:00
2012-01-23 20:32:36 -08:00
/**
2012-05-17 19:37:46 -07:00
Returns by reference the definition of the function with the name \ c name .
Returns true if successful , false if no function with the given name exists .
2012-01-23 20:32:36 -08:00
*/
2012-11-18 16:30:30 -08:00
bool function_get_definition ( const wcstring & name , wcstring * out_definition ) ;
2005-09-20 23:26:39 +10:00
/**
2012-05-17 19:46:08 -07:00
Returns by reference the description of the function with the name \ c name .
Returns true if the function exists and has a nonempty description , false if it does not .
2005-09-20 23:26:39 +10:00
*/
2012-11-18 16:30:30 -08:00
bool function_get_desc ( const wcstring & name , wcstring * out_desc ) ;
2005-09-20 23:26:39 +10:00
/**
Sets the description of the function with the name \ c name .
*/
2012-11-18 16:30:30 -08:00
void function_set_desc ( const wcstring & name , const wcstring & desc ) ;
2005-09-20 23:26:39 +10:00
/**
2006-11-16 00:16:49 +10:00
Returns true if the function with the name name exists .
2005-09-20 23:26:39 +10:00
*/
2012-11-18 16:30:30 -08:00
int function_exists ( const wcstring & name ) ;
2005-09-20 23:26:39 +10:00
2011-12-26 19:18:46 -08:00
/**
Returns true if the function with the name name exists , without triggering autoload .
*/
2012-11-18 16:30:30 -08:00
int function_exists_no_autoload ( const wcstring & name , const env_vars_snapshot_t & vars ) ;
2011-12-26 19:18:46 -08:00
2005-09-20 23:26:39 +10:00
/**
2012-01-13 23:44:18 -08:00
Returns all function names .
2012-11-18 11:23:22 +01:00
2005-09-20 23:26:39 +10:00
\ param get_hidden whether to include hidden functions , i . e . ones starting with an underscore
*/
2012-11-18 16:30:30 -08:00
wcstring_list_t function_get_names ( int get_hidden ) ;
2005-09-20 23:26:39 +10:00
2006-02-09 03:37:18 +10:00
/**
Returns tha absolute path of the file where the specified function
was defined . Returns 0 if the file was defined on the commandline .
2006-11-16 00:16:49 +10:00
This function does not autoload functions , it will only work on
functions that have already been defined .
2012-11-18 11:23:22 +01:00
2012-05-17 19:46:08 -07:00
This returns an intern ' d string .
2006-02-09 03:37:18 +10:00
*/
2012-11-18 16:30:30 -08:00
const wchar_t * function_get_definition_file ( const wcstring & name ) ;
2006-01-27 00:48:10 +10:00
2006-02-09 03:37:18 +10:00
/**
2006-11-16 00:16:49 +10:00
Returns the linenumber where the definition of the specified
function started .
This function does not autoload functions , it will only work on
functions that have already been defined .
2006-02-09 03:37:18 +10:00
*/
2012-11-18 16:30:30 -08:00
int function_get_definition_offset ( const wcstring & name ) ;
2006-01-27 00:48:10 +10:00
2007-04-17 06:06:11 +10:00
/**
Returns a list of all named arguments of the specified function .
*/
2012-11-18 16:30:30 -08:00
wcstring_list_t function_get_named_arguments ( const wcstring & name ) ;
2007-04-17 06:06:11 +10:00
2010-09-08 03:31:05 +10:00
/**
Creates a new function using the same definition as the specified function .
2012-03-03 15:20:30 -08:00
Returns true if copy is successful .
2010-09-08 03:31:05 +10:00
*/
2012-11-18 16:30:30 -08:00
bool function_copy ( const wcstring & name , const wcstring & new_name ) ;
2010-09-08 03:31:05 +10:00
2011-12-26 19:18:46 -08:00
/**
Returns whether this function shadows variables of the underlying function
*/
2012-11-18 16:30:30 -08:00
int function_get_shadows ( const wcstring & name ) ;
2011-12-26 19:18:46 -08:00
2005-10-05 01:11:39 +10:00
# endif