aboutsummaryrefslogtreecommitdiffhomepage
path: root/function.c
diff options
context:
space:
mode:
authorGravatar axel <axel@liljencrantz.se>2005-09-20 23:26:39 +1000
committerGravatar axel <axel@liljencrantz.se>2005-09-20 23:26:39 +1000
commit149594f974350bb364a76c73b91b1d5ffddaa1fa (patch)
tree95650e9982d5fabe4bd805d94c5d700cbbc1ca7f /function.c
Initial revision
darcs-hash:20050920132639-ac50b-fa3b476891e1f5f67207cf4cc7bf623834cc5edc.gz
Diffstat (limited to 'function.c')
-rw-r--r--function.c144
1 files changed, 144 insertions, 0 deletions
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 <stdlib.h>
+#include <stdio.h>
+#include <wchar.h>
+#include <unistd.h>
+#include <termios.h>
+#include <signal.h>
+
+
+#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 );
+
+}