aboutsummaryrefslogtreecommitdiffhomepage
path: root/function.c
diff options
context:
space:
mode:
Diffstat (limited to 'function.c')
-rw-r--r--function.c62
1 files changed, 51 insertions, 11 deletions
diff --git a/function.c b/function.c
index 260df870..47633026 100644
--- a/function.c
+++ b/function.c
@@ -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;