From 149594f974350bb364a76c73b91b1d5ffddaa1fa Mon Sep 17 00:00:00 2001 From: axel Date: Tue, 20 Sep 2005 23:26:39 +1000 Subject: Initial revision darcs-hash:20050920132639-ac50b-fa3b476891e1f5f67207cf4cc7bf623834cc5edc.gz --- function.c | 144 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 function.c (limited to 'function.c') diff --git a/function.c b/function.c new file mode 100644 index 00000000..385c8c89 --- /dev/null +++ b/function.c @@ -0,0 +1,144 @@ +/** \file function.c + Functions for storing and retrieving function information. +*/ +#include +#include +#include +#include +#include +#include + + +#include "config.h" +#include "util.h" +#include "function.h" +#include "proc.h" +#include "parser.h" +#include "common.h" +#include "intern.h" + +/** + Table containing all functions +*/ +static hash_table_t function; + +/** + Struct describing a function +*/ +typedef struct +{ + /** Function definition */ + wchar_t *cmd; + /** Function description */ + wchar_t *desc; +} +function_data_t; + +/** + Free all contents of an entry to the function hash table +*/ +static void clear_function_entry( const void *key, + const void *data ) +{ + function_data_t *d = (function_data_t *)data; + free( (void *)d->cmd ); + free( (void *)d->desc ); + free( (void *)d ); +} + +void function_init() +{ + hash_init( &function, + &hash_wcs_func, + &hash_wcs_cmp ); +} + +void function_destroy() +{ + hash_foreach( &function, &clear_function_entry ); + hash_destroy( &function ); +} + +void function_add( const wchar_t *name, + const wchar_t *val, + const wchar_t *desc ) +{ + if( function_exists( name ) ) + function_remove( name ); + + function_data_t *d = malloc( sizeof( function_data_t ) ); + d->cmd = wcsdup( val ); + d->desc = desc?wcsdup( desc ):0; + hash_put( &function, intern(name), d ); +} + +int function_exists( const wchar_t *cmd ) +{ + return (hash_get(&function, cmd) != 0 ); +} + +void function_remove( const wchar_t *name ) +{ + void *key; + function_data_t *d; + + hash_remove( &function, + name, + (const void **) &key, + (const void **)&d ); + + if( !d ) + return; + + clear_function_entry( key, d ); +} + +const wchar_t *function_get_definition( const wchar_t *argv ) +{ + function_data_t *data = + (function_data_t *)hash_get( &function, argv ); + if( data == 0 ) + return 0; + return data->cmd; +} + +const wchar_t *function_get_desc( const wchar_t *argv ) +{ + function_data_t *data = + (function_data_t *)hash_get( &function, argv ); + if( data == 0 ) + return 0; + + return data->desc?data->desc:data->cmd; +} + +void function_set_desc( const wchar_t *name, const wchar_t *desc ) +{ + function_data_t *data = + (function_data_t *)hash_get( &function, name ); + if( data == 0 ) + return; + + data->desc =wcsdup(desc); +} + +/** + Helper function for removing hidden functions +*/ +static void get_names_internal( const void *key, + const void *val, + void *aux ) +{ + wchar_t *name = (wchar_t *)key; + if( name[0] != L'_' ) + al_push( (array_list_t *)aux, name ); +} + +void function_get_names( array_list_t *list, int get_hidden ) +{ + if( get_hidden ) + hash_get_keys( &function, list ); + else + hash_foreach2( &function, &get_names_internal, list ); + +} -- cgit v1.2.3