diff options
Diffstat (limited to 'function.c')
-rw-r--r-- | function.c | 62 |
1 files changed, 51 insertions, 11 deletions
@@ -19,6 +19,7 @@ #include "event.h" #include "reader.h" #include "parse_util.h" +#include "env.h" /** @@ -33,6 +34,7 @@ typedef struct const wchar_t *definition_file; int definition_offset; int is_binding; + int is_autoload; } function_data_t; @@ -40,6 +42,31 @@ typedef struct Table containing all functions */ static hash_table_t function; +static int is_autoload = 0; + + +static int load( const wchar_t *name ) +{ + int was_autoload = is_autoload; + int res; + function_data_t *data; + data = (function_data_t *)hash_get( &function, name ); + if( data && !data->is_autoload ) + return 0; + + is_autoload = 1; + res = parse_util_load( name, + env_get( L"fish_function_path" ), + &function_remove, + 1 ); + is_autoload = was_autoload; + return res; +} + +static void load_all() +{ +} + /** Free all contents of an entry to the function hash table @@ -92,7 +119,8 @@ void function_add( const wchar_t *name, d->desc = desc?wcsdup( desc ):0; d->is_binding = is_binding; d->definition_file = intern(reader_current_filename()); - + d->is_autoload = is_autoload; + hash_put( &function, intern(name), d ); for( i=0; i<al_get_count( events ); i++ ) @@ -104,6 +132,11 @@ void function_add( const wchar_t *name, int function_exists( const wchar_t *cmd ) { + function_data_t *data; + if( parser_is_reserved(cmd) ) + return 0; + + load( cmd ); return (hash_get(&function, cmd) != 0 ); } @@ -130,8 +163,9 @@ void function_remove( const wchar_t *name ) const wchar_t *function_get_definition( const wchar_t *argv ) { - function_data_t *data = - (function_data_t *)hash_get( &function, argv ); + function_data_t *data; + load( argv ); + data = (function_data_t *)hash_get( &function, argv ); if( data == 0 ) return 0; return data->cmd; @@ -139,8 +173,9 @@ const wchar_t *function_get_definition( const wchar_t *argv ) const wchar_t *function_get_desc( const wchar_t *argv ) { - function_data_t *data = - (function_data_t *)hash_get( &function, argv ); + function_data_t *data; + load( argv ); + data = (function_data_t *)hash_get( &function, argv ); if( data == 0 ) return 0; @@ -149,8 +184,9 @@ const wchar_t *function_get_desc( const wchar_t *argv ) void function_set_desc( const wchar_t *name, const wchar_t *desc ) { - function_data_t *data = - (function_data_t *)hash_get( &function, name ); + function_data_t *data; + load( name ); + data = (function_data_t *)hash_get( &function, name ); if( data == 0 ) return; @@ -173,6 +209,8 @@ static void get_names_internal( const void *key, void function_get_names( array_list_t *list, int get_hidden ) { + load_all(); + if( get_hidden ) hash_get_keys( &function, list ); else @@ -182,8 +220,9 @@ void function_get_names( array_list_t *list, int get_hidden ) const wchar_t *function_get_definition_file( const wchar_t *argv ) { - function_data_t *data = - (function_data_t *)hash_get( &function, argv ); + function_data_t *data; + load( argv ); + data = (function_data_t *)hash_get( &function, argv ); if( data == 0 ) return 0; @@ -193,8 +232,9 @@ const wchar_t *function_get_definition_file( const wchar_t *argv ) int function_get_definition_offset( const wchar_t *argv ) { - function_data_t *data = - (function_data_t *)hash_get( &function, argv ); + function_data_t *data; + load( argv ); + data = (function_data_t *)hash_get( &function, argv ); if( data == 0 ) return -1; |